RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

Взлом программы «Feuer's NFO File Maker V1.2»

Программа: Feuer's NFO File Maker v1.2
Размер: 395 264 байт
Язык: Borland Delphi 6.0
Защита: Delphi компонент - TRegWareII + Telock 0.96
Цель: взлом
Инструменты: DeDe 3.10
Hiew 6.x
SoftIce 4.05

Вступление.

Программа Feuer's NFO File Maker V1.2 служит для создания nfo файлов. Запакована tElock 0.96 + использует Delphi компонент TRegWareII версии 3.2x, если я конечно не ошибаюсь, это впринципе не важно. Можно конечно распаковать прогу вручную, но это выходит за рамки данной статьи, поэтому я использовал WKT_tElock_Dumper 1.2. Дампим, получаем распакованный файл. Можно изменить атрибуты секций на E0000020, если хотите подизасмить. Я лично этого не делал, воспользовался тем набором средств который перечислен выше. Итак у нас есть готовый распакованный файл. Запускаем дамп и видим messagebox с напоминанием о том, что включен дебагер, и надо заплатить 300 руб на развитие ревёрсинга. Поэтому статью я разбиваю на две части:

1) Поиск и удаление всякий авторских проверок на softice и crc32
2) Взлом основной защиты.

Часть 1

1) Грузить дамп (в дальнейшем "прога") в symbol loader нет смысла, т.к. вырубится при первой же месаге. Поэтому открываем sice и ставим bpx MessageBoxA, запускаем прогу и сразу же вываливаемся в sice. Жать F12 нет смысла, т.к. за месагой идет вызов функции завершения проги, и мы не вывалимся на том месте проги, откуда был вызов месаги. Поэтому делаем так, как тока бряк сработает, трассируем осторожно, порядка несколько инструкций до ret. При этом сработает месаги и мы встаним на ret. Делаем один раз F10 и мы в том месте проги, где месага вызывалась. Пролистываем вверх и видим условный переход, это то самое место проверки (взято из DeDe):

* Reference to: maincod.Proc_0049ED98
|
0049F1F2 E8A1FBFFFF call 0049ED98
0049F1F7 84C0 test al, al
0049F1F9 741E jz 0049F219 <- та самая проверка
0049F1FB 6A10 push $10
0049F1FD 6894F44900 push $0049F494
0049F202 A1806D4A00 mov eax, dword ptr [$004A6D80]

* Reference to: System.Proc_00404D00
|
0049F207 E8F45AF6FF call 00404D00
0049F20C 50 push eax
0049F20D 6A00 push $00

* Reference to: user32.MessageBoxA()
|
0049F20F E85883F6FF call 0040756C

* Reference to: System.Proc_00404760
|
0049F214 E84755F6FF call 00404760
0049F219 8D55EC lea edx, [ebp-$14]
0049F21C 8B07 mov eax, [edi]
Все, что следует сделать, это заменить jz 0049F219 на jmp 0049F219, т.е. поменять всего один байт. Так мы побороли первую проверку. Не забудьте, убирать бряк не надо, проверок 6 !!! Как только поменяли, можно в памяти, лучше сразу в HIEW, грузим прогу, вываливается месага, проделываем все вышеперечисленные и эта защита сломана ! Ниже даю список адресов в последовательности проверки:
1) 0049F1F9 - Первая проверка на SICE
2) 0049F230 - Первая проверка на CRC32
3) 00493D08 - Вторая проверка на CRC32
4) 00498540 - Вторая проверка на SICE
5) 0049CAC4 - Третья проверка на CRC32 (по таймеру)
6) 0049C91D - Четвертая проверка на CRC32 (по таймеру)
Во всех местах надо изменить на jmp (опкод EBXX). Всё первая часть закончилась, приступим ко второй !!!

Часть 2

Вторую часть я тоже поделю на два пункта, чтобы вам было понятней :

1) Снятие защиты на появление дополнительных компонентов в проге (заведомо скрыто автором)
2) Снятие защиты при сохранении готового файла.

