如果你只是想对一个简短的片段进行快速而肮脏的原始反汇编,你可以使用 gdb 的restore命令加载 exe 的相关部分。首先提取片段更容易,例如:
tail -c +4096 the-program-with-the-snippet.exe | head -c 1024 > snippet
然后,您需要开始调试一个虚拟程序并将其主要功能替换为您要反汇编的代码段。例如::
~/tmp$ gdb -q dummy
Reading symbols from dummy...done.
(gdb) break main
Breakpoint 1 at 0x79f: file dummy.c, line 9.
(gdb) run
Starting program: /home/ale/tmp/dummy
Breakpoint 1, main (argc=1, argv=0x7fffffffe2b8) at dummy.c:9
9 for (int i = 1; i < argc; ++i)
(gdb) restore snippet binary main
Restoring binary file snippet into memory (0x555555554790 to 0x555555554b90)
(gdb) disass
Dump of assembler code for function main:
0x0000555555554790 <+0>: add %bh,-0x35(%rdi)
0x0000555555554793 <+3>: movabs 0xa1cba872a376f272,%eax
0x000055555555479c <+12>: jb 0x555555554806 <main+118>
0x000055555555479e <+14>: cmp 0x72a270b7(%rdx,%rsi,2),%esp
0x00005555555547a5 <+21>: loopne 0x5555555547c2 <main+50>
0x00005555555547a7 <+23>: movabs 0xa1cd0572a12b0f72,%eax
0x00005555555547b0 <+32>: jb 0x5555555547c2 <main+50>
0x00005555555547b2 <+34>: pop %rsi
0x00005555555547b3 <+35>: movabs %eax,0xa1d13272a1cd3a72
0x00005555555547bc <+44>: jb 0x5555555547b5 <main+37>
0x00005555555547be <+46>: loopne 0x555555554760 <frame_dummy>
0x00005555555547c0 <+48>: jb 0x5555555547a6 <main+22>
0x00005555555547c2 <+50>: iret
...
---Type <return> to continue, or q <return> to quit---
当然,任何格式信息(符号等)都会丢失。