首页
社区
课程
招聘
[原创]汇编指令之OpCode快速入门
发表于: 2010-5-20 13:47 32851

[原创]汇编指令之OpCode快速入门

2010-5-20 13:47
32851

作者:A1Pass
时间:2010-05-20
来源:黑客反病毒 (734K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6h3S2S2j5$3E0S2N6W2)9J5k6h3y4G2L8g2)9J5z5b7`.`.
出处:看雪论坛    (ecaK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0T1M7#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4K6t1&6
注意:转载请务必附带本组信息,否则侵权必究!

    最近一直被一些初学者问及有关于汇编指令的长度问题,因此为此专门撰写本文,以求为不知OpCode为何物,或者正为汇编长短不一的指令而烦恼的朋友一个最为快速的指引。
    其实,OpCode并不复杂,在本文中我不打算细致入微的告诉大家OpCode的原理,不会为大家带来一大堆有关于什么是定长指令、什么是变长指令的理论知识,更不会带着各位读者玩OpCode Hacking,我只会告诉你“怎么了”、“为什么”以及“如何解决”。

1、我的汇编指令怎么了?
    ;哦,天啊!怎么我今天突然发现汇编指令竟然是长短不一的!你还没发现吗?那么请过目:

E8 31880000      CALL 00430B86
E9 17FEFFFF      JMP 00428171
8B4424 04        MOV EAX, DWORD PTR SS:[ESP+4]
85C0             TEST EAX, EAX
56               PUSH ESI
8BF1             MOV ESI, ECX
B8 01000000   MOV EAX, 1
8BC3          MOV EAX, EBX
8BC7          MOV EAX, EDI
83C0 01       ADD EAX, 1
F0:8300 01    LOCK ADD DWORD PTR DS:[EAX], 1           ;  锁定前缀
F0:0FB10A     LOCK CMPXCHG DWORD PTR DS:[EDX], ECX     ;  锁定前缀
01048E  ADD DWORD PTR DS:[ESI+ECX*4], EAX

注:前面的标号是笔者为了大家方便阅读而加上去的。
    Opcode    Instruction  Description
01  04 ib    ADD AL,imm8  Add imm8 to AL
02  05 iw    ADD AX,imm16  Add imm16 to AX
03  05 id    ADD EAX,imm32  Add imm32 to EAX
04  80 /0 ib    ADD r/m8,imm8  Add imm8 to r/m8
05  81 /0 iw    ADD r/m16,imm16  Add imm16 to r/m16
06  81 /0 id    ADD r/m32,imm32  Add imm32 to r/m32 
07  83 /0 ib    ADD r/m16,imm8  Add sign-extended imm8 to r/m16
08  83 /0 ib    ADD r/m32,imm8  Add sign-extended imm8 to r/m32
09  00 /r    ADD r/m8,r8  Add r8 to r/m8
10  01 /r    ADD r/m16,r16  Add r16 to r/m16
11  01 /r    ADD r/m32,r32  Add r32 to r/m32
12  02 /r    ADD r8,r/m8  Add r/m8 to r8
13  03 /r    ADD r16,r/m16  Add r/m16 to r16
14  03 /r    ADD r32,r/m32  Add r/m32 to r32
解释:
imm是立即数的意思,而imm8就是指8个比特大小的立即数,下面将一一对上面的简写作出解释
imm:立即数,例如01、123、0FAB等
r:寄存器,如r16就代表ax、cx等,r32就代表eax、ebx等
m:内存地址,如[01]、[123]、[0FFFF]等
r/m:寄存器或内存
ib:代表OpCode后面跟着一个byte型数值
iw:代表OpCode后面跟着一个word型数值
id:代表OpCode后面跟着一个dword型数值
/0:代表此OpCode存在ModR/M结构(后面有讲)
/r:代表此OpCode存在ModR/M结构(后面有讲)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 9
支持
分享
最新回复 (22)
雪    币: 388
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
好文章啊,近几天看雪出来了很多精品的文章啊,谢谢牛人们分享技术
2010-5-20 16:45
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
晕,那个论坛下载还要注册啊。
2010-5-20 16:54
0
雪    币: 883
活跃值: (314)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
那两个资源很好找的:
一个是《处理器指令集参考手册》x86eas.hlp
另一个是《Intel手册》的24319102.PDF

以上资料在看雪的大礼包里都有
2010-5-22 15:59
0
雪    币: 270
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
开眼界了。。。
2010-5-22 17:48
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看不懂的说,不过强贴留名
2010-5-22 20:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习一下,谢谢楼主!!!
2010-5-22 20:29
0
雪    币: 167
活跃值: (1574)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
8
支持下 期待更多的精品文章 ~~
2010-5-23 11:43
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
前缀(最多4个前缀,每个1字节,并不是必需的)
这个很迷糊呀……

什么时候会用到两个前缀?排列有没有什么要求?
2010-5-23 21:57
0
雪    币: 883
活跃值: (314)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
10
其实OpCode的前缀就是一个开关,你需要什么养的功能,就打开什么开关。
而对于它们之间的排列顺序则没有任何要求。
2010-5-24 18:04
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
研究了一阵子,很感谢!!
2010-5-31 20:45
0
雪    币: 168
活跃值: (157)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
12
强帖留名~
2010-5-31 21:11
0
雪    币: 133
活跃值: (647)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
在上一节我仅告诉各位“/0”是代表此OpCode里存在ModR/M结构,但并没有多说什么,其实这里的“/0”就是代表此表中竖排(列)中第一排,其内容如下:

感觉这句根据inel手册上的说法好像有问题吧   

inel上说的是“/digit  digit between 0 and 7 indicates that the ModR/M byte of the instruction uses only the r/m (register or memory) operand. The reg field contains the digit that provides an extension to the instruction's opcode.

这个0也就是modr/m这个字节中的reg/opcode字段 是作为操作码的扩展来表示的  
好像并不是大牛说的表示的第一排。。。。
经过我试验也的确如此  比如:
add eax ,1   83 /0 ib               83c001

sub eax ,1    83 /5 ib       83e801

add 和sub的操作码是一样的   这个时候  /0和/5就是对操作码opcode的扩充        操作数eax寄存器的确定按照inel手册上的说法是  mod和r/m确定的
原文如下:
The mod field combines with the r/m field to form 32 possible values: eight registers and
24 addressing modes.
小菜刚研究inel手册有什么错误地方大牛一定要指出来啊
2010-6-1 14:08
0
雪    币: 883
活跃值: (314)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
14
这位朋友说的没错,本文在这里表述的确实不够准确,但是这确实是读者精心构造的一个描述方法,按照文中的逻辑,如果我们遇到“/2”怎么办?肯定就去对应第三列了。
本文是针对入门者的一篇文章,因此作者在里面偷换了一些概念,毕竟将更复杂的知识转化为简单的知识势必会伴随着精度的丢失,这是不可避免的,就像将double型装换为int型一样。

===================================================
为了更加精准的阐述着一块,笔者在此给出一个Intel推荐的计算方法,感兴趣的读者可以借鉴一下:

1、   Mod   11
2、   RM                 000
3、   REG        001
       ----------------------
        C8H=11 001 000

解释:
1、表格第2列MOD
2、表格第3列RM
3、表格第6排/digit
2010-6-2 01:23
0
雪    币: 6323
活跃值: (4628)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
15
跟着漏搂主学习了
2010-6-5 19:45
0
雪    币: 14867
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
2010-8-26 22:57
0
雪    币: 656
活跃值: (458)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
17
以前好像在哪见过
2010-8-27 12:34
0
雪    币: 234
活跃值: (83)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
18
搜贼斯馁.....
2010-8-27 15:11
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sxf
19
有些疑问:
其一
文中
/digit REG Mod R/M  
0     000 11  000 = 000011000 = C0h

不明白 000011000=18h才对

其二
31页的表ModR/M的解释是
mod    reg/Opcode     R/M
也就是说应该是
mod = 11 reg/Opcode = 000 R/M = 000
因此为:11000000 = C0h才对

其三
这值都无需算,表上可以查到
EAX/AX/AL/MM0/XMM0 11 000 C0 C8 ……
这里的C0就是/digit (Opcode) = 0列的
C8就是/digit (Opcode) = 1列的
以此类推
2011-1-16 16:01
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
一个是《处理器指令集参考手册》x86eas.hlp
另一个是《Intel手册》的24319102.PDF
2011-1-17 12:29
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
矛与盾的激情
2011-1-17 12:32
0
雪    币: 38
活跃值: (67)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
好文章  收藏
2011-1-17 19:05
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
开了眼!才知学好汇编不是那么简单
2011-5-15 14:39
0
游客
登录 | 注册 方可回帖
返回