Исследование программ, написанных на Delphi

Перейти на главную страницу, индексную страницу.


Автор: bi0w0rM <bioworm@mail.ru>

Я вас снова приветствую. Многие из вас, будущих хакеров, начинали с программирования. Чаще всего на начальном уровне это были всякие basic/pascal и конечно же... Delphi.. Когда Вы пробовали писать на нем программы, вы даже и не думали, что их придется ломать. А делфийские программы очень часто встречаются, потому что во 1-х: их легко писать. Разбираясь в основны приколах Visual Component Library, можно программировать такое... Например, не читая RFC, можно написать крутой e-mail клиент или icq-программу. Можно общаться с базами данных, используя очень понятный и малоемкий код. Только на деле программа получается слишком громадная по размерам, чем написанная на Visual C или еще лучше на ассемблере(вот попробуйте скомпилировать пример с MessageBox - всего 2 Кб!), а это немаловажно в условиях интернета. Но все равно, делфи рулез, хотя я его даже не знаю толком :) мне ближе Borland C++ Builder, хотя там такая же бодяга, такой же жирный exe-шник и все-все-все, присущее VCL.
Так вот, о больших размерах... Для взломщика невыгодно копаться в таком большом коде. Куча процедур и всякой пурги...
Как же тогда определить, что программа написана на Delphi? Откроем редактором ресурсов(люблю для этих целей ResHacker и Restorator) программу и смотрим.. Если присутствует RCData, то это стопудово откомпилировано борландовским компилятором(язык свернуть можно!). Как узнать, делфи или билдер? Просто откройте Hex-редактором exe и в поиске пропишите Delphi. Если не найдется, тогда Builder ;))))) Но есть способ лучше. Открыть программу в PE-Sniffer'е, который входит в состав PE Tools by NEOx. Многие для определения типа компилятора используют PEiD, но эта программа давно не обновляется и вообще этот проект закрыт. И Delphi не определит он. А вот PE-Sniffer... Проект PE Tools развивается и часто добавляются новые сигнатуры компиляторов и паковщиков/протекторов. Новые сигнатуры всегда можно найти у Feuerrader'а на feuerrader.ahteam.org // Хватит рекламы... Текущая версия PE-Sniffer'а хреново обнаруживает делфи(часто говорит, что это Delphi 3.0), но NEOx говорит, что усе будет у поряде.
Но мы не ответили на главный вопрос: как же все-таки исследовать огромный делфи-код? Да, SoftICE, а уж тем более w32dasm тут не помогут. W32dasm'ом вообще стоит отлаживать только проги на Visual C. В большинстве случаев с делфи он не поможет. Тут приходит на помощь делфи-декомпилятор! Знакомьтесь - DeDe. Это здравая штука. Итак, качнем для примера программу Offline Explorer Pro. Это кульный downloader, я с помощью него выкачивал целые сайты. Это экономнее, чем смотреть каждую страницу по отдельности. Знаю, про эту прогу уже писал Wersion, но сам он куда-то пропал и по слухам вообще отошел от взломов, многим надоедает или дел становится много. После установки смотрим в PE-Sniffer'е файл OE.exe(сам исполняемый файл). Угу, ASpack 2.12b .. Кто не знает, то ASPack - это программный упаковщик. Авторы программы повесили его на свой продукт с целями уменьшить размер жирного exe'ника и дабы скрыть код от нас. Wersion описывал распаковку ASPack'а, причем ручную. Помните, как сказал Hex: "Не люблю я всякие auto-unpacker'ы, они приучают лениться". Распакуем программу, как написано в другой моей статье про упаковщики или тогда GUW32, если лень.
Запускаем программу. Все ч-п, все рульно... Теперь переводим время на месяц(хз, лучше на год!) вперед. Появляется окно About и в нем понаписана всякая мура, что мы незарегистрированный пользователь и т.д.. Убеждаемся по нажатии кнопки Close, что срок триала программы действительно кончился! Дороги назад уже нет... Итак, делаем вот что: запускаем DeDe. Открываем OE.EXE и нажимаем Process. Ждем, везде соглашаемся на Yes. Не ерзайте никуда :) просто ждите. Итак, когда все закончилось, нажимаем вкладку Procedures и ищем форму регистрации под названием RegDlg. Этот самый RegDlg появляется, когда в окне About нажимаешь Register. Это ввод регистрационного номера. Смотрим, какие тут могут происходить события(events). Нас интересует нажатие на кнопку ОК, а именно btnOKClick. Двойным кликоммы попадаем в ассемблерный листинг. Вспомним из программирования на Delphi, что такое Memo... Это такой multi-line текстовый бокс, в котором можно набирать текст. Именно такое Memo нам предоставляется на форме регистрации. Вот и смотрим в коде. Обращение к этому Memo(здесь зовется memReg) происходит здесь, считывается введенная нами лабуда и видимо сравнивается с правильным регистрационным ключем.
Обратим внимание на такой код:
==== Выдрано из DeDe ====
* Reference to control memReg : TMemo
|
005DE809 8BBBFC020000 mov edi, [ebx+$02FC]
005DE80F 807F4700 cmp byte ptr [edi+$47], $00
005DE813 7422 jz 005DE837
005DE815 8D55F0 lea edx, [ebp-$10]
005DE818 8B8708020000 mov eax, [edi+$0208]
005DE81E 8B08 mov ecx, [eax]
005DE820 FF511C call dword ptr [ecx+$1C]
005DE823 8B4DF0 mov ecx, [ebp-$10]
005DE826 A1B4EF6500 mov eax, dword ptr [$0065EFB4]
005DE82B 8B00 mov eax, [eax]
005DE82D 8B55FC mov edx, [ebp-$04]

