Главная » Статьи » Распаковка

Распаковка tElock 0.98
0. Что нужно:
- любая прога с tElock 0.98
- кучка съедобных мозгов
- руки, управляемые этими мозгами
- подстриженные ногти, чтоб удобно барабанить по клаве
- OllyDbg 1.10 с плугинами и прочей херью
- ImpRec 1.6f + плугин bi0w0rM’а для tElock


1. Поиск OEP
Найти OEP совсем легко. Засовываем прогу в OllyDbg, заходим в Debugging Options->Exceptions и игнорим все типы исключений:



Ну и воспользуемся плугином для прятания IsDebuggerPresent, нажмем Hide.
Теперь думаем... когда будет распаковываться 2-я секция(тут olly сказал, что она содержит data), то по идее 1-я секция(секция кода) должна быть уже распакована, а нам как раз в нее и надо :) Тогда заходим в OllyDbg Memory Map(Alt+M) и ставим memory breakpoint на запись второй секции:



пускаем прогу, брякнулись здесь:

006BDDA8 AA STOS BYTE PTR ES:[EDI]
006BDDA9 69D2 A5B0CD4B IMUL EDX,EDX,4BCDB0A5

006BDDAF F9 STC

006BDDB0 72 02 JB SHORT lawyerr.006BDDB4
В EDI VirtalAddress второй секции... Теперь надо бы попасть в секцию кода, то есть словить момент, когда EIP окажется в ее адресном пространстве. поэтому можно предположить, что если мы поставим memory breakpoint on access на эту секцию, то он нигде больше не сработает, кроме как на OEP, ставим memory breakpoint on access первой секции :) И бряк должен сработать на "on execution", прямо на OEP:

0061E0AC 55 PUSH EBP
0061E0AD 8BEC MOV EBP,ESP
0061E0AF 83C4 E8 ADD ESP,-18
0061E0B2 53 PUSH EBX
0061E0B3 56 PUSH ESI
0061E0B4 33C0 XOR EAX,EAX
0061E0B6 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
0061E0B9 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX
0061E0BC 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
0061E0BF B8 F4D96100 MOV EAX,lawyerr.0061D9F4
0061E0C4 E8 4FA2DEFF CALL lawyerr.00408318
спертых байтов нет, красота! Пропишем в ImpRec RVA адрес OEP - 21E0AC(то есть VA_адрес(0061E0ACh) - ImageBase(00400000h)). Пропишем в ImpRec такой OEP, RVA и размер таблицы импорта он определит вроде правильно. Жмем IAT AutoSearch, Get Imports. видим, что не все функции определились. в версии 1.6 есть хорошая опция - Disassemble/HexView, дизасмим любую кривую функцию:



Хехе :) Производится переход по DWORD значению из адреса C00734+1 - по этому адресу лежит адрес нужной API-функции, хитр0 :) для таких целей был написан плугин, поставляется с ImpRec, но его не достаточно для версии 0.98! Поэтому я взялся за написание. Этот плагин можно взять здесь . После него импорт можно прикрутить к дампу(Fix Dump...). вот и все!


Источник: http://www.dotfix.net/
Категория: Распаковка | Добавил: -=Hellsing=- (17.06.2009) | Автор: bi0w0rM E
Просмотров: 2818 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]