首页
社区
课程
招聘
[分享]VMP学习笔记之X86指令之Opcode快速入门(二)
发表于: 2019-8-8 00:11 10086

[分享]VMP学习笔记之X86指令之Opcode快速入门(二)

2019-8-8 00:11
10086

参考资料:

本文大量内容抄袭看雪作者:waiWH的VMP系列

1、名称:X86指令内幕 —— 序

网址:https://blog.csdn.net/xfcyhuang/article/details/6228024

2、名称:谈谈vmp的还原(1)

网址:https://bbs.pediy.com/thread-225278.htm

学习目的:

1、VMP代码自带反汇编引擎,需要一定的Opcode指令基础。


正文:

1、快速入门Opcode

   Intel-64和IA-32架构指令编码是图2-1所示格式的子集.一条指令包括可选的指令前缀(顺序任意),主操作码(最多3字节),由ModR/M和SIB字节(可选) 组成的地址格式描述符(如果需要的话),偏移量(可选)以及立即数(可选).

总结:

1、根据上图所示我们知道一条汇编指令分为以下几个部分:

1、Legacy Prefix(可选)

2、REX prefix(用于64位模式,这里不做讲解)

3、Opcode(必须有)

4、ModRM(可选)

5、SIB(可选)

6、Displacement(可选)

7、Immediate(可选)

2、Opcode结构顺序是不能被打乱的

 

2、 指令前缀讲解(可选)

1、基础理论知识

指令前缀分为四组,每一组包含一些允许的前缀码.对于任何指令,前缀可以从这四组(组1,2,3,4)里的挑选,并且它们不区分次序.

•    组1

—  锁定和重复前缀:

•    F0H - LOCK

•        F2H - REPNE/REPNZ,仅用于串操作和I/O指令,也可被用作某些指令的强制性前缀

•        F3H - REP或REPE/REPZ,仅用于串操作和I/O指令,也可被用作某些指令的强制性前缀

•    组2

—  段重载前缀:

•    2EH—CS 段重载(用于任意分支指令时保留)

•        36H—SS 段重载(用于任意分支指令时保留)

•        3EH—DS 段重载(用于任意分支指令时保留)

•        26H—ES 段重载(用于任意分支指令时保留)

•        64H—FS 段重载(用于任意分支指令时保留)

•        65H—GS 段重载(用于任意分支指令时保留)

 

—  分支提示:

•    2EH—分支不被接受(仅用于Jcc指令中)

•    3EH—分支被接受(仅用于Jcc指令中)

•    组3

•        66H—操作数大小重载前缀,也可被用作某些指令的强制性前缀.

•    组4

•    67H—地址尺寸重载前缀

LOCK前缀(F0H)在多处理器环境下强制执行独占共享内存操作.详见《Instruction Set Reference, A-M》第三章"LOCK – 断言LOCK#信号前缀".

 

重复前缀(F2H,F3H)将会重复操作字符串的每一个元素.只有MOVS,CMPS,SCAS,LODS,STOS,INS,OUTS等字符串操作或I/O指令才能使用这些前缀. 对Intel 64 或 IA-32 其他指令使用重复前缀和/或未定义的操作码是被保留的,将会引起不可预知的行为.

 

某些指令可能使用F2H,F3H作为强制性前缀来表示特定的功能.强制性前缀应当位于其他可选的前缀之后(例外的情形请查看第2.2.1节,”REX前缀”)

 

分支提示前缀(2EH,3EH)允许程序给处理器一个最有可能的执行分支提示.这些前缀只能用于条件指令(Jcc).在Intel 64 或 IA-32 其他指令中使用分支预测前缀或者未定义的操作码是被保留的,将引起不可预知的行为.

 

操作数大小重载前缀允许程序在16位和32位操作数大小间切换.它们中任一个都可以是默认值,而使用这个前缀则选择非默认值.

 

某些SSE2/SSE3/SSSE3/SSE4和使用3字节操作码的指令可能使用66H作为强制性前缀来表示特定的功能. 强制性前缀应当位于其他可选的前缀之后(例外的情形请查看第2.2.1节,”REX前缀”) . 66H前缀的其他用法是被保留的, 将引起不可预知的行为.

 

 地址尺寸重载前缀(67H)允许程序在16位和32位地址间切换.它们中的任何一个都可以是默认值,使用这个前缀选择非默认值.当指令中的操作数不在内存中,使用这个前缀或未定义的操作码时,操作被保留,可能引起不可预知的行为.

 

3、 OPcode详解(必备)

主操作码,必须有。指令不定长1、2、3都有,例如8B C0    mov eax,eax 其中8B就是主操作码。例如90 NOP就是只有主操作码没有ModR/M和SIB字节的。

 

4、ModR/M 和 SIB 字节(可选)

1、基础知识(非常重要的字节)


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

最后于 2019-8-8 00:15 被黑手鱼编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 6566
活跃值: (4526)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
注定只能看看了
2019-8-8 08:35
0
雪    币: 1431
活跃值: (4413)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
3
pxhb 注定只能看看了[em_2]
耐心去看,壳不难只是非常繁琐
2019-8-8 22:24
0
游客
登录 | 注册 方可回帖
返回
//