吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5177|回复: 16
收起左侧

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

  [复制链接]
鱼无论次 发表于 2019-8-8 23:59
本帖最后由 鱼无论次 于 2019-8-9 22:46 编辑

参考资料:
本文大量内容抄袭看雪作者: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字节(可选) 组成的地址格式描述符(如果需要的话),偏移量(可选)以及立即数(可选).


lip_image001.png


总结:

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、指令拆解:
图片.png


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

得到的是 MOV R/M32,IMM32

4、分析ModRM(查表)

ModRM结构如下:
lip_image003.png
转换成二进制如下:
图片.png
注:
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结构如下:

lip_image005.png

转换成2进制如下:

图片.png

图片.png

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

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

综上,得到:

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



免费评分

参与人数 8威望 +1 吾爱币 +15 热心值 +8 收起 理由
gangtiexia + 1 + 1 热心回复!
willJ + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yangshao1994 + 1 热心回复!
erh + 1 + 1 用心讨论,共获提升!
wangxp + 1 + 1 谢谢@Thanks!
yujie0880 + 1 + 1 谢谢@Thanks!
hiodis + 1 + 1 我很赞同!
joneqm + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 鱼无论次 发表于 2019-8-9 00:15
帖子权限怎么改不了拉。。。。
klzl198 发表于 2019-8-9 00:44
yujie0880 发表于 2019-8-9 06:51
chen4321 发表于 2019-8-9 07:08
看不懂,看不懂,大佬nb
沅澧潇湘 发表于 2019-8-9 07:38
感谢您的分享!
heiketian10 发表于 2019-8-9 07:53
顶你出系列
阳光山野农夫 发表于 2019-8-9 08:15
支持楼主的好文章  学习了
1188 发表于 2019-8-9 08:36
这要是有个几百句,得累趴下
Spirate 发表于 2019-8-9 09:44
受教了  多谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-22 16:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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