我们在缓冲区中,查看x86操作码。 |标记当前指针。
68 0F 00 6A 90 | 00
查找下一条指令的开始很容易,因为电流的大小是可确定的。但是你怎么能准确地猜出前一个的开始呢?
68 0F 00 6A 90
- 总共5个字节,以|
0F 00 6A 90
- 总共4个字节,以|
00 6A 90
- 总共3个字节,以|
6A 90
- 总共2个字节,以|
90
- 总共1个字节,以|
显然这不是一个实际的例子,但它显示了这个问题。这更像是一个好奇而不是问题,但现代拆解者如何准确猜测?他们是否使用调用/跳转引用来存储点,并找到最接近当前指令的最近标签的地址?
答案 0 :(得分:3)
使用这样的可变长度指令集,您无法准确地线性反汇编。你必须从一个入口点开始并按照所有代码路径开始,当然如果完全是这样的话,很容易将反汇编程序绊倒(强制条件然后使用条件分支,这只需要一条路径,并将数据保留在未使用的路径中,该路径会延迟以下指令解码)。更糟糕的是,如果您只是尝试从入口点线性地执行它而不检查数据(例如,当编译器在无条件分支之后放置轮询数据或返回您的反汇编程序看作指令数据时)。
你真的不能准确地倒退,除非你按照代码路径跟一个分支到你那里或在它前面的某个地方执行它。