· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› защита новой армадилой в программе OptiPerl 4.3 build 51

Посл.отвђт Сообщенiе


Дата: Янв 12, 2004 10:24:13

на первый взгляд все как обычно, однако функция эмуляции переходов выглядит так:

.text:007A65D6 emulJcc proc near ; CODE XREF: .text:007A9CAFp
.text:007A65D6
.text:007A65D6 tableAddr = dword ptr -4
.text:007A65D6 jmpType = dword ptr 8
.text:007A65D6 context = dword ptr 0Ch
.text:007A65D6
.text:007A65D6 push ebp
.text:007A65D7 mov ebp, esp
.text:007A65D9 push ecx
.text:007A65DA mov eax, [ebp+jmpType]
.text:007A65DD and eax, 0FFh
.text:007A65E2 mov ecx, offsets[eax*4]
.text:007A65E9 mov [ebp+tableAddr], ecx
.text:007A65EC mov edx, [ebp+context]
.text:007A65EF mov eax, [edx+0ACh]
.text:007A65F5 push eax ; ecx
.text:007A65F6 mov ecx, [ebp+context]
.text:007A65F9 mov edx, [ecx+0C0h]
.text:007A65FF and edx, 0FD7h
.text:007A6605 push edx ; efalgs
.text:007A6606 call [ebp+tableAddr] ; emulate
.text:007A6609 add esp, 8
.text:007A660C mov esp, ebp
.text:007A660E pop ebp
.text:007A660F retn
.text:007A660F emulJcc endp

это означает что типов переходов вместо 11h сделали ffh. При более пристальном взгляде
на таблицу типов переходов в ней действительно попадаются типы e0 и т.д.
Разработчики армы опять решили усложнить нам жизнь и сделали для каждого перехода
несколько разных кодов. Кроме этого каждая функция эмуляции теперь разбавлена мусорным
кодом. Обратим внимание на то что в каждую функцию пареметром arg0 уходят флаги, а
параметром arg1 регистр ECX (для эмуляции перехода JECXZ). Например код функции
эмуляции для кода 11h:

.text:007A4097 _11 proc near ; DATA XREF: .text:007A5F5Fo
.text:007A4097 ; .data:007DB6D4o ...
.text:007A4097
.text:007A4097 var_4 = dword ptr -4
.text:007A4097 arg_0 = dword ptr 8
.text:007A4097
.text:007A4097 push ebp
.text:007A4098 mov ebp, esp
.text:007A409A push ecx
.text:007A409B push ebx
.text:007A409C push esi
.text:007A409D push edi
.text:007A409E mov eax, [ebp+arg_0]
.text:007A40A1 push edx
.text:007A40A2 mov dh, 6
.text:007A40A4 dec dh
.text:007A40A6 jo short loc_7A40AF
.text:007A40A8 jl short loc_7A40AD
.text:007A40AA
.text:007A40AA loc_7A40AA: ; CODE XREF: _11+16j
.text:007A40AA ; _11+18j
.text:007A40AA jmp short loc_7A40B1
.text:007A40AA ; ---------------------------------------------------------------------- -----
.text:007A40AC db 0E8h ; ш
.text:007A40AD ; ---------------------------------------------------------------------- -----
.text:007A40AD
.text:007A40AD loc_7A40AD: ; CODE XREF: _11+11j
.text:007A40AD jz short loc_7A40AA
.text:007A40AF
.text:007A40AF loc_7A40AF: ; CODE XREF: _11+Fj
.text:007A40AF jmp short loc_7A40AA
.text:007A40B1 ; ---------------------------------------------------------------------- -----
.text:007A40B1
.text:007A40B1 loc_7A40B1: ; CODE XREF: _11+13j
.text:007A40B1 sub dh, 2
.text:007A40B4 push eax
.text:007A40B5 mov eax, 800h
.text:007A40BA bswap eax
.text:007A40BC not eax
.text:007A40BE pop eax
.text:007A40BF sub dh, 3
.text:007A40C2 and ah, dh
.text:007A40C4 mov dl, 4
.text:007A40C6 dec dl
.text:007A40C8 sub dl, 2
.text:007A40CB dec dl
.text:007A40CD sub dl, 0FFh
.text:007A40D0 and al, dl
.text:007A40D2 not ah
.text:007A40D4 bswap eax
.text:007A40D6 bswap eax
.text:007A40D8 not ah
.text:007A40DA pop edx
.text:007A40DB neg eax
.text:007A40DD sbb eax, eax
.text:007A40DF inc eax
.text:007A40E0 mov [ebp+var_4], eax
.text:007A40E3 xor eax, eax
.text:007A40E5 cmp [ebp+var_4], 0
.text:007A40E9 setnz al
.text:007A40EC pop edi
.text:007A40ED pop esi
.text:007A40EE pop ebx
.text:007A40EF mov esp, ebp
.text:007A40F1 pop ebp
.text:007A40F2 retn
.text:007A40F2 _11 endp

весь это код сводится к такому виду:

.text:007A409E mov eax, [ebp+arg_0]
and eax, 1
.text:007A40DB neg eax
.text:007A40DD sbb eax, eax
.text:007A40DF inc eax
.text:007A40E0 mov [ebp+var_4], eax
.text:007A40E3 xor eax, eax
.text:007A40E5 cmp [ebp+var_4], 0
.text:007A40E9 setnz al

что означает переход JNC. Все это очень сильно расстраивает т.к. нужно проанализировать
все процедуры, которые могут встретится в таблице типов переходов. Учитывая серьезную
имитацию логических инструкций анализ этих процедур займет значительное время.
В данный момент остается только поздравить разработчиков армы с этим незначительным
прорывом.
Однако применив немного /dev/brain после некоторого количества пива я подумал что можно
просто трассировать все эти функции эмуляции с разными занчениями флагов на входе и
по результатм работы сразу сказать какой переход данная функция эмулирует. Это и было
реализовано в NRec 1.3, который скоро будет доступен для скачивания с wasm.ru

ИТОГ: новая замутка в арме облегчила работу по восстановлению переходов, позволив
вычислять соответсвия типов переходов в автоматическом режиме. В принципе аналогичную
технику можно применить и к обычной арме, что возможно и будет сделано в NRec 1.4 :)

(c) 2004 infern0 / TSRh team
[/i][i]


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.097