有没有一种或多或少的可靠方法来判断内存中某个位置的数据是处理器指令还是某些其他数据的开始?从数据中告诉指令的x86方式
例如,E8 3F BD 6A 00
可以是call
相对的0x6ABD3F
偏移指令(E8
),或者它可能是三个字节属于一些其它的指令数据,接着push 0
(6A 00
)。
我知道这个问题听起来很愚蠢,可能没有简单的方法,但也许指令集的设计是考虑到这个问题,也许一些简单的代码检查位置周围的+ -100字节可以给出很可能的答案正确。
我想知道这一点,因为我扫描程序的代码并将所有调用替换为调用我的替换函数。它工作到目前为止,但在某些时候,并不是不可能的,因为我增加了我要替换的函数的数量,一些数据看起来就像是对该确切地址的函数调用,并且将被替换,并且这会导致程序以最意想不到的方式打破。我想减少这种可能性。
让我想起我曾经使用的旧拆装机。它通过机器代码进行了9次不同的分析,试图从数据中分离出代码。而且经常犯错。 – 2010-11-19 14:33:31