如何判断二进制序列是否是x86机器码?

Yan*_*Luo 2 x86 machine-code

我们都知道,在x86 arch中,数据和代码混合在内存或磁盘中。但如何告诉他们呢?

\n\n

paper\xef\xbc\x8c 需要该方法,我不期望 100% 的准确度。80% 就可以了,甚至一些想法也可以:)

\n

ron*_*chn 6

统计确定哪些命令在可执行文件中是常见的。

例如。一些命令可能是加/减等。

对于未知的二进制序列,将其视为机器代码,并查看使用的各种命令的频率(这里您可能可以假设命令在字节边界正确启动)。

如果使用了无效命令,显然它不是机器代码。

否则,查看所使用命令的百分比频率是否与平常相符。


此外,当使用接受地址(例如寄存器或内存/数据位置)的命令时,记录它们。然后检查附近是否正在访问相同的位置。

这可以通过按使用频率降序对所使用的任何数据位置进行排序来完成,并且观察频率下降的形状在某种程度上与通常情况相符。


数据(非机器代码)不太可能与这些统计测试相匹配。

请注意,当我说合身时,您可以检查是否非常宽松。即使它与正常情况相差很大,它也可能仍然是代码,除非统计上几乎没有相关性。

  • 此外,您可以分析跳转以查看它们是否与您的指令解码一致 - 即没有跳转到指令的中间。 (3认同)
  • @onon15,这可能是完全有效的。它甚至在实践中发生(很少),通常作为“nop [dword]”中双字的分支。 (2认同)