2

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

论文需要这个方法,我不指望100%的准确率。80% 还可以,即使是一些想法也可以:)

4

2 回答 2

6

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

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

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

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

否则,请查看使用的命令的百分比频率是否与通常情况相匹配。


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

这可以通过按使用频率递减排序使用的任何数据位置来完成,并且看到递减频率的形状与通常的情况有些匹配。


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

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

于 2012-08-19T14:55:17.673 回答
0

请参阅所有数据都是有效的 x86 16 位机器代码吗?.

  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找到了一些东西)。如果你不这样做,那就是:)
于 2013-05-02T13:00:36.477 回答