当前位置:  开发笔记 > 编程语言 > 正文

如何写一个反汇编程序?

如何解决《如何写一个反汇编程序?》经验,为你挑选了3个好方法。

我有兴趣将x86解析器编写为教育项目.

我发现的唯一真正资源是Spiral Space," 如何编写反汇编程序 ".虽然这给出了反汇编程序各个组件的高级描述,但我对一些更详细的资源感兴趣.我还快速浏览了一下NASM的源代码,但这有点重要.

我意识到这个项目的一个主要挑战是我将要处理的相当大的x86指令集.我也对基本结构,基本反汇编链接等感兴趣.

有人能指出我有关编写x86反汇编程序的任何详细资源吗?



1> Adam Rosenfi..:

请参阅80386程序员参考手册的第17.2节.反汇编程序实际上只是一个美化的有限状态机.反汇编的步骤是:

    检查当前字节是一个指令前缀字节(F3,F2,或F0); 如果是这样,那么你有一个REP/ REPE/ REPNE/ LOCK前缀.前进到下一个字节.

    检查当前字节是否是地址大小byte(67).如果是,如果当前处于32位模式,则以16位模式解码其余指令中的地址;如果当前处于16位模式,则解码32位模式下的地址

    检查当前字节是否是操作数大小字节(66).如果是,如果当前处于32位模式,则以16位模式解码立即操作数,如果当前处于16位模式,则解码32位模式下的立即操作数

    检查是否当前字节的跨段字节(2E,36,3E,26,64,或65).如果是,请使用相应的段寄存器来解码地址而不是默认的段寄存器.

    下一个字节是操作码.如果操作码是0F,则它是扩展操作码,并将下一个字节读作扩展操作码.

    根据特定操作码,读入并解码Mod R/M字节,Scale Index Base(SIB)字节,位移(0,1,2或4字节)和/或立即值(0,1 ,2或4个字节).这些字段的大小取决于操作码,地址大小覆盖和先前解码的操作数大小覆盖.

操作码告诉您正在执行的操作.操作码的参数可以从Mod R/M,SIB,位移和立即值的值解码.由于x86的复杂性,有很多可能性和许多特殊情况.有关更详细的说明,请参阅上面的链接.


英特尔手册说"组1到组4可以按任何顺序放置",因此步骤1-4可能不是那个顺序
这适用于x86,但不适用于x86_64或现代指令集,如AVX/AVX2

2> hannson..:

我建议检查一些开源的反汇编程序,最好是distorm,尤其是"disOps(Instructions Sets DataBase)"(ctrl +在页面上找到它).

文档本身充满了关于操作码和指令的丰富信息.

来自 https://code.google.com/p/distorm/wiki/x86_x64_Machine_Code

80x86说明:

80x86指令分为许多元素:

    指令前缀会影响指令操作的行为.

    强制前缀用作SSE指令的操作码字节.

    操作码字节可以是一个或多个字节(最多3个整字节).

    ModR/M字节是可选的,有时可能包含操作码本身的一部分.

    SIB字节是可选的,表示复杂的内存间接形式.

    位移是可选的,它是不同大小的字节(字节,字,长)的值,并用作偏移量.

    Immediate是可选的,它用作通过不同大小的字节(字节,字,长)构建的通用数值.

格式如下:

/-------------------------------------------------------------------------------------------------------------------------------------------\
|*Prefixes | *Mandatory Prefix | *REX Prefix | Opcode Bytes | *ModR/M | *SIB | *Displacement (1,2 or 4 bytes) | *Immediate (1,2 or 4 bytes) |
\-------------------------------------------------------------------------------------------------------------------------------------------/
* means the element is optional.

https://code.google.com/p/distorm/wiki/diStorm_Internals中介绍了数据结构和解码阶段

引用:

解码阶段

    [前缀]

    [获取操作码]

    [过滤操作码]

    [提取操作数]

    [文字格式]

    [Hex Dump]

    [解码指令]

每个步骤也都有解释.


原始链接由于历史原因而保留:

http://code.google.com/p/distorm/wiki/x86_x64_Machine_Code和http://code.google.com/p/distorm/wiki/diStorm_Internals


"可选的强制性前缀"看起来很有趣

3> Charlie Mart..:

从一些已组装的小程序开始,它既为您提供生成的代码,也为您提供指令.获取指令体系结构的参考资料,并手动处理一些生成的代码和体系结构参考.你会发现这些指令有一个非常定型的inst op op op结构,它有不同数量的操作数.您需要做的就是翻译代码的十六进制或八进制表示以匹配指令; 一点点玩都会揭示它.

这个过程是自动化的,是反汇编程序的核心.理想情况下,您可能希望在内部(或外部,如果程序非常大)构建一个指令结构数组.然后,您可以将该数组转换为汇编程序格式的指令.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有