找到匹配操作码的指令

逆向工程 工具 免疫调试器
2021-06-26 22:22:45

我有两个字节 ' \x74\x06',我想要一个以这个操作码开头的所有指令的列表。

你会用什么工具来做这件事?我正在尝试使用 Immunity Debugger 来做到这一点,但到目前为止还没有运气。我发现的唯一的解决办法是从corelancoder的基础上例3的cheatsheet然而,这要求当前在 Immunity 中加载了一个二进制文件,并且它包含以该操作码开头的指令。

如何快速获得映射(部分)操作码 -> 指令?

3个回答

这是一种使用radare2程序执行此操作的方法rasm2

rasm2 -a x86 -b 32 -d 7406

je 0x8

这显然已经je从其他答案中确立

但是为了论证,假设您想解码以 0x74 开头的所有指令以获得一个额外的字节,然后您可以在循环中运行上述内容并尝试找到所有有效指令。此示例适用于 Linux 或某种 Unix shell,我想您可以使用mingw或 Powershell实现类似的效果

for x in `seq 0 255`;do printf "74%02x " $x;rasm2 -a x86 -b 32 -d 74`printf "%02x" $x`;done

产生:

7400 je 0x2
7401 je 0x3
7402 je 0x4
7403 je 0x5

(等等...)

另一个例子:

for x in `seq 0 255`;do printf "33%02x " $x;rasm2 -a x86 -b 32 -d 33`printf "%02x" $x`;done

3300 xor eax, [eax]
3301 xor eax, [ecx]
3302 xor eax, [edx]
3303 xor eax, [ebx]
3304 disassemble error at offset 0
invalid
3305 disassemble error at offset 0
invalid
3306 xor eax, [esi]

(等等)

然后,您可以编写一个脚本来排除错误并仅显示有效代码(或者即使您愿意也可以相反)

如果它是 x86,我很确定它是,你应该检查这个链接和这个链接。

windbg
0:000> .for ( r $t0 = 0; @$t0 < 0x8 ;r $t0 = @$t0 +1 ) {eb eip 74 @$t0; 你@eip l1 ; !操作码图}

calc!WinMain+0x5:
01001f56 7400            je      calc!WinMain+0x7 (01001f58)

Instr   OpCode  Dest    Source
je  7400        01001f58
calc!WinMain+0x5:
01001f56 7401            je      calc!WinMain+0x8 (01001f59)

Instr   OpCode  Dest    Source
je  7401        01001f59
calc!WinMain+0x5:
01001f56 7402            je      calc!WinMain+0x9 (01001f5a)

Instr   OpCode  Dest    Source
je  7402        01001f5a
calc!WinMain+0x5:
01001f56 7403            je      calc!WinMain+0xa (01001f5b)

Instr   OpCode  Dest    Source
je  7403        01001f5b
calc!WinMain+0x5:
01001f56 7404            je      calc!WinMain+0xb (01001f5c)

Instr   OpCode  Dest    Source
je  7404        01001f5c
calc!WinMain+0x5:
01001f56 7405            je      calc!WinMain+0xc (01001f5d)

Instr   OpCode  Dest    Source
je  7405        01001f5d
calc!WinMain+0x5:
01001f56 7406            je      calc!WinMain+0xd (01001f5e)

Instr   OpCode  Dest    Source
je  7406        01001f5e
calc!WinMain+0x5:
01001f56 7407            je      calc!WinMain+0xe (01001f5f)

Instr   OpCode  Dest    Source
je  7407        01001f5f

尝试另一种变化注意如何使用一个常量字节反汇编一个变量字节根据需要自动提取其他字节

0:000> .for ( r $t0 = 0; @$t0 < 0x8 ;r $t0 = @$t0 +1 ) {eb eip ff @$t0; 你@eip l1 ; !操作码图}

calc!WinMain+0x5:
01001f56 ff00            inc     dword ptr [eax]

Instr   OpCode  Dest    Source
inc ff00        dword ptr [eax]    
calc!WinMain+0x5:
01001f56 ff01            inc     dword ptr [ecx]

Instr   OpCode  Dest    Source
inc ff01        dword ptr [ecx]    
calc!WinMain+0x5:
01001f56 ff02            inc     dword ptr [edx]

Instr   OpCode  Dest    Source
inc ff02        dword ptr [edx]    
calc!WinMain+0x5:
01001f56 ff03            inc     dword ptr [ebx]

Instr   OpCode  Dest    Source
inc ff03        dword ptr [ebx]    
calc!WinMain+0x5:
01001f56 ff0406          inc     dword ptr [esi+eax]

Instr   OpCode  Dest    Source
inc ff0406      dword ptr [esi+eax]
calc!WinMain+0x5:
01001f56 ff0506010081    inc     dword ptr ds:[81000106h]

Instr   OpCode  Dest    Source
inc ff0506010081        dword pt
calc!WinMain+0x5:
01001f56 ff06            inc     dword ptr [esi]

Instr   OpCode  Dest    Source
inc ff06        dword ptr [esi]    
calc!WinMain+0x5:
01001f56 ff07            inc     dword ptr [edi]

Instr   OpCode  Dest    Source
inc ff07        dword ptr [edi]