我想知道是否可以反向解码 x86-64 指令?
我需要这个作为运行时反汇编器。用户可以指向内存中的随机位置,然后应该能够向上滚动并查看指定地址之前有哪些指令。
我想通过反向解码来做到这一点。
x86 指令流不是自同步的,只能向前明确解码。您需要知道一个有效的解码起点。立即数的最后一个字节可以是0x90
解码为nop
,或者一般来说,4 字节立即数或位移可以具有作为有效指令的字节序列,或者与看起来像操作码的 ModRM/SIB 字节的任何其他重叠可能性。
如果您在没有故意混淆的代码中向前解码,您通常会重新与“正确”指令边界同步,因此您可以尝试将指令边界记住为已知的好点,并检查从向后解码是否正确-步候选起始地址在您已知的好点处有一个指令边界。
我不知道你是否能更聪明地找到更多已知的优点,而这些优点也必须得到其他候选人的同意。
请务必以红色或灰色等方式向用户突出显示向后解码的指令,以便他们知道不能保证其可靠性。
另一种选择是需要函数符号(外部函数或任何具有调试信息的函数)。
GDB 不允许向上滚动(在layout reg
模式),除非您处于知道起始地址的函数内部。然后我猜它从函数起始地址进行解码,这样当它到达适合窗口的部分时它就知道指令边界。
如果你想倒退,你必须disas 0x12345, +16
从那里开始解码。然后你可以向下滚动,但如果你的insn边界错误,你会得到垃圾。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)