Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

вторник, 26 сентября 2017 г.

Как собрать altcoin-qt под Windows? Еще раз о компиляции.

Сегодня мы с вами рассмотрим каким образом можно собрать из исходников или проще говоря скомпилировать кошелек (wallet) практически любого AltCoin'а. В предыдущей статье, которая вышла на Яндекс.Дзене - Руководство. Как собрать ccminer из исходников под Windows? я уже рассматривал сборку из исходников, там мы использовали MSVC (Visual Studio 2013) для сборки ccminer. Теперь пришло время рассмотреть как же собрать кошелек для криптовалют под Windows. Почему именно altcoin-qt? Как вы уже поняли - это обобщенное название. Структура большинства монет состоит из нескольких исполняемых файлов - непосредственно демона (altcoind), консольного кошелька или же просто консольного средства управления демоном (altcoin-cli) и кошелька с графическим интерфейсом (altcoin-qt). В частности "комплект" популярного кошелька Bitcoin Core также состоит из этих трех компонентов.

Зачем это может понадобиться, спросите вы. Ведь в большинстве случаев скачать готовую сборку в виде exe'шника можно на официальном сайте проекта или на многочисленных форумах и т.п. Ну во-первых, это более безопасно. Собранный самостоятельно кошелек из скачанных с официального Git репозитория разработчика исходников, как вы понимаете, гораздо безопаснее чем некий exe'шник с непонятного форума, во-вторых - конечно же у любого разработчика есть раздел releases, но, например, релиза собранного релиза со свежими изменениями еще нет, а вам очень хочется получить их. В-третьих, уже собранная релизная версия может не включать в себя каких-то функций, которые есть в dev или night сборках, а здесь вы можете запросто включить их. Ну и в четвертых, сборка из исходников может быть познавательна в образовательных целях, кто знает, может вы всерьез решите заняться программированием и добавите в ПО какую-то существенно полезную функцию, упрощающую его использование. Вообщем вариантов ответа на вопрос "зачем" тут масса. Если вы читаете эту статью - значит вам уже стало интересно.

Сразу скажу, что сборка подобных вещей под Windows занятие не из легких. В мире Linux подобное делается в разы проще, если упрощенно, т.е. не затрагивая установку зависимостей, хотя она тоже делается с помощью нескольких простых команд, для сборки проекта в Linux, как правило, необходимо выполнить всего три простых команды - git clone, ./configure и make. Первая из которых предназначена для клонирования репозитория, т.е. скачивания исходников, вторая и третья для конфигурации и непосредственно сборки. Так что для тех кому по каким-либо причинам придется делать подобные вещи достаточно часто - проще установить Linux (поверьте, это не так сложно и достаточно удобно в целом), если же вы ярый приверженец Windows и эта ваша единственная ОС, тогда читаем дальше.

Говоря о сложностях при сборке под Windows необходимо учитывать, что хотя большинство altcoin'ов представляют собой кроссплатформенное ПО (т.е. теоретически его можно собрать на любой ОС - Linux, Windows, MacOS и т.п.), сделать это под Windows не так просто. И первым камнем преткновения здесь становятся зависимости от библиотек, которые также нужно скачивать отдельно и собирать из исходников. Плюс разнообразие версий компиляторов и отсутствие единых стандартов при конфигурации сборки. В результате чего сборку под Windows можно назвать не совсем тривиальным процессом. А как же разработчики, спросите вы? Неужели они проходят все те же этапы, т.е. для сборки релизной версии своего ПО ставят Windows, собирают под него свой тулчейн (toolchain) и т.п.? В большинстве случаев - нет. В мире Linux опять же все проще, за счет использования такой вещи как кросскомпиляция. Там это удобно. Грубо говоря, поставив соответствующий toolchain для сборки под Windows на Linux платформу, на выходе мы будем получать exe'шники и dll'ки, вместо исполняемых ELF-файлов и .so библиотек. Не все так просто, но в общем случае собрать что-то под Linux'ом (даже предназначающееся для использования в другой ОС) зачастую бывает проще, чем выполнить аналогичную задачу под Windows. Однако, мы ведь не боимся сложностей?


