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

Защита ActiveMark в игре Robot Arena

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 сделана. Строишь боевых роботов, а потом пилишь, режешь, крушишь, протыкаешь насквозь, таранишь... ну в общем хорошо время проводишь :)


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


Вас может заинтересовать:
На киноблоге http://loadmovie.info/ выкладываются свежие рецензии на фильмы кинопремьеры.
Rambler's Top100