Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Динамический декрипт кода, также не оправдывает возлагаемых на него надежд
Напрашивается создание гибких средств анализа и отладки, для которых можно задать произвольную виртуальную машину в каком-то виде.
function IsNotMZorZM(wParam: Word): Boolean;
asm
cmp ax, $4D5A
jne @check_5a4d
xor eax, eax
ret
@check_5a4d:
xor ax, $5A4D
or al, ah
end;
function Check_IsNotMZorZM(A, B: Byte): Boolean;
asm
// al - первый байт
// dl - второй байт
// ecx - накопительный буфер для результата (0 - если все условия прошли)
movzx ecx, al
movzx edx, dl
xor ecx, ecx
push eax
push edx
// первое условие - ((A * B) - $1B12) = 0
imul edx
sub eax, $1B12
mov ecx, eax
// второе условие - (A + B - $A7) = 0
mov eax, [esp]
add eax, [esp + 4]
sub eax, $a7
add ecx, eax
// третье условие - ((A xor $AA) + (B xor $AA) - $1D7) = 0
mov eax, [esp]
xor eax, $AA
mov edx, [esp + 4]
xor edx, $AA
add eax, edx
sub eax, $1D7
add ecx, eax
// результат из буфера в eax (0 - если все проверки успешны)
xor eax, eax
add al, cl
or al, ch
shr ecx, 16
or al, cl
or al, ch
// правим стек
add esp, 8
end;
var
A, B: Integer;
begin
for A := 0 to 255 do
for B := 0 to 255 do
if not Check_IsNotMZorZM(A, B) then
Writeln(IntToHex(A, 2), IntToHex(B, 2));
Readln;
end.
function Check_IsMZorZM(A, B: Byte): Boolean;
asm
and eax, $FF
and edx, $FF
mov ecx, eax
xor ecx, edx
sub ecx, $17
imul edx
lea ecx, [eax + ecx - $1B12]
cmp ecx, 0
setz al
end;
push bx
mov bx, ax
xor ax,bx
pop bx
sub ax,0x1717
; ax - будет отличным от нуля. если изначально ax был не равен 'MZ' или 'ZM'
Анализ приложения защищенного виртуальной машиной