是否有一种或多或少可靠的方法来判断内存中某个位置的数据是处理器指令的开头还是其他数据?
例如,E8 3F BD 6A 00
may be call
操作说明 (E8
) 相对偏移量为0x6ABD3F
,或者它可能是属于其他指令的三个字节的数据,后跟push 0
(6A 00
).
我知道这个问题听起来很愚蠢,而且可能没有简单的方法,但也许指令集是在设计时考虑到这个问题的,也许一些简单的代码检查该位置周围的 +-100 字节可以给出很可能正确的答案。
我想知道这一点,因为我扫描程序的代码,并将对某些函数的所有调用替换为对我的替换函数的调用。到目前为止它正在工作,但在某些时候,当我增加要替换的函数数量时,一些数据看起来就像对该确切地址的函数调用一样,并且将被替换,这将导致程序以最意想不到的方式打破。我想降低这种可能性。
如果它是您的代码(或保留链接和调试信息的另一代码),最好的方法是扫描目标文件中的符号/重定位表。否则没有可靠的方法来确定某个字节是指令还是数据。
限定数据的最有效方法可能是递归反汇编。 IE。从入口点和找到的所有跳转目的地反汇编代码。但这并不完全可靠,因为它不会遍历跳转表(您可以尝试为此使用一些启发式方法,但这也不完全可靠)。
问题的解决方案是修补函数本身被替换:用函数的跳转指令覆盖其开头。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)