|
005DE830 E8FBDB0400 call 0062C430
005DE835 EB12 jmp 005DE849
005DE837 A1B4EF6500 mov eax, dword ptr [$0065EFB4]
005DE83C 8B00 mov eax, [eax]
005DE83E 8B4DF8 mov ecx, [ebp-$08]
005DE841 8B55FC mov edx, [ebp-$04]
.................. обрезано .......................
005DE8F1 E89A5CE2FF call 00404590
005DE8F6 8BC8 mov ecx, eax

* Possible String Reference to: 'Thank you for registering!'
|
005DE8F8 BA90EB5D00 mov edx, $005DEB90
005DE8FD A1ACF26500 mov eax, dword ptr [$0065F2AC]
005DE902 8B00 mov eax, [eax]


===== Конец =====

Не особо мудрствуя попробуем поменять jz на jnz, вдруг получится. Тем более этот прыжок избегает jmp куда-то. Ну-ну.Смотрим Phys-Offset(физический адрес) байта, что надо поменять, ну и меняем в HIEW, что надо(адреса могут отличаться). Также Вы можете поменять вместо jnz ::
cmp byte ptr [edi+$47], $00
на
cmp byte ptr [edi+$47], $01
Попробуем регистрироваться. Все путем, но вот при новом запуске проги такая же фигня. То есть приходится постоянно заново регистрироваться. Смотрим тогда в DeDe главную форму, ее разработчики назвали Main(Class Name: TMainForm). Смотрим событие FormCreate. Предположительно при создании формы в случае НЕрегистрации в окне светится [ Not Registerd ]. Прописываем в поиске(F3) not reg // OK. Мы вотъ здесЬ:
==== Выдрано из DeDe ====
00635775 8B45FC mov eax, [ebp-$04]
00635778 80B87407000000 cmp byte ptr [eax+$0774], $00
0063577F 7427 jz 006357A8
00635781 8B45FC mov eax, [ebp-$04]
00635784 8B9058080000 mov edx, [eax+$0858]
0063578A 8D85B0FEFFFF lea eax, [ebp+$FFFFFEB0]

* Possible String Reference to: ' - [ Not Registered ]'
|
00635790 B908776300 mov ecx, $00637708

