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

时间:2012-08-19 14:48:22

标签: x86 machine-code

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

纸张需要这种方法,我不希望100%准确。 80%没问题,即使是一些想法也没问题。)

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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


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

这可以通过对使用频率下降所使用的任何数据位置进行排序来完成,并且可以看到降低频率的形状与通常情况相符。


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

请注意,当我说合适时,你可以检查非常宽松的合身。即使它是正常的,它可能仍然是代码,除非在统计上几乎没有相关性。

答案 1 :(得分:0)

请参阅Is all data valid x86 16-bit machine code?

  1. 将您的数据存入文件
  2. 运行ndisasm -m 32 > program.dump(当然适用时使用16,32或64)
  3. 以十六进制删除地址和机器代码:cut -b29- < program.dump > program.dump2
  4. 如果您使用上面的64位,则大型指令会破坏该行,我们现在需要删除这些空行:grep -v '^$' < program.dump2 > program.asm
  5. (该文件现在可以组装)
  6. 要确定它是否仅包含说明,请运行grep -l '^db' < program.asm > /dev/null; echo $?
  7. 如果您看到0,则并非所有说明(grep都找到了某些内容)。如果你不这样做,那就是:)