RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

Распаковка и восстановление файлов упакованых tElock 0.98

О защите: Полиморфный упаковщик, как обычно с антидебаговыми примочками, поганит импорт, секции в файле обзывает именами других упаковщиков. Вот так :(

Инструменты: Softice, IceDump, Imprec.

Как найти OEP: bpx GetModulehandleA, потом /tracex imagebase xxxxxx , где xxxxxx число примерно пониже базы распаковщика.

А вот с импортом не все так просто. Взяв Imprec будет сразу видно что 2 секции никак не востанавливаются. И элементы этих секций указывают на какие-то разные области памяти, даже не в области упаковщика. Если глянуть в эти области, то нас постигает огромный облом... Некоторые элементы указывают в пустые куски памяти (те что с ?? ?? ...), а остальные указывают на вызовы процедур из библиотек через полиморфные куски кода!!! Хана... Это ж даже не подизасмишь. Но выход есть! Берем к примеру первый не найденый элемент к примеру 5b140 ссылается на 700000. Смотрим на код по адресу 700000. Он имеет вид:

0167:00700000  JMP       00700005
0167:00700002  JMP       EBX
0167:00700004  INVALID
0167:00700006  NOP
0167:00700007  PUSH      ES
0167:00700008  JO        0070000A
0167:0070000A  INC       EAX
0167:0070000B  PUSH      DWORD PTR [EAX]
0167:0070000D  RET

Делаем u 00700005 и видим:

0167:00700005  MOV       EAX,00700690
0167:0070000A  INC       EAX
0167:0070000B  PUSH      DWORD PTR [EAX]
0167:0070000D  RET

теперь делаем d 00700690+1 (+1 тошо inc eax).
Видим:
0167:00700691 D1 AB F8 BF A3 B9 F7 BF-7E B9 F7 BF 9F 42 F8 BF  ........~....B..
0167:007006A1 B9 41 F8 BF E7 FF F7 BF-D4 49 F7 BF B8 48 F7 BF  .A.......I...H..
0167:007006B1 D7 13 F8 BF 65 43 F7 BF-3C 43 F7 BF 1A 06 FA BF  ....eC..<С...... 
0167:007006C1 A3 7D F7 BF 85 7D F7 BF-AD 73 F7 BF 36 73 F7 BF  .}...}...s..6s.. 
0167:007006D1 ED 12 F9 BF 59 EA F9 BF-B1 77 F7 BF AC 6D F7 BF  ....Y....w...m.. 
0167:007006E1 1A 77 F7 BF FB 76 F7 BF-B4 20 F8 BF E2 50 F8 BF  .w...v... ...P.. 
0167:007006F1 AC C5 F8 BF A0 E0 F8 BF-5B 7B F7 BF C4 64 F7 BF  ........[{...d.. 
0167:00700701 CA D4 F8 BF D5 6F F7 BF-DC D6 F9 BF 3F 71 F7 BF  .....o......?q.. 
0167:00700711 A0 C3 F9 BF 5F 83 F8 BF-3D 70 F7 BF 83 06 FA BF  ...._...=p...... 
0167:00700721 74 57 F7 BF B5 6F F7 BF-85 58 F7 BF DF 7A F7 BF  tW...o...X...z..
0167:00700731 64 E0 F7 BF 00 00 00 00-00 00 00 00 00 00 00 00  d...............
Это кусок импорта! Теперь делаем хитрую вещь... /dump 700691 a4 c:\1.dmp и /load 45b140 a4 c:\1.dmp
Я подменил кусок таблицы импорта на реальные адреса апи функций.
Прога на этот момент запущена. И прекрасно работает ничего не заметив. Так мы поборем полиморфные вызовы.
Остаются вызовы которые ведут в никуда. В никуда они вести не могут. Поэтому нужно просто глянуть на эти места когда EIP=OEP :)
И действительно! В момент когда прога тока собирается запустится, все наместе и можно дописать оставшиеся куски. Там тоже будут полиморфы.
Еще останется несколько вызовов процедур типа:
0167:00700338  MOV       EAX,0046C48D
0167:0070033D  NOP
0167:0070033E  PUSH      DWORD PTR [EAX]
0167:00700340  RET
Причем по адресу 46C48D или ноль идет или пустота...
Поэтому ячейки которые указывают на такие процедуры нужно просто отсекать (cut thunks).

Итак нужно просто остановить прогу на OEP скопировать правильные адреса в таблицу импорта, а потом дать проге запуститься и дальше уже в Imprec завершить "косметику" :)


<= Вернуться к статьям


Rambler's Top100