Скажу сразу, что для того чтобы достигнуть того что будет описано в этой статье - у меня ушли примерно сутки рабочего времени (по чуть-чуть, по чуть-чуть, но получилось), т.к. со многими нюансами я и сам был не знаком, а что-то пришлось осваивать прямо на ходу. Ну что ж, начнем готовить нашу сборочную платформу. Вам понадобится Windows 7 и выше, можно x86, можно x64, т.к. собирать мы будем 32-bit'ные сборки. Также вам понадобится умение работать с консолью и несколько утилит, которые я описывал в этой статье. Итак, обязательно ставим:

  1. Архиватор 7-zip или WinRar, если он у вас еще не установлен.
  2. Git for Windows - средство для работы с Git репозиториями.
  3. Far Manager - консольный файловый менеджер.
Ссылки на все это ПО вы можете найти в статье по ссылке выше, также настоятельно рекомендуется прочитать раздел "Курс молодого бойца Far Manager" в ней и попробовать выполнить в Far'е простейшие операции, такие как, смена диска на панели, копирование файлов, создание папок, редактирование файлов и т.п. Сразу учитесь делать это при помощи хоткеев, старайтесь не пользоваться мышкой при совершении этих действий. Это существенно поможет вам сэкономить время в будущем. Также, если вы решили следовать этой инструкции - давайте возьмем за правило, все описанное в ней выполнять обязательно . Т.е. если сказано что нужно взять Far Manager - возьмите Far Manager, даже если вы любите Total Commander. Если сказано, скачать компилятор или toolchain именно такой версии - значит нужно именно такой, не надо брать последнюю версию / самый свежий релиз и т.п. Потому что в результате у вас может ничего не получиться. Не нужно полагаться на собственную "интуицию" и думать в ключе "так тоже заработает, ведь это практически то же самое" - это не всегда верно и поможет вам избежать многих ошибок. Скажем так, перед началом сборки я тоже читал в интернете различные статьи, кстати, вот наиболее полезные из них:


И когда разбирался со всем этим не всегда был внимателен к деталям. В результате куча времени была потрачена на поиск и устранение "детских ошибок", когда, например, весь проект у нас был собран с gcc 4.9.2 (posix) версии, а одна из библиотек случайно (из-за неправильно настроенной переменной окружения PATH) с использованием gcc 6.3.0 (win32), в результате на этапе линковки получались достаточно неинформативные ошибки, выловить которые было достаточно сложно. Имейте ввиду, что система сборки проекта сама по себе достаточно сложная, все просто когда вы компилируете программу состоящую из нескольких десятков или сотен исходных файлов, но когда в дело идет целая система сборки огромного проекта, который использует различные библиотеки, разные части проекта написаны на различных языках и собираются разными компиляторами, причем со своими ключами и т.п., все гораздо сложнее. Ну что ж ... пожалуй начнем. 

Подготовка окружения

К этому моменту я считаю что у вас уже установлено ПО из списка выше и ваша ОС - это Windows 7 и выше. Если у вас на ПК уже были установлены какие-то среды компиляции и т.п. - имейте ввиду, что они могут вызвать неявные ошибки и в этом случае вам придется либо устранить их, либо начать сборку с нуля на свежеустановленной ОС. Чтобы избежать этого лучше всего так и сделать, например, установив такую же копию ОС в бесплатный VirtualBox. Однако, имейте ввиду, что лучше делать все на реальном ПК, потому что так быстрее. Также, желательно чтобы все файлы окружения и исходники ПО размещались на SSD, это может повысить скорость компиляции. 

1. Запускаем Far Manager и создаем в корне диска C:\ папки deps и Qt. В первую мы будем складывать различные зависимости (исходники библиотек), во второй собирать статическую сборку Qt. Все дистрибутивы, да и вообще все что мы скачиваем - будем скачивать в папку deps, т.к. так будет удобнее в будущем. Вся подсистема сборки будет завязаны именно на эти папки, поэтому лучше изначально использовать именно эти пути.

Собирать мы с вами будем кошелек монеты Interzone, вот соответствующая тема на BitcoinTalk. Если в двух словах, то это один из форков Dash'а на алгоритме c11. Но здесь мы не будем вдаваться в подробности, т.к. монета выбрана просто для примера. Тем кто изучает это руководство впервые - советую проделать все описанные в нем шаги именно для Interzone, чтобы вы поняли как это работает.

Да, еще, в процессе работы мы будем использовать несколько окон. Первое - это командная строка Windows, второе - это командная строка MSYS (его мы установим чуть позже). третья - это окно Far Manager. Когда мы будем вводить какие-то команды и т.п., я буду предварительно указывать где именно мы из вводим. Если это не указано дополнительно, то подразумевается что мы их вводим в командной строке Far'а. 

2. Скачаем исходники Interzone. Для этого создадим папку itz в корне диска c:\ и опять же находясь в коре выполним в Far Manager следующую команду: 
git clone https://github.com/projectinterzone/ITZ itz
На всякий случай на первый раз покажу в виде скриншота:


В результате последние исходники будут скачаны и размещены в папке c:\itz .

3. Устанавливаем консоль MSYS отсюда. Обратите внимание, на самом деле это дистрибутив проекта MinGW (Minimalist GNU for Windows), но нам потребуется только MSYS оттуда. Как мы и договаривались, качать мы будем все в папку c:\deps (зависимости), поэтому запускаем файл mingw-get-setup.exe и в инсталляторе MinGW installation manager -> All packages -> MSYS выбираем следующие пакеты:

  • msys-base-bin
  • msys-autoconf-bin
  • msys-automake-bin
  • msys-libtool-bin

Путь по-умолчанию C:\MinGW и все галочки на первом шаге инсталлятора оставляем по-умолчанию и нажимаем кнопку Install, а вот уже на втором шаге помечаем галочками нужные пакеты:

Здесь на самом деле важно не сделать ничего лишнего. Т.е. на вкладке Basic Install мы ничего не трогаем, нигде больше, особенно все что касается MinGW тоже. Просто нажимаем по All packages, переходим в раздел MSYS и выбираем 4 указанных выше пакета. Некоторые галочки там уже будут стоять, их не снимаем. Новых тоже не выставляем, только эти четыре. Также убедитесь в том что галочки на пакетах msys-gcc и msys-w32api не стоят. Если вы что-то перепутали, закройте инсталлятор и запустите его снова. Если все верно, выбираем в меню Installation -> Apply changes и затем снова нажимаем кнопку Apply. После того как все помеченные пакеты будут скачаны и установлены закрываем инсталлятор. Признаком того что вы все сделали правильно является содержимое папки C:\MinGW\bin , там должен быть один исполняемый файл mingw-get.exe . Если там есть что-то еще - значит вы напутали с галочками на предыдущем шаге, в этом случае удаляем C:\MinGW\ полностью и повторяем все вышеописанное более внимательно.

4. Далее мы создаем два файла msys_shell.cmd и cmd_shell.cmd в корне C:\ со следующим содержимым:

msys_shell.cmd
set PATH=%PATH%;C:\mingw32\bin;C:\Qt\5.3.2_Static\bin
C:\MinGW\msys\1.0\msys.bat
cmd_shell.cmd
set PATH=%PATH%;C:\mingw32\bin;C:\Qt\5.3.2_Static\bin
start cmd
И запускаем их:

Здесь (1) - это окно MSYS, (2) - это окно CMD, (3) - это окно Far. В них мы и будем работать. Фактически и (1) и (2) представляют собой командную строку, только в первом случае командным интерпретатором является bash, а во втором - стандартный командный интерпретатор cmd.exe из Windows.

< продолжение следует, статья достаточно объемная и написать ее за один вечер нереально >

среда, 11 января 2017 г.

Win32.Induc или насколько важно иметь антивирус.

Мало кто из нас задумывается о современной malwar'и, а также о различных методиках заражения. О том что на любом ПК рекомендуется иметь антивирус с постоянно обновляемыми антивирусными базами уже говорилось миллион раз где только можно, однако, почему-то многие, в том числе и разработчики ПО, пренебрегают этим простым правилом. Эта история о том, что может получиться в случае, если этими простыми рекомендациями не пользоваться.

Итак, началось все с того что сегодня при попытке сборке пустого проекта (из одной оконной формы в Delphi) я получил сообщение антивируса о том что исполняемый файл (который только что собрался) заражен Win32.Induc. У DrWeb, который я использую, конечно были ложные срабатывания на exe'шники Delphi, но в принципе это уже в прошлом, да и Win32.Induc, само название, если честно, я увидел впервые. Прочитав эти две статьи на сайтах ведущих антивирусных вендоров:


