首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何判断一个二进制序列是否是x86机器码?

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

Stack Overflow用户
提问于 2012-08-19 22:48:22
回答 2查看 237关注 0票数 2

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

这种方法是论文所需要的,我不期望100%的准确率。80%是可以的,甚至一些想法也是可以的:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-19 22:55:18

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

例如:一些命令可以是加法/减法等。

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

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

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

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

这可以通过按使用频率降序对使用的任何数据位置进行排序,并查看减少的频率的形状在某种程度上与通常情况相匹配来完成。

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

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

票数 4
EN

Stack Overflow用户

发布于 2013-05-02 21:00:36

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

你可以把你的数据放在一个文件中,然后运行ndisasm -m 32 > program.dump (当然可以使用16,32或64 ),你可以删除十六进制的地址和机器代码:cut -b29- < program.dump > program.dump2

  • If你使用了上面的64位,大指令会中断行,我们现在需要删除那些空行:grep -v '^$' < program.dump2 > program.asm

  • (The

  • is

  • ndisasm -m 32 > program.dump,run assemble-able)

  • To grep -l '^db' < program.asm > /dev/null; echo $?

  • If

  • 0,it is not all instructions (grep

  • 0)。如果您不这样做,它是:)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12027405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档