Ручная распаковка файлов при помощи OllyDbg

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


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


OllyDbg - это отладчик. Причем он не является отладчиком типа TRW2000 и SoftICE. Его способ отладки немного другой. Оказалось, им очень легко распаковать программу + антиотладочные трюки OllyDbg не определяют да и вообще за отладчик не считают. Хотя я видел проги, которые орали про включенный дебаггер даже при включенном w32dasm - чем черт не шутит!
Итак, что нам надо:
OllyDbg 1.05 (как видите, не очень новая версия(с 2001 года). Я Вас призываю найти поновей(reversing.kulichki.ru), а эту я нашел на protools.cjb.net в разделе Debuggers. А вообще-то не знаю ... Может я скачал это на www.exetools.com :) ... Найдете в общем. Если страничка программы еще не загнулась, то вот она: http://home.t-online.de/home/OllyDbg )
PEditor by yoda 1.7 (у меня версия 1.7 , но можно попробовать и на более старых, но тогда я вам точно не гарантирую, что всё пройдет, как надо :)) . Нам понадобится встроенный дампер, PE-editor и checksum corrector. Тут нам не помогут НИКАКИЕ ProcDUMP'ы , LordPE(1.4 Deluxe). Я не наезжаю на этот софт, но гарантирую, что с такими программами у вас ничего не выйдет. Это обусловлено тем, что LordPE плохо биндит импорт , ProcDUMP тоже х мается, а дорогой PEditor by yoda делает всё рульно. Если Вы заюзали PE tools by NEOx, то включите в опциях Dumpfix, Wipe Relocation, Validate PE, Rebuild PE, Bind Imports. Ах да! Есть еще штука PETool32 by MackT/UCF2000! Вот в ней можно тоже дампить и заюзать кнопочку checksum, но об этом позже.

Мало инструментов? Вот так то. А можно потом вырубить его(Olly) и приспокойно играть в кваку или CS без перезагрузки, не боясь, что выскочит SoftICE при сидячих стрейфах :))

(*) Распаковка.
Но Мы сели за распаковку! Начнем? Начнем!

Запускаем OllyDbg. Жмем F3 и выбираем запакованную прогу. Пакованную! Речь идет про ASPack или UPX, но никак не про ASProtect или Armadillo.
Открыт файл.
Сейчас Мы стоим здесь:
004A4000 > $ 60 PUSHAD
004A4001 . E8 00000000 CALL HC.004A4006
004A4006 $ 83CD FF OR EBP,FFFFFFFF
004A4009 . 31DB XOR EBX,EBX
004A400B . 5E POP ESI
004A400C . 8DBE FACFF5FF LEA EDI,DWORD PTR DS:[ESI+FFF5CFFA]
004A4012 . 57 PUSH EDI
004A4013 . 66:8187 A4200A>ADD WORD PTR DS:[EDI+A20A4],0
004A401C . 81C6 B3010000 ADD ESI,1B3
004A4022 . EB 0A JMP SHORT HC.004A402E

Теперь просто несколько раз жмем Page Down, пока не окажемся здесь(пример: прога пакована UPX) :::
004A4192 . 83C7 02 ADD EDI,2
004A4195 .^EB E2 JMP SHORT HC.004A4179
004A4197 > 61 POPAD
004A4198 .-E9 C3A6FDFF JMP HC.0047E860
004A419D 55 DB 55 ; CHAR 'U'
004A419E 50 DB 50 ; CHAR 'P'
004A419F 58 DB 58 ; CHAR 'X'
004A41A0 21 DB 21 ; CHAR '!'
004A41A1 09 DB 09
004A41A2 09 DB 09
004A41A3 02 DB 02

Вот этот самый JMP HC.0047E860 - переход на OEP. Этот самый 0047E860 и есть OEP. Запишите его листок of paper. Теперь ставим бряк на эту строку, предварительно выделив её щелчком мыши :)))) , а затем жмите F2(toggle breakpoint). Теперь нажимаем на F9(Run) и должны брякнуться на строке, выделенной красным цветом(на ней брейкпоинт). ОК. Теперь F8, и Мы в официальной секции кода программы, а значит она распакована.
Значит так, а теперь запускаем мой любимый PEditor , жмем tasks и выбираем наш процесс и делаем ему Dump(full) - в меню по правой кнопке. Теперь открываем дамп в этом же PEditor, вписываем число в Entry Point. Высчитать это число можно по формуле:
EP=OEP-ImageBase
ImageBase обычно равен 400000, а вообще оно написано, приглядитесь(рядом с Entry Point :). OEP в нашем случае это то, где мы сейчас стоим. То есть куда совершился прыжок(JMP HC.0047E860). Кстати HC - этот просто имя модуля (прога hc.exe). Мы стоим на 47E860 и это OEP, а значит Entry Point вписать надо такой 47E860-400000. Это равно 0007E860 - такое число и пишите.

