August 7, 2018

Fail

Этот пост посвящен моей неудаче, добиться желаемого у меня не получилось. Пост про неудавшийся взлом программы, пишу больше для себя, дальше можно не читать.

Вова попросил меня помочь с программой тестов Test Info v2.35, добыть вопросы и варианты ответов. Программа примитивная, первое впечатление, что написана на Делфи (так в последствии и оказалось). Файлы тестов закодированы, первые несколько байт у всех файлов разные, что характерно для кустарного шифрования, например, XOR по простому ключу. Есть шансы, что взглянув на функцию шифрования удастся вскрыть файлы.

Для обратной связи в программе указан емейл, гугл говорит, что автор - московский программист по имени Роман. Дальнейшее гугление говорил о том, что эта программа широко используется для тестирования на территории РФ. Совесть чиста, можно начинать работать.

IDA Pro говорит, что исполняемый файл запакован, что подтверждается его маленьким размером, 375 кб. Чтобы определить программу упаковщик, используем PEiD: https://www.aldeid.com/wiki/PEiD

Узнаём, что исполняемый файл запакован ASPack 2.12. Гуглим, распаковать его можно с помощью AspackDie. Качаем его, например, здесь: https://www.exetools.com/unpackers.htm. После распаковки файл уже занимает больше мегабайта, и отныне становится по зубам Иде (у Иды есть встроенный детектор-распаковщик, но мне не понравилось, как он работает. Ощущение, что распаковывая файл на лету, он не доводит дело до конца, не все функции доступны).

Снова смотрим на файл с помощью PEiD, и убеждаемся, что он написан на Borland Delphi 4.0 - 5.0. Открываем его в Иде, применяя соответствующие сигнатуры (File->LoadFile->FLIRT Signature File, затем bds, когда спросит - Change Compiler, Unload Library). Обратим внимание, что наиболее удачной сигнатурой оказалась bds, а не b32vcl и d5vcl, что намекает на то, что версия Делфи здесь выше, чем считает PEiD.

Здесь начинаются первые проблемы - мне не удалось найти комбинацию флирт-файлов, которая бы позволила полноценно проанализировать код. Большинство функций имеют нечитаемые названия, вида sub_4CA1A4. Гугл тоже не помог.

Дополнительную информацию удалось получить с помощью DeDe (Delphi Decompiler): http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/DeDe.shtml. Она разобрала код по формам и компонентам, и помогла найти адрес нужного метода, где и выполняется расшифровка базы с вопросами: 004С993С. Записываем адрес, возвращаемся в Иду.

Бинго! Это место показано на скриншоте. Видна функция BlockRead читающая блоки по 130 байт из файла, подпрограмма sub_4A73A8 генерирующая на лету простой 100-байтовый ключ (a3 = 0x8088405 * a3 + 1; бгг), функция sub_48D304 из них восстанавливает исходный текст.



Увы, дальше продвинутся не удалось. Главным образом, из-за наличий в коде монструозных структур следующего вида:
(*(void (__fastcall **)(int *, int))(*v38 + 52))(v38, v45)
Это не глюк дизассемблера, а вызовы методов классов, с передачей свойств объектов. Ида не умеет автоматически восстанавливать их структуру.

Статья "Classes Restoration - Useful Tips for Software Reverse Engineers" (https://www.apriorit.com/dev-blog/78-classes-restoration) показывает, как структуру можно восстановить вручную, но даже для простейших классов, на мой взгляд, это очень трудоёмкая работа. Тем более, что к этому моменту я уже так глубоко вник в программу, что увидел предусмотренный автором способ вытащить нужную Вове информацию, не прибегая к взлому (и за это вождь племени назвал меня Зорким Глазом :)

Итак, новый опыт и важный вывод для меня - программы, написанные с помощью Borland IDE взламывать труднее, чем кажется на первый взгляд (и в разы труднее, чем .Net Managed code). Следует быть готовым, что придется восстанавливать структуру классов вручную. Пока я не знаю, как это обойти, но уверен, что что-нибудь придумаю :)

Кто дочитал до этой строчки - латентный хакер :)

No comments: