我们在缓冲区中查看 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 字节,结束于 |
显然这不是一个实际的例子,但它说明了问题。这与其说是一个问题,不如说是一个好奇心,但现代反汇编程序如何准确猜测呢?它们是否存储带有调用/跳转引用的点,并找到与以当前指令结尾的最近标签最近的地址?
使用这样的可变长度指令集,您无法精确地线性反汇编。你必须从一个入口点开始,并遵循所有可能的代码路径,当然,如果这就是反汇编程序所做的一切,那么很容易使反汇编程序出错(强制一个条件,然后使用条件分支,这只会采用一条路径,并将数据保留在未使用的路径中,从而导致后续指令解码失败)。但如果您只是尝试从入口点线性执行而不检查数据(例如,当编译器将轮询数据放置在无条件分支或返回反汇编程序视为指令数据之后),情况会更糟。
你无法真正准确地向后退,除非你沿着代码路径,有一个分支可以让你到达那里,或者在它前面的某个地方执行它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)