Теперь нажимаем Apply Changes и покажется веселое окошко "Yepp... The file was updated succesfuly". Пора нажать Checksum и нажать на кнопку correct it!
OK. Теперь дамп по идее должен запускаться и иметь размер больше запакованного.
Как же поступить, если у вас PE tools? Да так же дампите и делаете Rebuild PE, предварительно настроив опции, как говорилось выше.

(*) Приложение:
1. Настройка OllyDbg. >>>>>>>
Жмем Alt-O (Options->Debugging Options)
В разделе Security убираем флажок "Warn when breakpoint is outside the code section". Это избавит нас от лишних предупреждений.
Теперь в разделе SFX очень важно, чтобы было выбрано "Stop at Entry if Self-Extractor". Иначе нам не найти OEP и не прописать Entry Point и вообще не распаковать. Это опция включена по умолчанию, ноо Вы могли скачать уже "настроенную" кривыми лапами программу. Можно выбрать и Trace real entry blockwise и при запуске он потрейсит и можно сразу дампить, но тогда вам не найти OEP(он будет изображен не как PUSH EBP , а как DB , а там таких DB - море!). Тогда можете открыть в PEiD прогу и в Menu выбрать OEP Module, но это на любителя, хотя и быстро.

2. Распаковка ASPack. >>>>>>>
Ну это для тех, кто и с SoftICE ничего не распаковывал и не знает особенностей этого паковщика. Тут в принципе отличия мизерные и обусловлены они различным алгоритмом распаковки ASPack и UPX. В UPX переход на OEP - это JMP. В ASPack же - это RET. То есть пролистывая экран вам надо искать не
004A4192 . 83C7 02 ADD EDI,2
004A4195 .^EB E2 JMP SHORT HC.004A4179
004A4197 > 61 POPAD
004A4198 .-E9 C3A6FDFF JMP HC.0047E860

А вот такой код, характерынй для ASPack

007063AF 61 POPAD
007063B0 75 08 JNZ SHORT REACTOR.007063BA // Вот этот джамп должен сработать, если прога нормально работает
007063B2 B8 01000000 MOV EAX,1
007063B7 C2 0C00 RETN C
007063BA 68 00000000 PUSH 0
007063BF C3 RETN // А вот это переход на OEP. На нем надо поставить брейкпоинт(F2). Дальше все как с UPX - Run, OEP, Dump, Entry Point, Checksum.
Обратите внимание на PUSH 0 здесь. Olly не знает, что здесь сохранится при запуске. Но после выполнения команд(Run) уже всё ясно. Этот PUSH 0 станет
007063BA 68 C8186100 PUSH REACTOR.006118C8
006118C8 - это OEP. REACTOR - это исследуемая программа. Скачать её можно на http://www.zaural.net/users/fido5012/reactor.rar - на примере этой проги Denis N. Voituk в ФИДО просил объяснить ему, как распаковывать вручную ASPack и у него получилось. Предлагаю потренироваться на ней.

2b. Я нашел программу(какой-то эмулятор SNES), может и нешароварную(не запустилась), но пролистыванием экрана popad и переход на OEP не найти. Может шифровка или еще что-то, но факт тот, что придется трассировать весь распаковщик, обходя циклы, пока не найдете заветных строк(переход на OEP).

Как трассировать? Идти пешком по F8. Заходить по F7 во все call, которые близко(обычно только первый встретившийся) и трейсим по F8, пока не найдем цикл:
008E34F6 E9 14000000 JMP ZSNEESW.008E350F
008E34FB E3 E5 JECXZ SHORT ZSNEESW.008E34E2
008E34FD C7 ??? ; Unknown command
008E34FE FA CLI
008E34FF 6972 EF 91273A98 IMUL ESI,DWORD PTR DS:[EDX-11],983A2791
008E3506 B1 81 MOV CL,81
008E3508 9C PUSHFD
008E3509 C3 RETN
008E350A F9 STC
008E350B 138F 63980FBF ADC ECX,DWORD PTR DS:[EDI+BF0F9863]
008E3511 CB RETF ; Far return
008E3512 80B6 71CE3E9B F1 XOR BYTE PTR DS:[ESI+9B3ECE71],F1
008E3519 81CA D1F4DFE6 OR EDX,E6DFF4D1
008E351F 43 INC EBX
008E3520 81C5 33FEE548 ADD EBP,48E5FE33
008E3526 81EE 01000000 SUB ESI,1
008E352C B1 1A MOV CL,1A
008E352E E9 1C000000 JMP ZSNEESW.008E354F
008E3533 3105 3B84A373 XOR DWORD PTR DS:[73A3843B],EAX
008E3539 26:E9 29510564 JMP 64938668 ; Superfluous prefix
008E353F E7 10 OUT 10,EAX ; I/O command
008E3541 6F OUTS DX,DWORD PTR ES:[EDI] ; I/O command
008E3542 6901 4161F493 IMUL EAX,DWORD PTR DS:[ECX],93F46141
008E3548 8409 TEST BYTE PTR DS:[ECX],CL
008E354A 86A9 C5DBCA8B XCHG BYTE PTR DS:[ECX+8BCADBC5],CH
008E3550 D366 8B SHL DWORD PTR DS:[ESI-75],CL
008E3553 EF OUT DX,EAX ; I/O command
008E3554 B9 693FB73F MOV ECX,3FB73F69
008E3559 81FA 4012DBCC CMP EDX,CCDB1240
008E355F 0F85 91FFFFFF JNZ ZSNEESW.008E34F6
008E3565 E9 1C000000 JMP ZSNEESW.008E3586

