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

На конкурсе компьтерных вирусов победил новый полиморфный вирус, который 20 раз выводит на экран надпись "Hello World!", а затем уничтожает мир.

Activemark тут ваще наглый, дает поиграться тока 10 минут. Это тока робота собрать успеваешь - уже выходить надо. И даже сейвится не дает :(

Инструменты: TRW2000 и Hiew

Веселая такая это вещь. Айс не любит, причем каким-то способом похожим на тот что в SEPP. FrogSice такого не знает. На OpenProcess отвечает самоуничтожением. Т.е. ни дамп тебе снять ни импорт восстановить... Мне это уже надоедать стало как-то... Все норовят одно и тоже сделать.

Раз с айсом под 98 такие проблемы - есть 2 выхода:

1) Уйти в win 2k (там почему-то половина фокусов ActiveMark не пашет)
2) Взять TRW 2k

Магическое 2к :) Я решил взять TRW, потому что он у мя был :) А винду надо ставить.

Для тех кто не видел TRW:

TRW это дебагер по функциональности сравнимый с Softice. Интерфейс один в один, команды тоже на 90% похожи. Многие разработчики защит забывают про это чудо, и направляют все усилия на то чтоб любой ценой поймать айс, чем оставляют огромную дыру для TRW :) Чем хорош TRW? Запускается прям из винды. Т.е. как обычная прога (я знаю что softice из driverstudio тоже можно запустить в manual режиме, а у мя не из DS и еще win98, а не 2k). Когда не нужен - можно его спокойно закрыть и работать без дебагера :) Т.е. запустил прогу без дебагера, а потом запустил TRW и пошел дебагить :) Loader у TRW гораздо круче. Он всегда загружает exe и останавливает на EP, не то что айсовский... пока ему не поставишь атрибут E0000060 на секцию кода - работает через раз :( Чо ж его все не юзают? А потому что сырой он... Нету back trace, нету bpr, proc тоже глючная. Низя делать брейкпоинты с условиями :( И есть еще не мало мелочей софтайса, которые перебивают все достоинства TRW. Жалко что на него(TRW) забили и больше не делают :( Вызывается оно через CTRL-M, ну а выход стабильно F5.

Ищем OEP

Итак отрубаем айс. Запускаем TRW. Загружаем robot_arena.exe через Loader. Теперь для поисков oep заюзаем такую фичу: указатель стека на OEP(после распаковки) должен быть такой же как и в момент когда EIP=EP (который в PE) Т.е. не выполняем ни одной команды, а ставим bpm ESP-4. Ну дальше F5. Первое срабатывание это явно не то, видно что это все еще код распаковщика... А вот потом начнет срабатывать много раз в коде распаковщика по одному и тому же адресу. Это оно в цикле срабатывает. Тут уже ему нужно помочь. После выхода из цикла оно через JMP прыгнет на кусок где будут несколько циклов. Пролистав вниз можно увидеть команду JMP 479DD5 Это и есть OEP.

Тут надо бы прогу зациклить и снять дамп... Но не тут-то. Процдампом не покатит. Прога сразу закроется - это раз. Вовторых вы получите кривой дамп, я так понял этот Activemark гдето запускает чо-то типа thread слежения который все портит :( Дампить надо из TRW. Пришлось найти плагин :) Вот кстати линк на TRW с плагином для дампа:

http://hex.warp0.com/trw122.zip

Дампер, это конечно хорошо, но тут он глюкавый :) Скока я не пытался, но дампы размером более $A0000 этим дампером у мя сделать не вышло, а иногда даже и такого размера делать не дает... С чем связано - хз. Но сам TRW кричит "No free heap" Так что я просто по кусочкам снял дамп, а потом в волкове соединил. Дальше я сделал дампу Rebuild PE в Procdump и принялся за импорт.

Импорт

С импортом я задолбался... И так и эдак, и Imprec и Revirgin - нихрена они не работают :( Попробуйте как-нить сами в win 98 восстановите импорт для Activemark защиты этими реконструкторами... Я обиделся на них и начал уже было писать свою прогу для восстановления импорта, но тут пришла мысля: "А чо б не выдрать кусок который импорт создает внутри самого activemark?". IAT начинается с 647000 ну я и сделал bpm 647000 и начал смотреть, когда ж туда начнут записывать адреса API... А происходит это вот тут:


????????:0064C180 mov eax, [edi]
????????:0064C182 or eax, eax
????????:0064C184 jz short loc_64C1CB
????????:0064C186 mov ebx, [edi+4]
????????:0064C189 lea eax, [eax+esi+24DD60h]
????????:0064C190 add ebx, esi
????????:0064C192 push eax
????????:0064C193 add edi, 8
????????:0064C196 call dword ptr [esi+24DEC8h] - LoadLibraryA
????????:0064C19C xchg eax, ebp
????????:0064C19D 
????????:0064C19D loc_64C19D: ; CODE XREF: ????????:0064C1C3j
????????:0064C19D mov al, [edi]
????????:0064C19F inc edi
????????:0064C1A0 or al, al
????????:0064C1A2 jz short loc_64C180
????????:0064C1A4 mov ecx, edi
????????:0064C1A6 jns short near ptr loc_64C1AE+1
????????:0064C1A8 movzx eax, word ptr [edi]
????????:0064C1AB inc edi
????????:0064C1AC push eax
????????:0064C1AD inc edi
????????:0064C1AE 
????????:0064C1AE loc_64C1AE: ; CODE XREF: ????????:0064C1A6j
????????:0064C1AE mov ecx, 0AEF24857h
????????:0064C1B3 push ebp
????????:0064C1B4 call dword ptr [esi+24DECCh] - GetProcAddress
????????:0064C1BA or eax, eax
????????:0064C1BC jz short loc_64C1C5
????????:0064C1BE mov [ebx], eax
????????:0064C1C0 add ebx, 4
????????:0064C1C3 jmp short loc_64C19D
????????:0064C1C5 ; ---------------------------------------------------------------------------
????????:0064C1C5 
????????:0064C1C5 loc_64C1C5: ; CODE XREF: ????????:0064C1BCj
????????:0064C1C5 call dword ptr [esi+24DED0h] - никогда не вызывается :)
????????:0064C1CB 
????????:0064C1CB loc_64C1CB: ; CODE XREF: ????????:0064C184j
????????:0064C1CB popa
????????:0064C1CC jmp near ptr unk_56A02A - а это прыжок на OEP

То есть перед тем как прыгнуть к OEP оно создает импорт. Ну так и прекрасно. Сделаем так чтоб entry point был началом создания импорта а дальше прога сама запустится :) Делаем так:


????????:0064C174 pusha
????????:0064C175 mov esi, offset unk_401000
????????:0064C17A mov edi, offset unk_64A000
????????:0064C17F nop

И oep=0064C174. Это я просто глянул какие значения регистров были в оригинальном exe перед созданием импорта и вот так вот тупо их при старте задал :)

Все! Импорт есть!

Дамп запустился... Вылезла табличка о том что ActiveMark нету - не запущусь :Р Это дело 2 джампов :) Первый = 56А252, Второй = 56A2AC. Главное не дать RaiseException сделать. И все рульно работает.

P.S. Если дамп пашет когда проходите дебагером, а когда запускаете файл просто так, то зависает - перезагрузите комп и все будет нормально :) Activemark чо-то такое творит :)

P.S.S. Robot Arena на самом деле дважды защищен. Первый слой - распаковка Activemark. Второй слой - сам Activemark(т.е. контроль лицензий и т.д.). И только потом он прыгает на OEP самого Robot Arena. Почему бы не прыгнуть сразу на OEP самого Robot Arena? Не выйдет, т.к. кроме импорта Activemark еще и инициализирует критические секции (Critical Sections) которые Robot Arena уже сразу юзает, не инициализируя. Поэтому приходится проходить через слой Activemark :(

P.S.S.S. А ваще игрушка прикольная, по передаче Robotica с Discovery сделана. Строишь боевых роботов, а потом пилишь, режешь, крушишь, протыкаешь насквозь, таранишь... ну в общем хорошо время проводишь :)

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