Продолжаю публикацию примера курсовой работы и ссылок на интересные ресурсы сети Интернет, само собой.
Начну именно со ссылки, так как не каждый пришедший на эту страницу готов читать про то, что можно написать в аналитическом обзоре и какова может быть его структура. Ссылки даю на новости онлайн, причем не на политические и прочие, порой несущие негативную информацию, а на хороший ресурс, где можно найти интересную информацию о мире кино. Впрочем, не буду пересказывать – просто зайдите и посмотрите все сами, а я возвращаюсь к основной теме поста. В прошлом посте я начал разбирать структуру курсовой работы.
ВВЕДЕНИЕ
1. АНАЛИТИЧЕСКИЙ ОБЗОР 7
1.1 Необходимость защиты приложений, исполняемых терминалом MT4
1.2 Целесообразность использования программно-аппаратных средств для защиты dll библиотек
1.3 Декомпиляция исполняемых файлов
2. ЦЕЛИ И ЗАДАЧИ РАБОТЫ
3. ОСНОВНАЯ ЧАСТЬ
3.1 Структура защищаемой программы на языке MQL, выделение критически важного участка программного кода
3.2 Разработка dll библиотеки, содержащей защищаемый программный код
3.3 Вызов функции, хранящейся в dll библиотеке, из исполняемого ex4 файла
3.4 Защита dll файла с использованием HASP SRM Envelope
Выводы по работе
Список использованных источников
* * *
1. АНАЛИТИЧЕСКИЙ ОБЗОР
1.1 Необходимость защиты приложений, исполняемых терминалом MT4
Простейшая техническая защита программного обеспечения предусматривает ввод регистрационного кода, который разработчик программного обеспечения сообщает пользователю. Рассмотрим небольшой фрагмент из декомпилированной (взломанной) программы. Декомпилированный вариант, полученн в результате обработки исходного ex4 файла декомпилятором EX4-TO-MQ4 Decompiler V4/0/416.1b:
#property copyright «fx©fx-fx.ru»
….
int init() {
….
if (!(IsDemo() || IsTesting() || IsOptimization())) {
if (6.0 * (1.0 * (2.0 * (8.0 * AccountNumber() + 678.0) + 16.0)) != Key) {
ls_0 = «Для торговли на реальном счете нужен лицензионный ключ.»;
ls_8 = «Вы можете получить ключ на сайте www.fx-fx.ru»;
Print(ls_0); Print(ls_8); MessageBox(StringConcatenate(ls_0,
«\n», ls_8, «\n»), «Ошибка», MB_ICONHAND); Sleep(93700000); } }
…. return (0); }В функции init() сравнивается значение вычисленного производного значения от номера счета AccountNumber() и полученного ранее от продавца ключа (переменная Key), который был передан покупателю. Если значения равны, то функция возвращает ноль и программа работает в штатном режиме. В случае ошибки программа засыпает “навечно” — Sleep(93700000). Для разработки такой защиты разработчику нужно совсем немного времени, так же и как злоумышленнику на то, чтобы ее взломать. Можно привести в качестве примера немного более сложный для реализации и взлома вариант.
1.2 Целесообразность использования программно-аппаратных средств для защиты dll библиотек
В этом примере вынесена часть функционала программы, в том числе функция проверки ключа, в отдельную dll библиотеку:
library xyz; {uses SysUtils, Classes ; } {$R *.res}
function key(a0:integer;a1:integer;a2:integer;a3:integer;a4:integer;a5:integer;a6:integer):
integer;
stdcall; begin if (a2=a1*7-784351) then key:=0 else key:=1;
end;
function price1(a0:integer;a1:integer;a2:integer;a3:integer;a4:integer;a5:integer;a6:integer):integer;
stdcall; begin …… end;
…
exports key,price1,btp1,stp1,maxorders; begin end.
Скомпилировав файл (среда Delphi), получили библиотеку xyz.dll и хранящиеся в ней функции key,price1,btp1,stp1,maxorders. Функция key отвечает за проверку, остальные содержат части функционала программы. Без файла библиотеки xyz.dll программа работать не будет, но ничего не мешает злоумышленнику распространять файл библиотеки xyz.dll вместе с вызывающим ее скомпилированным кодом программы ex4. Для подбора кода регистрации злоумышленнику потребуется больше времени, так как нужно корректно вызвать функцию из библиотеки и подобрать нужный вариант ключа для заданного номера счета.
Из приведенного примера видно, что сама библиотека dll так же нуждается в защите. Один из вариантов защиты библиотеки, выполнить шифрование библиотеки и встроить в нее код привязки к некому аппаратному устройству. Можно воспользоваться готовыми решениями от производителей программно-аппаратных средств защиты, например, использовать ключ аппаратный HASP HL (фирма SafeNet).
Существенные недостатки аппаратных ключей защиты – относительно высокая стоимость (от $15 и выше за один ключ), необходимость физической доставки ключа покупателю. SafeNet в рамках серии HASP SRM предлагает решение, позволяющее работать с двумя типами ключей: аппаратные ключи HASP HL и программные ключи HASP SL. Программный код внутри аппаратного ключа выполняется специализированным процессором, тот же алгоритм можно реализовать под управлением процессора компьютера, на котором находится защищаемая программа.
Достоинство ключей HASP SL в том, что не требуется затрат на физическое изготовление ключа, поэтому стоимость ключа будет значительно ниже (от $5 за экземпляр и ниже). Ключ можно практически мгновенно доставить покупателю и он сразу сможет работать с купленной им программой, которая надежно защищена. Защита с использованием программного ключа HASP SL устанавливается аналогично той, которая ориентирована на работу с аппаратным ключом HASP HL.
1.3 Декомпиляция исполняемых файлов
Декомпилятор — программа, транслирующая исполняемый модуль (полученный на выходе компилятора) в относительно эквивалентный исходный код на языке программирования высокого уровня. Декомпиляция — процесс воссоздания исходного кода декомпилятором. Декомпиляция используется при обратной разработке программ. Успешность выполнения декомпиляции зависит от объема информации, представленной в декомпилируемом коде. Байт-код, используемый большинством виртуальных машин (таких как Java Virtual Machine или .NET Framework Common Language Runtime) часто содержит обширные метаданные, делающие декомпиляцию вполне выполнимой, в то время как машинный код более сложен для выполнения декомпиляции: трудночитаемыми представляются вызовы подпрограмм или функций с косвенными адресами.
Если известно, на каком языке была написана декомпилируемая программа, то в первую очередь дизассемблируются и анализируются библиотеки времени исполнения (runtime library) компилятора с этого языка, так как в основном компиляция программы сводится к вызовам с различными параметрами процедур из этих библиотек [3,4]. Кроме того, многие компиляторы позволяют увидеть, в какой ассемблерный код превращаются операторы программы после компиляции. Эти конструкции становятся шаблонами для декомпилятора, а процесс декомпиляции становится похож на распознавание в машинном коде конечного набора используемых шаблонов. Относительно легко распознаются вызовы и возврат из процедур. Вызовы и возвраты из процедур рассматриваются как границы для восстановления операторов процедуры. Некоторые компиляторы и инструменты, используемые после компиляции, создают обфусцированный код, с целью затруднить декомпиляцию для взломщика программного обеспечения.
Несколько распространенных декомпиляторов:
VB Decompiler — декомпилятор исполняемых модулей (EXE, DLL, OCX), созданных при помощи Visual Basic 6.0, используется для анализа программ и восстановления исходного кода. Программы, разработанные на Visual Basic, могут быть скомпилированы либо в интерпретируемый p-code, либо в выполняемый native code. Так как p-code представляет собой высокоуровневые команды, то появляется возможность восстановить из этого кода в исходный программный код (первоначальные имена переменных и функций восстановить не удастся). VB Decompiler восстанавливает довольно много пикодовых инструкций, поэтому декомпилятор сильно упрощает задачу анализа алгоритмов исследуемой программы, частично восстанавливая её исходный код. Если программа откомпилирована в native code, то восстановить исходный код из машинных инструкций невозможно, но VB Decompiler помогает анализировать программу. В VB Decompiler встроен мощный дизассемблер, поддерживающий все команды Pentium Pro, включая MMX и SSE, что позволяет дизассемблировать все функции. Присутствует анализатор кода, который отслеживает вызовы API функций и ссылки на строки в дизассемблированном коде, вставляя их как комментарий к анализируемой строке.
Коммерческая утилита .NET Reflector для сборок Microsoft .NET включает браузер классов, статический анализатор и декомпилятор (разработчик Lutz Roeder).
Jad (JAva Decompiler) — декомпилятор программ, написанных на Java. В настоящий момент не поддерживается разработчиком. Jad — консольная утилита для извлечения исходных кодов из файлов классов (.class), используется с графическим интерфейсом DJ Java Decompiler, также выпущен плагин для Eclipse IDE (JadClipse). Последняя стабильная версия JAD — 1.5.8g, поддерживает Java-классы версий 45.3, 46.0, 47.0.
Рисунок 1 — файл формата ex4 успешно декомпилирован
DeDe (Dede by DaFixer) — декомпилятор программ, написанных в среде разработке Delphi. Работает с программами, скомпилированными любыми версиями Delphi, кроме восьмой версии и старше, так как она создает .NET-код. DeDe позволяет анализировать исполняемые (exe) файлы, скомпилированные в Delphi. После декомпиляции DeDe позволяет получить:
• dfm файлы, которые можно открывать и редактировать в Delphi;
• все объявленные методы с хорошо комментированным кодом на ассемблере с ссылками на строки, импортированных функций, методов и компонент в Unitе, блоки Try-Except и Try-Finally.
• дополнительную информацию о декомпилируемой программе;
• можно создать папку Delphi проекта с файлами dfm, pas, dpr, но pas файлы будут содержать ассемблерный код.
Revendepro — декомпилятор находит большинство структур (классы, типы, процедуры, и т.д.) в программе и генерирует их представление вида языка паскаль, процедуры представлены на языке ассемблера. В качестве недостатка следует отметить, что полученный ассемблерный код не может быть заново откомпилирован без обработки вручную, что требует достаточно высокой квалификации программиста. В качестве достоинства следует отметить, что исходник декомпилятора доступен для свободной загрузки в сети Интернет.
MRIP — декомпилятор позволяет извлекать из Delphi приложения любые ресурсы: курсоры, иконки, dfm файлы, pas файлы и т.д. Отличительная важная особенность — способность извлекать файлы, хранящиеся в других файлах. Поддерживается более 100 форматов файлов. MRip работает под DOS. Exe2Dpr — помогает восстановить частично потерянные исходники проекта, не имеет интерфейса и работает с командной строкой, например: ‘exe2dpr [-o] exeFile’ (восстанавливаемые файлы проекта создаются в текущей директории).
Разработаны специальные программы для декомпиляции файлов ex4. Файл структуры ex4 получается после обработки файла mq4, содержащего программный код на языке MQL (версия 4) предназначенный для выполнения под управлением торгового терминала платформы МТ4. Одна из программ для декомпиляции EX4-TO-MQ4 Decompiler (например, версия V4.0.406.1).
—
По аналитическому обзору собственно все, двигаемся дальше…