1) Для этих целей нам пригодится DeDe (delphi decompilator). Открывает прогу, заходим на закладку Procedures, ClassName -> TMain, справа видим события формы. Нас прежде всего волнует FormCreate и FormShow. Заходим в FormCreate там ничего интересного нет, тогда в FormShow и что мы видим ??? Кучу проверок, причем там конфигурирует TRegWareII. Пролистываем листинг кода, и видим первое упоминание о TRegWareII, причем идет вызов функции по адресу 0046BA0C, а далее проверка на возвращаемое значение. Если посмотреть внимательнее, т.е. везде где есть TRegWareII, идет вызов функции по адресу 0046BA0C. Значит, если прога зарегистрирована, то функция возвращает 1. Делаем так, заходим в этот call, а там опять call и ret. Заходим в этот call, который по адресу 0046BD04, видим всякий хлам :), места придостаточно. Пишем

xor eax,eax
mov eax,01
ret
nop
Теперь функция всегда возвращает 1, т.е. прога якобы зарегистрирована. Запускаем прогу... но не все так хорошо ! Кстати, забыл сказать, что данные о зарегистрированном пользователе хранятся в файле reg.key, об этом можно узнать в FileMon'е. Пишем туда: Первая строчка - ваше имя, вторая и последующие - всякий хлам :). Как я уже говорил, снятием этой защиты дело не закончилось. Внимательно посмотрев на листинг, который предоставил DeDe, замечаем, что по адресу 0046BCEC (доказано практическим путем) идет проверка на триальность, и если все нормально - функция возвращает 0. Поэтому делаем так:
xor eax,eax
mov eax,00
ret
nop
nop
Все, вроде бы и это сделали, но опять облом... обещанных дополнительных компонентов на форме нет ! Но не надо отчаиваться, взглянем еще разок на листинг, где есть побольше упоминаний о различных editbox'ах и т.д. Натыкаемся на такое место:
* Reference to: System.Proc_00404C4C
|
0049BF59 E8EE8CF6FF call 00404C4C
0049BF5E 0F8535020000 jnz 0049C199 <- какая-то проверка
0049BF64 8B07 mov eax, [edi]

* Reference to control feat : TRegwareII
|
0049BF66 8B8028030000 mov eax, [eax+$0328]

* Reference to: regware2.Proc_0046BA0C
|
0049BF6C E89BFAFCFF call 0046BA0C
0049BF71 3C01 cmp al, $01
0049BF73 0F8520020000 jnz 0049C199

* Reference to pointer to GlobalVar_004A6D38
|
0049BF79 A1DC594A00 mov eax, dword ptr [$004A59DC]
0049BF7E 8B00 mov eax, [eax]
Чтобы все компоненты появились, надо чтобы на условном переходе по адресу 0049BF5E не было перехода, поэтому забиваем все это дело nop'ами. Запускаем прогу... и УРА !!! Появились дополнительные компоненты, которые автор так тщательно прятал :). Кстати, если вы создали файл reg.key, как я это описывал выше, то в окне о проге увидите, что она зарегистрирована на Вас !!!. Но не стоит расслабляться, впереди еще одно снатие защиты...

2) Попробуем заполнить все данные и выбрать в меню saveas... выйдит облом, создастся файл, где полно упоминаний о том, что мы якобы пользуемся незарегистрированной программой. Для снятия защиты воспользуемся опять DeDe, в событиях главной формы видим SaveAs1Click. Заходим туда, листаем вроде все нормально, идет вызов функции проверки на зарегистрированность, но не так все и просто, а вернее сказать очень просто ! :). Листаем листинг, видим упоминание о TSaveDialog, как раз это дело идет перед проверкой на зарегистрированность. Но до этого кода дело не доходим. Я долго думал, чё за фигня ?, но долга думать не пришлось.. По адресу 0049A102 идет первая проверка на зарег. дак мы этот условный переход превращаем в безусловный на адрес 0049A4FE, который идет-таки опять после условного перехода. Запускаем прогу и этот пункт меню работает. Совершенно так же делается с пунктом меню 'Сохранить как feuer nfo'. Итак мы получили полностью работоспособную программу !!!.

Заключение

Программа эта написана FEUERRADER'ом, который занимается ревёрсингом. Он учел в этой программе все те ошибки, которые делают большинство программистов, и сделал неплохую защиту. Но и эта защита оказались бессильна...

Разрешается копировать материал только с указанием источника и автора.

Copyright (c) -= ALEX =- . All rights reserved.

[www]: http://alexxakep.wallst.ru
[e-mail]: alex-xakep@mail.ru