12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 568|回复: 0

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

[复制链接]

49

主题

49

帖子

108

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
108
发表于 2019-8-19 11:07:10 | 显示全部楼层 |阅读模式
参考资料:
本文大量内容抄袭看雪作者: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-64IA-32架构指令编码是图2-1所示格式的子集.一条指令包括可选的指令前缀(顺序任意),主操作码(最多3字节),ModR/MSIB字节(可选) 组成的地址格式描述符(如果需要的话),偏移量(可选)以及立即数(可选).





总结:

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

1、Legacy Prefix(可选)

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

3、Opcode(必须有)

4、ModRM(可选)

5、SIB(可选)

6、Displacement(可选)

7、Immediate(可选)

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


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

1、基础理论知识

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

    1

  锁定和重复前缀:

    F0H - LOCK

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

        F3H - REPREPE/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、基础知识(非常重要的字节)

许多涉及内存操作数的指令都有一个紧挨着主操作码的寻址格式说明字节(叫做ModR/M字节),ModR/M字节包含3个域信息:

    mod域与r/m域组成32个可能的值:8个寄存器和24个寻址模式.

    reg/opcode域确定寄存器号或者附加的3位操作码.reg/opcode域的用途由主操作码确定.

    r/m域确定一个寄存器为操作数或者和mod域一起编码寻址模式.有时候有些指令使用特定的mod域和r/m域组合来表示操作码信息.


某些ModR/M字节编码需要第二寻址字节(SIB).基址+索引或者比例+索引形式的32位寻址需要SIB字节.SIB字节包括下列域:

    scale 域指定比例因子.

    index域指定索引寄存器号.

    base 域指定基址寄存器号.

ModR/MSIB编码详见第2.1.5.


总结:

1SIB就是对ModR/M的补充辅助。这些都是可选的




5 针对前面内容进行实践

0 参考书籍

1、查ModRM、SIB表使用的是:参考文档:Intel开发者手册 第二卷 指令集手册 第2章

2、查OPcode使用的是:参考文档:IntelCPU机器指令中文版手册



1、举例说明:
26:C784C8 44332211 78563412    MOV DWORD PTR ES:[EAX+ECX*8+0x11223344],0x12345678


2、指令拆解:



3、解析Opcode找到主操作码(查表)

得到的是 MOV R/M32,IMM32

4、分析ModRM(查表)

ModRM结构如下:

转换成二进制如下:

注:
1. “[--][--]”记号表示ModR/M 后跟随有一个SIB字节.

2. “disp32”记号表示ModR/M(或者SIB,如果出现的话) 后跟随一个32位的偏移量,该偏移量被加至有效地址.

3. “disp8” 记号表示ModR/M(或者SIB,如果出现的话) 后跟随一个8位的偏移量,该偏移量将被符号扩展,然后被加至有效地址.


2-3囊括了SIB 256个可能值(十六进制形式) . 可以作为基的通用寄存器通过表的上部列出,也列出了相应的base域值. 表的主体的每行列出了索引(index SIB3,4,5)对应的寄存器及倍率因子(scaling factor SIBbyte6,7).

总结:

1、ModRM.mod 提供寻址模式: 11 = register(寄存器)  11 != memory(地址)

2、R/M = 100并且mod!=11 的时候表示存在SIB表


5、分析SIB(查表)
根据上文找到的地址发现是[--][--]”,表示有SIB

SIB结构如下:



转换成2进制如下:





44332211 - Displacement:此为小端模式,即为 0x11223344

78563412 - Immediate:小端模式,即为 0x12345678

综上,得到:

MOV DWORD PTR ES:[EAX+ECX*8+0x11223344],0x12345678




来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-5-8 02:09 , Processed in 0.140625 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表