Исследование программы Pic2Matrix Автор: SLV Инструменты: OllyDbg; HIEW; W32DASM; SoftIce; PETools v1.5; ImpREC v1.6 FINAL Вступление. Однажды скачав эту прогу с её родного сайта я почему-то сразу же про неё забыл. И вот настал тот день, когда в надежде найти что-нибудь интересное (из shareware) у себя на харде (т.к. инета уже не было =)) я прописал в поиске setup.exe. И бросилось мне в глаза эта софтина. И начал я её распаковывать, а потом ломать... Распаковка. Интересной эта программа мне показалась потому, что PEiD последней версии не опроделил пакера/протектора/компилятора и написал Nothing found * (на хардкор скане он показал UPX 1.03 - 1.04 -> Markus & Laszlo, но на УПХ это не похоже ИМХО). Чтож, откроем exe Ресторотаром, или чем-то подобным. No resources in this file. Ясно, прога запак/криптована. Загружаем Pic2Matrix.exe в олю (OllyDbg), щёлкаем по пимпе &Yes для продалжения анализа. Остановились тут: CODE NOW! 00539600 > 60 PUSHAD 00539601 61 POPAD 00539602 EB 01 JMP SHORT PIC2MATRIX.00539605 Проходим всю эту фигню по F8 до такого места: CODE NOW! 00539622 4A DEC EDX ; PIC2MATRIX.005379B3 00539623 4A DEC EDX 00539624 4A DEC EDX 00539625 FFD2 CALL EDX 00539627 48 DEC EAX Зайдём в call. Далее идёт процедура распаковки. Аналогично проходим её до такого места: CODE NOW! 00537B0E EB E1 JMP SHORT PIC2MAT.00537AF1 00537B10 FF96 3C841300 CALL DWORD PTR DS:[ESI+13843C] 00537B16 61 POPAD 00537B17 E9 C034F9FF JMP PIC2MAT.004CAFDC JMP 004CAFDC - это и есть прыжок на OEP, т.е. OEP = 4CAFDC . Ставим на него бряк и давим шифт F9. Далее F8 и мы тут: CODE NOW! 004CAFDC 55 PUSH EBP 004CAFDD 8BEC MOV EBP,ESP 004CAFDF 83C4 F0 ADD ESP,-10 004CAFE2 B8 6CAD4C00 MOV EAX,PIC2MAT.004CAD6C 004CAFE7 E8 0CBEF3FF CALL PIC2MAT.00406DF8 Это стандартное начало Delphi программы. Теперь можно снимать дамп (он должен быть в 4+ раз больше исходного). Закрываем наш отладчик и начнём восстанавливать таблицу импорта. Запускаем Pic2Matrix.exe и следом за ним ImpREC v1.6 final. В поле OEP пишем OEP - ImageBase = CAFDC и жмём кнопку GetImports и получаем 100% валидный (от англ. valid - правильный =) импорт. Далее Fix dump и я советую сделать RebuildPE. Всё! Прога распакована, приступаем к взлому зашиты. Ломка. Откроем dumped_.exe, т.е. уже готовый к исследованию exe-шник =), W32DASM-ом. Подождём пока дизассемблер распотрошит содержимое файла в 1.2+Mb на опкоды. Открыли =). Теперь поишем в стрингах строки, связанные с регистрацией/ограничением по функциональности, например "Данная функция отключена в Demo-версии". Нашлась, причём единажды во всём коде: CODE NOW! :004C4786 E831F0FFFF call 004C37BC :004C478B 84C0 test al, al :004C478D 750F jne 004C479E * Possible StringData Ref from Data Obj ->"Данная функция отключена в Demo-версии" ->"программы Pic2Matrix!" | :004C478F B8C44C4C00 mov eax, 004C4CC4 :004C4794 E843AFF7FF call 0043F6DC :004C4799 E9C7040000 jmp 004C4C65 Глупее не придумаешь. Заходим в call и списываем offset первой команды на бумажку. Теперь подменим в HIEW процедуру на такую: CODE NOW! xor al,al inc al ret Всё должно быть ясно, в ином случае учите ассемблер =) В HIEW пишем: Enter -> Enter -> F5 -> C2BBC -> F3 -> F2 -> xor al,al -> enter -> inc al -> Enter -> ret -> Enter -> Esc -> F9 -> Esc. Теперь все функции доступны, но через энный промежуток времени выходит мегабокс (точнее ShowMessage) с надписью "Внимание!!! Данная программа не зарегистрирована. блаблабла, блаблабла". Придётся лечить и это. Поищем эту строку в Дасме. Попадаем сюда: CODE NOW! :004C9F64 7446 je 004C9FAC :004C9F66 8B45FC mov eax, dword ptr [ebp-04] :004C9F69 8B8054030000 mov eax, dword ptr [eax+00000354] :004C9F6F 33D2 xor edx, edx :004C9F71 E88216F7FF call 0043B5F8 * Possible StringData Ref from Data Obj ->"Внимание!!! Данная программа не... " ... вырезано ... | :004C9F76 B808A04C00 mov eax, 004CA008 :004C9F7B E85C57F7FF call 0043F6DC :004C9F80 8B45FC mov eax, dword ptr [ebp-04] :004C9F83 E82C90F9FF call 00462FB4 :004C9F88 EB22 jmp 004C9FAC Почти тоже самое... Меняем je 004C9FAC на jmp 004C9FAC назойлевое сообщение пропадает, а нет! Это просто компилятор Дельфей усложняет ситуацию. Поднимимся немного вверх и увидем такое: CODE NOW! * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004C9EEF(U) Идём на адрес 004C9EEF. А там... среди всего мы видим это: CODE NOW! :004C9E93 8D851CFEFFFF lea eax, dword ptr [ebp+FFFFFE1C] * Possible StringData Ref from Data Obj ->"Pic2Matrix.key" | :004C9E99 BAF09F4C00 mov edx, 004C9FF0 :004C9E9E E8C9ADF3FF call 00404C6C :004C9EA3 8B851CFEFFFF mov eax, dword ptr [ebp+FFFFFE1C] :004C9EA9 E87EF5F3FF call 0040942C :004C9EAE 84C0 test al, al :004C9EB0 0F84D4000000 je 004C9F8A :004C9EB6 33C0 xor eax, eax Хахаха, ещё одна проверка на зареганность. Аналогично заходим в call и меняем все команды на CODE NOW! xor al,al inc al ret Теперь-то уж точно всё, и функции доступны, и мессаги не достают, но через промежутки времени выходит настоящий MeassageBoxA текстом I/O Error 103 =(. В этом виноват не автор программы, а компилятор Delphi, из-за своей оьработки исключительных ситуаций =). В этом случае мне привычнее работать с Айсом. Запускаем прогу и ставим bpx MessageBoxA. Оказалось, что API MessageBoxA вызываетсяпо адресу 4668D6. Переходим туда в W32DASM-е и списываем offset на ту-же бумажку =) Он равен 65CD6. Осталось только занопить в HIEW этот call (надо поставить 5 nop-ов). И... всё! Наконец прога взломана и можно пользоваться ей сколько угодно!