Защита ActiveMark в игре Robot Arena
{codecitation class=»brush: pascal; gutter: false;» width=»600px»}
Автор: 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 сделана. Строишь боевых роботов, а потом пилишь, режешь, крушишь, протыкаешь насквозь, таранишь… ну в общем хорошо время проводишь 🙂
{/codecitation}