|
|
| Посл.отвђт | Сообщен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 |