Unpacking EXEs ручками :))

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


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

======================================================
!Чтобы по-хорошему врубиться, надо прочесть несколько раз!
!Пожалуйста, прочтите это всё внимательно и спокойно, не бросая на половине пути!
======================================================
Tutorial:
Hi, ALL!
Вот скажите, вам нравится искать кряки? Мне нет. Скажу честно(МВД, я вру :)) я искал кряк только для TRW2000 на CRACKS.AM . Мне позорно искать кряки и применять их! Я стараюсь всё ломать сам. Этим я не хочу показать себя крутым крэкером, но дело в честности и чести. Вот вам такая притча: перед тобой ламерская(или не очень) рожа шакала. Ухмыляется, бздит и плюёт в тебя гадкой ядовитой слюной. Что ты сделаешь: позовешь папу(рульного фазера и супермена), чтобы он дал ей дубиной или же захочешь врезать сам? Вот и тут: ты прячешься за чужую задницу, юзая чужой кряк - ты беспомощен и позвал на помощь папу. Ладно, не поспишь ночь(а может 5 минут :)) и что? Зато результат есть, FORCE WITH ME! С тобой тоже сила? Ты крякер? Ну давай ломать проги и экономить! Это дело чести... А думаете почему я искал кряк к TRW2000? Потому что я не лишаю куска хлеба автора проги, так как он TRW больше не делает. Ага. Значит уже тут я ламер и не смог сломать TRW? Тоже нет: размер патченного TRW отличается от обычного, а это значит, что пришили доп. функции, которые были недоступны! А достать их могли только из полной версии или выудив из СофтАйса на худой конец, что мало вероятно. Тем более патч размером почти в 2 раза больше, чем патченный файл - TRW2000.SYS, вот так вот...
Ладно, что там TRW.. Этой статьей я вас научу совсем другому! А именно распаковывать проги вручную! РЕчь идет не об RAR и ZIP, если не знаете, а об EXE-packer'ах! Здесь тоже дело чести и совести: заюзать AutoUnpacker или сделать это вручную. Кому пофигу - юзайте GUW32 или Unpack в ProcDump, а дальше не читайте, но если Вы REAL 31337 Cracker , а не FAKE-MAN, то приступим...
1) ASPack unpaЦking >:-]~
Краткая инфа: этот пакер сделал Алексей Солодников, который является также автором протектора ASProtect. Чтобы определить, висит ли этот пакер на проге, достаточно открыть прогу в PEiD и он нам покажет ASPack 2.12 -> Alexey Solodovnikov. Версия может быть и не 2.12, а что-нить и порульней/нерульней. Но Мы знаем, что shareware-программеры пакуют им проги не только для уменьшения размера, но и для защиты! Если интересно, почитай мою статью про XnView - там был ASPack, но PEiD этого не знал. А может там был другой пакер или новая версия, а ASPack просто подставили, но код был похож на ASPack'у. Короче, как узнал: открыл прогу в PEditor и смотрел sections - там есть секция .aspack, но крэкерам иногда пудрят мозги, переименовывая её в во что-нибудь другое. Пример: секция .daat - в проге Offlie Explorer.
Распаковка:
Вообще распаковка любой проги идет так: трассируется с самого начала по F10 до того, как из секции распаковщика .aspack дело перейдет в секцию .code или ... Ну в общем, как компилер сделал. Чтобы попасть в начало проги, есть два способа:
- Loader... Если Вы юзаете SoftIce, то откройте прогу в Symbol Loader'е и загрузите(кнопка с шестернеками). Если TRW2000 - там сразу откроется перед вами лоадер.
- Break'n'Enter... Такая фича есть в PEditor'ах LordPE и в PEditor by Yoda. Он просит Вас набрать в Софтайсе bpint3 и нажать ОК. Появится айс и вас просят ввести строку типа eb eip 60 или 90. Если в айсе такого не напечатали, покрути вверх консоль, где ты вводишь команды - сообщения айса прикрыли своей длинной его.

Сначала откроем прогу в PEditor'e и смотрим на секции. Если имен секций нет, значит найдем по размеру самую большую секцию, а если имена гадкие программеры не потерли, то секция .text - секция кода. Есть еще CODE при другом компиляторе, но Вы тут размер(size) сравните... Так вот у этой секции ставьте в Characteristics не C0000040, а E0000020, сохраните.