===== Конец =====
Хмм.. Явно вот этот прыжок jz перепрыгивает mov ecx, $00637708, судя по адресу, куда он прыгает. А значит в заголовок окна не будет помещаться такая вот муйня ' - [ Not Registered ]'. Заменим в HIEW
cmp byte ptr [eax+$0774], $00
на
cmp byte ptr [eax+$0774], $01
и убедимся, что это работает. можете сменить jz на jnz - логический смысл не изменится!
Теперь чуть выше есть какие-то шифрованные строки, наверно что-то с рег. кодом связано!

==== Выдрано из DeDe ====
* Possible String Reference to: 'XFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3d
| zXEN1cnJlbnRWZXJzaW9uXFdpbmRvdyBTZX
| R0aW5ncw=='
|
006356BA B890766300 mov eax, $00637690

|
006356BF E8B0C9E5FF call 00492074
006356C4 8B95C0FEFFFF mov edx, [ebp+$FFFFFEC0]
006356CA B101 mov cl, $01
006356CC 8B45F8 mov eax, [ebp-$08]

|
006356CF E89056E2FF call 0045AD64
006356D4 8D45F4 lea eax, [ebp-$0C]

* Possible String Reference to: 'U2VhcmNoRmxhZ3M='
|
006356D7 BAEC766300 mov edx, $006376EC

|
006356DC E8F3EADCFF call 004041D4
006356E1 8D95BCFEFFFF lea edx, [ebp+$FFFFFEBC]
006356E7 8B45F4 mov eax, [ebp-$0C]

|
006356EA E885C9E5FF call 00492074
006356EF 8B95BCFEFFFF mov edx, [ebp+$FFFFFEBC]
006356F5 8B45F8 mov eax, [ebp-$08]

|
006356F8 E8BF5DE2FF call 0045B4BC
006356FD 84C0 test al, al
006356FF 7527 jnz 00635728
00635701 8D95B8FEFFFF lea edx, [ebp+$FFFFFEB8]
00635707 8B45F4 mov eax, [ebp-$0C]

|
0063570A E865C9E5FF call 00492074
0063570F 8B95B8FEFFFF mov edx, [ebp+$FFFFFEB8]
00635715 8B45F8 mov eax, [ebp-$08]

|
00635718 E8875BE2FF call 0045B2A4
0063571D 8B55FC mov edx, [ebp-$04]
00635720 898270070000 mov [edx+$0770], eax
00635726 EB30 jmp 00635758
00635728 8D95B4FEFFFF lea edx, [ebp+$FFFFFEB4]
===== Конец =====
ВОТЪ! Если сменить в HIEW
jnz 00635728
на
jz 00635728
Тоt назойливый About, предлагающий закрытие, как рукой сняло. Мы не вдались в подробности, срабатывает или нет jnz 00635728. Можете поставить на него bpx в TRW2000 и посмотреть. Если рядом стоит (JUMP), а значит при cracked н.у. он активен и его для надеждности лучше даже сменить на
jmp 00635728
Вот так вот. Теперь можете убедиться, что DeDe - это не игрушка, а серьезный и важный инструмент для настоящего исследователся защиты программ(то бишь крэкера). Копать делфи-код с этой штукой в 100 раз удобнее, чем с w32dasm и SoftICE. Вот так вот, пока!

P.S.: В DeDe есть такая фича: Dump Active Process(меню Tools). То есть можно просмотреть даже запакованный exe'шник, если он запущен. Дальше-больше. При помощи DZA-patcher можно сделать loader или лучше написать самому.
P.P.S.: Не забудьте перевести системное время обратно :)
P.P.P.S.: Если что-то не получилось или вы хотите дать мне денег, можете написать письмо или выцепить по icq. Я с удовольствием вам помогу. Координаты внизу.

bi0w0rM[AHTeam]
ICQ: 257390724
E-Mail: bioworm@mail.ru
URL: bioworm.narod.ru


Материалы находятся на сайте http://cracklab.narod.ru/doc/






Hosted by uCoz