Исследование программы 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-ов). И... всё! Наконец прога взломана и можно 
пользоваться ей сколько угодно!