Давайте использовать Symbol Loader. Загрузили... Нет не загрузили - загружать нечего :)) Для исследования я выбрал Оперу. Opera 7.0 запакована как раз АСПаком версии 2.12. Загрузили. F10(если TRW) и Мы тут:
018F:006D4000 90 NOP
018F:006D4001 60 PUSHAD
018F:006D4002 E803000000 CALL 006D400A <<== Зайдем
018F:006D4007 E9EB045D45 JMP 45CA44F7
018F:006D400C 55 PUSH EBP
018F:006D400D C3 RET
018F:006D400E E801000000 CALL 006D4014 <<== Зайдем
018F:006D4013 EB5D JMP 006D4072
Движемся по F10... Там, где я написал "<<== зайдем", жмите F8 и проберетесь в этот call. Дальше делаем всё сами, не заходя в call'ы - не надо. Описывать каждый шаг глупо, так что дам лишь общие рекомендации:
- Идете по F10, Идете, идете, идете... Вам буду встречаться циклы. Кто знаком с программированием, те знают,что это. Типа вот этого на языке C++
int counter;
for(counter = 0; counter < 100; counter++)
{
cout << "ASPack To Unpack!";
}
Это значит, что на экране будет 100 надписей ASPack To Unpack. То есть это действие будет, пока число counter, равное нулю, не будет равно 100!
На ассемблере циклы выглядят иначе
01 ........ .........
02 ........ Некий код
03 ........ .........
04 cmp ..., ...
05 jne 01 // прынаем на 01
06 call ....
В софтайсе при конце такого цикла jne уже не прыгает и при определенных условиях (NO JUMP). А зачем нам мотаться по всему циклу? Это SUXX! То есть надо поставить брейкпоинт на следующую команду после jne - на 06 сall .... . Для этого В Айсе достаточно кликнуть два раза по этой строке (06) и нажать F5. Если не уверенны, что правильно кликнули, проверьте себя айсовской командой bl - список бряков. Циклов встретится не так уж много на пути анпака, но стоит вам рассказать про некоторые. Трассируйте..
Есть иные циклы не с условным переходом типа jnz или jne, а с безусловным jmp. Вот в такое место вас забросит аспак:
==> 006D412D 0BC9 OR ECX,ECX С Ю Д А
018F:006D412F 742E JZ 006D415F
018F:006D4131 782C JS 006D415F
018F:006D4133 AC LODSB
018F:006D4134 3CE8 CMP AL,E8
018F:006D4136 740A JZ 006D4142
018F:006D4138 EB00 JMP 006D413A
018F:006D413A 3CE9 CMP AL,E9
018F:006D413C 7404 JZ 006D4142
018F:006D413E 43 INC EBX
018F:006D413F 49 DEC ECX
018F:006D4140 EBEB JMP 006D412D (JUMP ) ВВЕРХ
Из этого цикла мы выбиремся так: есть прыжок JZ 006D415F и он когда-либо сработает и прыгнет на 006D415F. Вот найдите эту строку 006D415F - pop и F5... Всё ОК? Ты ещев айсе? Значит этот цикл пройден! Далее будет еще цикл. Он простой с jne - ставьте бряк на следующую строку с push. Далее будет большой цикл и я посмею привести его листинг:
018F:006D4283 03F2 ADD ESI,EDX
018F:006D4285 8B460C MOV EAX,[ESI+0C]
018F:006D4288 85C0 TEST EAX,EAX
018F:006D428A 0F840A010000 JZ 006D439A
018F:006D4290 03C2 ADD EAX,EDX
018F:006D4292 8BD8 MOV EBX,EAX
018F:006D4294 50 PUSH EAX
018F:006D4295 FF954D0F0000 CALL [EBP+00000F4D]
018F:006D429B 85C0 TEST EAX,EAX
018F:006D429D 7507 JNZ 006D42A6
018F:006D429F 53 PUSH EBX
018F:006D42A0 FF95510F0000 CALL [EBP+00000F51]
018F:006D42A6 898545050000 MOV [EBP+00000545],EAX
018F:006D42AC C7854905000000000000MOV DWORD PTR [EBP+00000549],00000000
==> 006D42B6 8B9522040000 MOV EDX,[EBP+00000422]
018F:006D42BC 8B06 MOV EAX,[ESI]
018F:006D42BE 85C0 TEST EAX,EAX
018F:006D42C0 7503 JNZ 006D42C5
018F:006D42C2 8B4610 MOV EAX,[ESI+10]
018F:006D42C5 03C2 ADD EAX,EDX
018F:006D42C7 038549050000 ADD EAX,[EBP+00000549]
018F:006D42CD 8B18 MOV EBX,[EAX]
018F:006D42CF 8B7E10 MOV EDI,[ESI+10]
018F:006D42D2 03FA ADD EDI,EDX
018F:006D42D4 03BD49050000 ADD EDI,[EBP+00000549]
018F:006D42DA 85DB TEST EBX,EBX
018F:006D42DC 0F84A2000000 JZ 006D4384
018F:006D42E2 F7C300000080 TEST EBX,80000000
018F:006D42E8 7504 JNZ 006D42EE
018F:006D42EA 03DA ADD EBX,EDX
018F:006D42EC 43 INC EBX
018F:006D42ED 43 INC EBX
018F:006D42EE 53 PUSH EBX
018F:006D42EF 81E3FFFFFF7F AND EBX,7FFFFFFF
018F:006D42F5 53 PUSH EBX
018F:006D42F6 FFB545050000 PUSH DWORD PTR [EBP+00000545]
018F:006D42FC FF95490F0000 CALL [EBP+00000F49]
018F:006D4302 85C0 TEST EAX,EAX
018F:006D4304 5B POP EBX
018F:006D4305 756F JNZ 006D4376
018F:006D4307 F7C300000080 TEST EBX,80000000
018F:006D430D 7519 JNZ 006D4328
018F:006D430F 57 PUSH EDI
018F:006D4310 8B460C MOV EAX,[ESI+0C]
018F:006D4313 038522040000 ADD EAX,[EBP+00000422]
018F:006D4319 50 PUSH EAX
018F:006D431A 53 PUSH EBX
018F:006D431B 8D8575040000 LEA EAX,[EBP+00000475]
018F:006D4321 50 PUSH EAX
018F:006D4322 57 PUSH EDI
018F:006D4323 E998000000 JMP 006D43C0
018F:006D4328 81E3FFFFFF7F AND EBX,7FFFFFFF
018F:006D432E 8B8526040000 MOV EAX,[EBP+00000426]
018F:006D4334 398545050000 CMP [EBP+00000545],EAX
018F:006D433A 7524 JNZ 006D4360
018F:006D433C 57 PUSH EDI
018F:006D433D 8BD3 MOV EDX,EBX
018F:006D433F 4A DEC EDX
018F:006D4340 C1E202 SHL EDX,02
018F:006D4343 8B9D45050000 MOV EBX,[EBP+00000545]
018F:006D4349 8B7B3C MOV EDI,[EBX+3C]
018F:006D434C 8B7C3B78 MOV EDI,[EDI+EBX+78]
018F:006D4350 035C3B1C ADD EBX,[EDI+EBX+1C]
018F:006D4354 8B0413 MOV EAX,[EDX+EBX]
018F:006D4357 038545050000 ADD EAX,[EBP+00000545]
018F:006D435D 5F POP EDI
018F:006D435E EB16 JMP 006D4376
018F:006D4360 57 PUSH EDI
018F:006D4361 8B460C MOV EAX,[ESI+0C]
018F:006D4364 038522040000 ADD EAX,[EBP+00000422]
018F:006D436A 50 PUSH EAX
018F:006D436B 53 PUSH EBX
018F:006D436C 8D85C6040000 LEA EAX,[EBP+000004C6]
018F:006D4372 50 PUSH EAX
018F:006D4373 57 PUSH EDI
018F:006D4374 EB4A JMP 006D43C0
018F:006D4376 8907 MOV [EDI],EAX
018F:006D4378 83854905000004 ADD DWORD PTR [EBP+00000549],04
018F:006D437F E932FFFFFF JMP 006D42B6 (JUMP )

Всем заправляет вот это JMP! Внутри цикла я находил условный джамп и он кидал меня дальше. Но скоро близко конец и давайте лучше просто прокрутим окно с кодом вниз и найдем вот такой код:
018F:006D43A7 0BC9 OR ECX,ECX
018F:006D43A9 8985A8030000 MOV [EBP+000003A8],EAX
018F:006D43AF 61 POPAD
018F:006D43B0 7508 JNZ 006D43BA
Это конец! В принципе, можно было и не обходить циклы, но это тренировка для мозгов. А так просто зашли бы Symbol Loader'е, а дальше крутите вниз окно кода пока не увидите вот эту фигню с popad :)) Поставьте на нее бряк, double-click'нув на нее(если Вы в TRW2000, то F9). Короче, анпак всё время начинается с pushad, а кончается popad :)) Ну как, просто? Так вот, брякнитесь на popad. Наберите вот это, если у вас SoftICE:
d eax
EAX сейчас 5F9BF5. Запишем это на бумажку.
Потом идете по F10 пока не встанете на
ret
Всё, можно дампить. Сначала зациклим. Пишите
a eip жмем // Ввод асм-кода
jmp eip жмем // Прыгаем сами на себя, тИпА
жмем
Если же у Вас не SoftICE, а TRW2000, то зацикливаем чуть по-другому(так даже прикольней):
Когда стоим на ret, жмем F10 и попадаем на Original Entry Point, который начинается с push ebp. Запоминаем адрес, на котором стоим(5F9BF5) и пишем suspend.
F5. Всё прога зациклена. Теперь в ProcDump'е в tasklist'е делаем у процесса opera.exe Dump(Full). Всё. Теперь Kill task. Мы записали на листок некое число - это OEP. В PEditor'е пропишем его в поле Entry Point вместо того, что там сейчас стоит. ТО есть не совсем его.... Смотрим, сколько у него ImageBase. Обычно оно равно 400000.
5F9BF5-400000 = 1F9BF5
Вот давайте 1F9BF5 в Entry Point и запишем! Теперь давайте-ка у всех секций Characteristics сделаем E0000020, а не C0000040, как было, а иначе не попатчится и нераздизассемблируется. Все. Прога полностью распакована и готова для патча/дизасма.
Конечно, может понять слегка трудновато, но прочтите это несколько раз, чтобы врубиться :)) А если не хочешь думать, то YOU SUCK!

2) UPX UNPAцKING ;))
Есть еще такой паковщик - UPX. В отличие от описанного выше ASPack, он совершенно бесплатен и сжимает вроде даже лучше, а особенно его новые версии. Распаковать можете легко:
- При помощи самого UPX при помощи аргумента(CommandLine) -d [ИМЯ ФАЙЛА].
- ProcDump. Unpack->UPX
- руками:
Тут отличие от ASPack мизерные. Так же начинается с pushad, а кончается popad. Делаем всё также. Только прыжок на Entry Point происходит не при помощи ret, а при помощи jmp OEP
Вот так и должно быть:
018F:004B134A EBE1 JMP 004B132D
018F:004B134C FF96142E0B00 CALL [ESI+000B2E14]
018F:004B1352 61 POPAD
018F:004B1353 E978F1FBFF JMP 004704D0 (JUMP )
018F:004B1358 7013 JO 004B136D
018F:004B135A 4B DEC EBX
018F:004B135B 0080134B00D4 ADD [EAX+D4004B13],AL
018F:004B1361 3447 XOR AL,47
По адресу 4B1353 происходит прыжок на OEP и распаковка официально закончилась. Следовательно OEP = 004704D0

Опять впишем правильный EPoint и подправим секции на E0000020.

3) Завершая.......
Вот Мы и научились распаковывать различные пакеры. Напоследок я приложу своеобразную краткую инструкцию по распаковке на примере ASPack. Вырезал из своей же статьи по распаковке и ломке XnView:
1. Врываемся в прогу через Symbol Loader
2. Удостоверимся, что стоим на pushad
3. Скроллим окно кода вниз, пока не найдем popad
4. Ставим бряк на popad, щелкнув по нему два раза(если TRW2000, то жмем F9). Жмем F5.
5. Доходим по F10 до ret и смотрим, что в eax
d eax
6a. Если Вы юзаете SoftICE , запишите адрес на бумажку и наберите:
a eip
jmp eip
Закончим ввод асм-кода - Enter
6b. Если Вы юзаете TRW2000, нажмите F10 и попадете на
push ebp
Запомните, по какому адресу это всё стоит и наберите SUSPEND. Этот адрес - OEP
!ПРОГА ЗАЦИКЛЕНА!
7. В ProcDump дампим(Full Dump) нашу прогу и делаем Kill task. ДАМП получен.
8. Для всех: Открываем ДАМП в PEditor, смотрим, сколько ImageBase и в Entry Point вписываем число по формуле
EP=OEP-ImageBase
9. Открываем сдампленную программу в PEditor'е и у всех секций Section Characteristics делаем E0000020 вместо C0000040
OK! Вроде ничего не забыл :))

И еще... Если ты ломаешь прогу, PEiD сказал, что не запакована и секции обычные, а дизасмится фигово. То найди секцию с C0000040 и смени это дело на E0000020.

Пока! Если что непонятно - пиши! Мыло вверху.


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






Hosted by uCoz