我有两个字节 ' \x74\x06',我想要一个以这个操作码开头的所有指令的列表。
你会用什么工具来做这件事?我正在尝试使用 Immunity Debugger 来做到这一点,但到目前为止还没有运气。我发现的唯一的解决办法是从corelancoder的基础上例3的cheatsheet。然而,这要求当前在 Immunity 中加载了一个二进制文件,并且它包含以该操作码开头的指令。
如何快速获得映射(部分)操作码 -> 指令?
我有两个字节 ' \x74\x06',我想要一个以这个操作码开头的所有指令的列表。
你会用什么工具来做这件事?我正在尝试使用 Immunity Debugger 来做到这一点,但到目前为止还没有运气。我发现的唯一的解决办法是从corelancoder的基础上例3的cheatsheet。然而,这要求当前在 Immunity 中加载了一个二进制文件,并且它包含以该操作码开头的指令。
如何快速获得映射(部分)操作码 -> 指令?
这是一种使用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]
(等等)
然后,您可以编写一个脚本来排除错误并仅显示有效代码(或者即使您愿意也可以相反)
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]