Я понял что вещь эта вообще-то древняя, что она действительно заражает Delphi приложения еще на этапе разработки, модифицируя файл %DELPHI_RootDir%\source\rtl\sys\SysConst.pas , затем он собирает его с помощью dcc32.exe и в результате получается вредоносный SysConst.dcu ("%DELPHI_RootDir%\Lib\SysConst.dcu" ), который линкуется со всеми вашими вновь созданными приложениями. Т.е. любое приложение которое вы соберете в Delphi на зараженной машине уже окажется инфицированным. Например, вы выложите его в свободный доступ, в результате, любой пользователь запустивший его у себя и имеющий установленную версию Delphi версии с 4 по 7 получит "зараженный дистрибутив". 

Наиболее хорошо проблема освещена вот в этой статье в блоге GunSmoker'а: Virus.Win32.Induc.a: энцать дней спустя (FAQ) и вот здесь Delphi-“вирус”: проверьте свою установленную Delphi! . Материал полезный и рекомендуется к прочтению.

Если вкратце, то для заражения вашего дистрибутива Delphi достаточно запустить любой собранный с помощью инфицированной версии Delphi файл. Например, вы скачали с интернета какую-нибудь полезную утилиту, собранную инфицированной версией Delphi. Разработчик этой утилиты в принципе может не знать о том что его среда разработки инфицирована (например, у него нет антивируса, или он никогда не задумывался над тем, чтобы перед публикацией проверять собственные собранные исполняемые файлы на том же VirusTotal'е), в результате, все пользователи которые скачали и запустили у себя этот файл и имели копию Delphi на ПК - получили инфицированный дистрибутив. Если учесть еще и то, что сейчас разработчики мелких утилит используют всякого рода "навесные защиты", например, VMProtect и прочие, то скомпилировав приложение и защитив его исполняемый файл, получаем ситуацию когда приложение на самом деле инфицировано, но антивирус в силу того что код защищен (например, применена виртуализация или мутация кода в защите) с определенной долей вероятности не сможет определить в нем вредоноса. 

Что же касается моих сборок, т.е. моего ПО, то к счастью заражения не произошло, т.к. любая сборка ПО перед тем как быть выложенной в интернет, обязательно автоматически проверяется и установленным у меня DrWeb и дополнительно на VirusTotal'е.

На всякий случай также запустил проверку папки всех собранных проектов с помощью консольного сканера от DrWeb, сделать это можно например так:

dwscancl.exe /LN /SST /FM:*.exe /RP:D:\drweb_work.log D:\Work (справка по консольным ключам сканера находится здесь)

Результат: всё нормально, т.е. зараженных скомпилированных в этой версии Delphi exe'шников найдено не было.

Не стоит думать что вирус мог обойти стороной тех, кто скачивает ПО только из проверенных источников. В свое время зараженными Win32.Induc оказались даже популярный мессенджер QIP и аудиоплеер AIMP, т.е. существовали зараженные сборки этих программных продуктов. Подробное описание ситуации есть в том же блоге GunSmoker'а вот здесь - Как это началось.

Также, кто-то наверняка может сказать, мол, Induc'у уже больше 8 лет, да и кто будет собирать какие-то проекты в 2017 году в 7-ой или более ранней версии Delphi? Поверьте, будут. Даже сейчас находятся люди, которые ей пользуются, например, для компиляции относительно простых приложений, во время поддержки созданных ранее проектов, да и просто в целях обучения. Здесь важна не версия Delphi как таковая, да даже и не то что это Delphi, а сам подход к инфицированию. Т.е. идея заражения приложения на этапе разработки. Представьте себе что кто-то сделает нечто аналогичное под ваш любимый MSVC или другую среду разработки, т.е. сам подход вообщем-то не зависит от среды разработки. 

Ну а рекомендации разработчикам, чтобы не попасть в подобную ситуацию, естественно, довольно простые. Имейте на ПК, на котором вы занимаетесь разработкой ПО актуальную версию антивирусного ПО с постоянно обновляемыми антивирусными базами. Про "не запускайте на машине, которую вы используете для разработки, приложения полученные из сомнительных источников" - пожалуй не буду, это и так должно быть понятно. Собранные и готовые к публикации в интернет релизные версии ваших проектов обязательно проверяйте на VirusTotal'е. Во-первых, это лишний повод убедиться для себя лично, что все нормально, во-вторых, такая проверка заранее покажет, не сработает ли антивирусная защита какого-либо из вендоров на ваш код и не будут ли пользователи задавать вам вопросы в дальнейшем, в стиле "а почему мой антивирус ругается" и т.п. 

Вообщем-то и все что хотелось рассказать ... надеюсь кому-то материал окажется полезным.

воскресенье, 18 октября 2015 г.

Пути шахматного коня ...

"Не стойте там, а то вас срубит конь ... " (с) Эта бородатая шутка и соответствующая картинка, найденная на просторах интернета, как нельзя лучше описывает сейчас мое состояние. Только вот конь меня не срубил, а зацепил ;) Началось все с самого простого, есть вещи о которых никогда не задумываешься. Так, во время серфинга по интернету я наткнулся на такой вопрос: "Шахматный конь начинает свой маршрут в левом нижнем углу доски, а заканчивает его в правом верхнем углу.Может ли конь при этом побывать на всех полях доски по одному разу?"

