首页
社区
课程
招聘
[原创]IA-32指令解析之ModR
发表于: 2020-5-3 15:32 4049

[原创]IA-32指令解析之ModR

2020-5-3 15:32
4049

前言:继上篇(https://bbs.pediy.com/thread-258834.htm)的内容,我们来学习ModR/M部分,以及与之相关的group部分。

概述:ModR/M是个可选项,主要用来辅助说明操作码的操作数(操作数的个数,种类[寄存器 地址 常量]);Goup指令语句将操作码与ModR/M组合起来,使得操作码最多可以表示出8种形式的指令,起到扩展操作码映射的作用。

下面我们通过对指令的解析开始学习。

89C1  MOV ECX,EAX

1. 从箭头指向处我们可以得出 MOV Ev ,Gv。MOV表明是操作码MOV。现在对Ev,Gv进行查找。

2.对Ev,Gv进行分析。

E  A ModR/M byte follows the opcode and specifies the operand. The operand is either a general-purpose register or a memory address. If it is a memory address, the address is computed from a segment register and any of the following values: a base register, an index register, a scaling factor, a displacement.
   一个ModR/M字节紧接着操作码并制定操作数。该操作数可能是通用寄存器或者是内存地址。如果它是一个内存地址,这个地址计算源于段寄存器和下列的值:基本寄存器 索引寄存器 比例因子 移位。
G  The reg field of the ModR/M byte selects a general register (for example, AX (000)).
   ModR/M字节的注册表字段选择一个通用寄存器(比如 AX(000))
通俗易懂的方式讲,E表示操作数可以是寄存器或者内存地址;G表示操作数只能是寄存器。

再来看v

v  Word, doubleword or quadword (in 64-bit mode), depending on operand-size attribute.
   根据操作数大小决定是word Dword 或 quadword大小。

据此,得出Ev,Gv在该情境下,Ev是双字节大小(32位)的寄存器或内存地址;Gv是双字节大小(32位)的寄存器。

3. 对ModR/M进行解析。E的首句“A ModR/M byte follows the opcode and specifies the operand”表明在操作码后一字节的地方是ModR/M选项。出现E G的操作码后边一定跟着ModR/M。这里的ModR/M选项对应的值为C1。我们接下来看一个新表 Table 2-2. 32-Bit Addressing Forms with the ModR/M Byte

 

首先,我们对C1进行拆分
ModR/M = C1
C1二进制 = 11000001
拆分ModR/M = 11  001  001(Mod:11,Reg:000,R/M:001)
ps:mod,reg,R/M的格式在该系列首文的IA-32指令格式图中有提到。

接下来我们对上图的方框的内容进行说明:

首先,藏青色方框的内容里是不是有着内存地址和寄存器?没错,它就是E所对应的区域;蓝色方框的内容是不是只有寄存器?没错,它就是G所对应的区域。

然后,我们通过拆分后的ModR/M确认其具体的寄存器。

Mod是11,所以我们将范围缩小到11处,再看R/M是001,所以我们可以定位到那一行,发现了我们的C1,所以在32位下的E对应了寄存器ECX。

然后我们看到Reg是000,所以从C1对应上去的那一列的32位下的寄存器是EAX。  

当然,我们也可以直接在Value of ModR/M Byte中直接找到C1,然后找出对应的E和G。

4. 至此,得出最终结果:89C1为 MOV ECX,EAX。


Group

概述Group指令语句将操作码与ModR/M组合起来,使得操作码最多可以表示出8种形式的指令,起到拓展操作码映射的作用。

下面我们对指令进行解析完成对group的学习

83C3 12  ADD EBX,12

1. 查找83的内容

箭头处有内容Grp1(1A) Ev,Ib。Ev,Ib分别表示4个字节的寄存器或内存地址和1个字节的立即数(PS:经过前边的学习,所以我就不再累述)。接下来我们分析Grp1(1A):

    1.前边我们说过,有E G便表示在操作码后有MdoR/M,因此,这里有一个新的表格Table A-6. Opcode Extensions for One- and Two-byte Opcodes by Group Number 

    2.同上拆分MdoR/M部分的C3

ModR/M = C3
C3二进制 = 11000011
拆分ModR/M = 11  001  011(Mod:11,Reg:000,R/M:011)

操作码是83,属于80-83,对应第1行,再查看Reg的值为000,所以对应操作码为ADD。

5. 然后,同上在Table 2-2. 32-Bit Addressing Forms with the ModR/M Byte查找C3,确定下来Ev为EBX。再看第二个操作数lb,因为表示的是1个字节的立即数,所以是modR/M后的1个字节(12)。至此,我们得到了最终结果

83C3 12  ADD EBX,12

下边给出几道练习题。答案在二楼

83C4 04

3BF3        

8B4D FC   

8325 C4EB5500 00  



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-5-3 15:32 被绥术编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 603
活跃值: (376)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
2
83C4 04                   add esp,0x4
3BF3                      cmp esi,ebx
8B4D FC                   mov ecx,ebp+FC
8325 C4EB5500 00          and dword ptr ds:[0x55EBC4],0x0
2020-5-3 15:33
0
雪    币: 603
活跃值: (376)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
emmmm,我这边看不到图片,改了还是没看着,如果游览本帖的人看不到的话,麻烦提醒我,谢谢。
2020-5-3 15:37
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
图片挂了 重新弄一下啊
2020-5-3 16:42
0
雪    币: 603
活跃值: (376)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
5
ZwCopyAll 图片挂了 重新弄一下啊
没问题了。你看看
2020-5-4 00:04
0
雪    币: 167
活跃值: (876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
第三个是  MOV ECX,DWORD PTR  SS:[EBP-4]
2020-7-5 18:22
0
游客
登录 | 注册 方可回帖
返回
//