是否有一种或多或少可靠的方法来判断内存中某些位置的数据是处理器指令或其他数据的开头?
例如,E8 3F BD 6A 00可能是具有相对偏移量的callinstruction(E8)0x6ABD3F,或者它可能是属于某个其他指令的三个字节的数据,后跟push 0(6A 00).
我知道这个问题听起来很愚蠢,并且可能没有简单的方法,但也许指令集的设计考虑到了这个问题,也许一些简单的代码检查位置周围的+ -100字节可以给出一个很可能正确的答案.
我想知道这一点,因为我扫描程序的代码,并通过调用替换函数替换所有对某些函数的调用.它正在发挥作用,但是在某些时候,当我增加我正在替换的函数数量时,一些数据看起来就像是对该确切地址的函数调用,并且将被替换,并且这将导致程序以一种最意想不到的方式打破.我想减少这种可能性.
如果是您的代码(或另一个保留链接和调试信息的代码),最好的方法是扫描目标文件中的符号/重定位表.否则,没有可靠的方法来确定某个字节是否是构造或数据.
可能最有效的数据鉴定方法是递归分解.I. e.从enty点和所有跳转目的地中分解代码.但这并不完全可靠,因为它不会遍历跳转表(您可以尝试使用一些启发式算法,但这也不完全可靠).
你的问题的解决方案是补丁功能被自己替换:用你的函数的跳转修改覆盖它的开头.