从零开发一个反汇编引擎,手工分析Opcode???

本文作者分享了自己开发反汇编引擎的经历,详细解释了Opcode的结构,包括前缀、主操作码、ModR/M、SIB、偏移量和立即数,并通过实例展示了如何解析和理解这些组件。作者建议对反汇编感兴趣的读者可以阅读相关文档,以加深理解。
摘要由CSDN通过智能技术生成

很久以前就想着自己开发一个反汇编引擎了,不久前又对这方面有兴趣,所有就研究了一下,其实也就那么一回事,不算太难的东西,语言基础比较好的兄弟可以去读一下微软的官方文档《64-ia-32-architectures-software-developer-instruction-set-reference-manual-3253》里面的2.2 IA-32E MODE和附录A,其它可以读一下《ArtofDisassembly》。

 

开始前请先下载一些表,这些表用来解析Opcode的,下面每一处都用到这些表,当然自己有的话就不需要了,下载传送门Opcode解析表下载

 

我们现在开始,先了解Opcode的基本结构。如图所示:

一个Opcode是由前缀(prefix),主操作码(code),ModR/M,SIB,偏移量(offset),立即数(Immediate)构成的,下面分别介绍。

 

1. 前缀(prefix)

指令前缀可以分成位四组,不是必须的,也就是说指令中可以不存在前缀的。

前缀最多可以有四个。

如图所示:

上图也有一些各个前缀的介绍了,这里在进行补充, 0FH-Lock前缀在多处理器环境下强制执行独占共享内存操作,这个没怎么研究,感觉没啥用处啊。

而哪两个F2H,F3H重复前缀是MOVS,CMPS,SCAS,LODS,STOS,INS,OUTS等字符串操作或I/O指令才能使用这些前缀,其它指令也用这个前缀会导致出现不可预知的行为。当然右边框框里面的介绍看到没有,一些双字节的指令或者三字节的指令是需要F2H,F3H指令前缀的。

其它的指令前缀没啥需要注意的了,直接举一些例子吧。

比如说66H操作数大小重载指令前缀,允许在16位和32位操作数之间转化

正常的情况下下的指令 32位

但是如果加了66H前缀下,将会得到 16位

这就是因为66H前缀将操作数的大小变小了

详细指令前缀传送门:指令前缀

2. 主操作码(code)

主操作码是必须的,也就是说每一条指令都是必须要用到主操作码的,最少有一个,最多有三个。

一字节主操作码例子:60H,对应的反汇编也就是PUSHA

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值