На последней строке, которая вне цикла(008E3565 E9 1C000000 JMP ZSNEESW.008E3586). Ставите бряк по F2 и жмем F9, должно брякнуться. Идем дальше(все по F8). Нашелся такой код:
008E3000 90 NOP
008E3001 >60 PUSHAD
008E3002 E9 3D040000 JMP ZSNEESW.008E3444
008E3007 E8 24040000 CALL ZSNEESW.008E3430
008E300C EB 00 JMP SHORT ZSNEESW.008E300E
008E300E BB 30394400 MOV EBX,ZSNEESW.00443930
008E3013 03DD ADD EBX,EBP
008E3015 2B9D D03F4400 SUB EBX,DWORD PTR SS:[EBP+443FD0]
008E301B 83BD FC494400 00 CMP DWORD PTR SS:[EBP+4449FC],0
008E3022 899D FC494400 MOV DWORD PTR SS:[EBP+4449FC],EBX
008E3028 0F85 66030000 JNZ ZSNEESW.008E3394
008E302E C785 33394400 000>MOV DWORD PTR SS:[EBP+443933],0
008E3038 8D85 044A4400 LEA EAX,DWORD PTR SS:[EBP+444A04]
008E303E 50 PUSH EAX
008E303F FF95 004B4400 CALL DWORD PTR SS:[EBP+444B00]
008E3045 8985 004A4400 MOV DWORD PTR SS:[EBP+444A00],EAX
008E304B 8BF8 MOV EDI,EAX
008E304D 8D9D 114A4400 LEA EBX,DWORD PTR SS:[EBP+444A11]
008E3053 53 PUSH EBX
008E3054 50 PUSH EAX
008E3055 FF95 FC4A4400 CALL DWORD PTR SS:[EBP+444AFC]
008E305B 8985 FC3F4400 MOV DWORD PTR SS:[EBP+443FFC],EAX
008E3061 8D9D 1E4A4400 LEA EBX,DWORD PTR SS:[EBP+444A1E]
008E3067 53 PUSH EBX
008E3068 57 PUSH EDI
008E3069 FF95 FC4A4400 CALL DWORD PTR SS:[EBP+444AFC]
008E306F 8985 00404400 MOV DWORD PTR SS:[EBP+444000],EAX
008E3075 8D85 B5394400 LEA EAX,DWORD PTR SS:[EBP+4439B5]
008E307B FFE0 JMP EAX

Вот после JMP EAX смело листайте вниз и найдете нужные строки, которых не было. Дальше, как я уже писал.

3. Как отловить переход на OEP у других пакеров. >>>>>>>

Я приводил место перехода на OEP у ASPack и UPX. И, если Вы заметили, там присутствует команда POPAD. Это почему-то характерно для многих пакеров и даже для самопальных. То есть Вы, когда стоите на начале распаковщика(обычно это команда PUSHAD), листаете вниз, пока не найдете POPAD. После него обычно джамп(часто безусловный) или ret. Вот это и переход на OEP.

4. Послесловие. >>>>>>>
Способ очень простой и продлеать его вполне возможно. Объяснять старался максимально доступно и думаю, что у Вас тоже получится. Еще раз повторю: используйте для снятия дампа ТОЛЬКО PEditor by yoda или PE tools. Вроде наклевывается дело с LordPE, но его для этого нужно по-хорошему настроить. Его дампового движка достаточно, если дампить из-под SoftICE или TRW2000, но не с OllyDbg. Попробуйте подкрутить настройки и, если у Вас всё получится, напишите мне на - буду рад. Я лично это дело ковыряю и может быть внесу потом изменения в эту статью. Сообщите, если Вы исследовали другой пакер и нашли место перехода на OEP. А так всегда готов к вашим ответам!

Освоил Unpack и научил Вас bi0w0rM[HWO] ; туториал от 2003 года с 4 -на 5 сентября.
Ни в коем случае этот способ не был ни у кого срезан, а полностью додуман мной. Так что если Вы тоже так делаете, то ни один Вы такой умный :)
СТАТЬЮ уносить с сайта не РАЗРЕШАЕТСЯ и не РЕКОМЕНДУЕТСЯ без разрешения автора, то бишь меня. Стучитесь в аську 257390724 или в е-мыл - обсудим на взаимовыгодных правах(без денег :).
Пока!


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






Hosted by uCoz