Вопрос на самом деле детский. Шахматная доска (8x8) состоит из 64-х клеток, на одной из клеток конь у нас уже стоит, следовательно, чтобы обойти все клетки конь должен сделать 63 хода. При каждом ходе цвет клетки меняется, т.е. стояли на черной, прыгаем - попадаем на белую. Клетки в левом верхнем углу доски и в правом нижнем имеют одинаковый цвет. Т.е. конь физически не сможет попасть туда обойдя все клетки, хотя бы потому что за 63 хода цвет клетки обязательно должен поменяться, т.е. он не будет таким как у первоначальной клетки. И вот тут меня понесло ... а как обойти всю доску. а какие есть для этого алгоритмы и т.п. Вот несколько материалов на эту тему:


Для тех кто не совсем помнит как выглядит шахматная доска:
Так вот ... зацепило меня конем так, что я решил дополнить исходники найденные по второй ссылке проверкой по методу Варнсдорфа: "При обходе доски конь следует на то поле, с которого можно пойти на минимальное число ещё не пройденных полей. Если таких полей несколько, то можно пойти на любое из них".

Правда, как говорится в Wiki существует неточность в данном правиле. Если существует несколько подходящих полей удовлетворяющих правилу, то не все они равнозначны и теоретически неправильный выбор сможет завести коня в тупик. Имеено поэтому я и решил взять рекурсивный метод, но ходить не по всем возможным для хода полям, а только по тем, которые удовлетворяют данному правилу, что существенно сокращает число возвратов и время выполнения алгоритма.

Не совсем оптимальные исходники того что получилось можно посмотреть здесь. К слову, на IdeOne'е можно не только посмотреть исходники, но и запустить их на выполнение. Ну а с помощью легкой их модификации можно вообще привести коня в любую точку ;) Например коню надо прийти из A8 в H8, нет ничего проще:


Хотите еще одним вариантом? Тоже пожалуйста:


А можно при желании и посчитать все такие варианты. Вообщем задачи с обходом шахматной доски конем теперь можно решать легко и непринужденно. Кстати, на просторах сети, благодаря вики, я обнаружил GUI демонстрацию данного метода. Скачать ее можно здесь. Приложение написано Ахметовым Игорем и позволяет визуализировать процесс обхода ... при этом можно выбрать различные параметры и стартовую позицию коня:


Честно говоря я хотел реализовать нечто подобное на JavaScript'е у себя в блоге, чтобы можно было скакать конем прямо в посте ... но честно говоря мне стало крайне лениво ;) Поэтому по итогам этого поста у вас есть интереснейшие ссылки на описание алгоритмов, мои сырцы на C на IdeOne, и отличный визуализатор процесса. Ну и да не срубит вас конь ...

p.s. К слову, для тех кого зацепила конно-скакательная тема есть тематическая игрушка Ход конем от Anton Lashkov, где каждый сможет поскакать конем на целых 44-х уровнях на своем Android устройстве ;) На этом всё на сегодня ...