скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Защита 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. Пришлось найти плагин :)

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






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook