Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Распаковка и восстановление файлов упакованых tElock 0.98

Автор: Hex

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

Инструменты: 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..

Это кусок импорта! Теперь делаем хитрую вещь... /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 завершить "косметику" :)

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay