1. 何为OPCode

在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处理器的指令规范指定。除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显示的操作数。这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等。

OPCode在不同的场合中通常具有不同的含义,例如PHP虚拟机(Zend VM)、java虚拟机(JVM)以及一些软件保护虚拟机中的最小操作单元都可以称之为OPCode。

在本节课中,介绍的是Intel 80x86 CPU的OPCode

2. 常用单字节OPCode概览A -- 40~4F

opcode                                asm                        using

0x40                                  inc eax                 emit(0x40)

0x41                                  inc ecx                 emit(0x41)

0x42                                  inc edx                 emit(0x42)

0x43                                  inc ebx                 emit(0x43)

0x44                                  inc esp                 emit(0x44)

0x45                                  inc ebp                 emit(0x45)

0x46                                  inc esi                   emit(0x46)

0x47                                  inc edi                  emit(0x47)

0x48                                  dec eax                 emit(0x48)

0x49                                  dec ecx                 emit(0x49)

0x4a                                  dec ebx                 emit(0x4a)

0x4b                                  dec ebx                emit(0x4b)

0x4c                                  dec esp                 emit(0x4c)

0x4d                                  dec ebp                emit(0x4d)

0x4e                                  dec esi                  emit(0x4e)

0x4f                                   dec edi                 emit(0x4f)

2. 常用单字节OPCode概览B -- 50~5F

opcode                                asm                        using

0x50                                  push eax                 emit(0x50)

0x51                                  push  ecx                emit(0x51)

0x52                                  push  edx                emit(0x52)

0x53                                  push  ebx                emit(0x53)

0x54                                  push  esp                emit(0x54)

0x55                                  push  ebp                emit(0x55)

0x56                                  push  esi                 emit(0x56)

0x57                                  push  edi                 emit(0x57)

0x58                                  pop eax                   emit(0x58)

0x59                                  pop  ecx                  emit(0x59)

0x5a                                  pop  edx                 emit(0x5a)

0x5b                                  pop  ebx                 emit(0x5b)

0x5c                                  pop  esp                  emit(0x5c)

0x5d                                  pop  ebp                 emit(0x5d)

0x5e                                  pop  esi                   emit(0x5e)

0x5f                                   pop  edi                  emit(0x5f)

2. 常用单字节OPCode概览C -- 70~7F

opcode                                asm                                  using

0x70  0x12                        Jo 0x12                   {_emit(0x70)} {_emit(0x12)}

0x71  ...                             Jno ...                                          ... ...

0x72  ...                             Jb   ...                                          ... ...

0x73  ...                             Jae  ...                                          ... ...

0x74  ...                             Je    ...                                          ... ...

0x75  ...                             Jne  ...                                          ... ...

0x76  ...                             Jbe  ...                                          ... ...

0x77  ...                             Ja     ...                                          ... ...

0x78  ...                             Js     ...                                          ... ...

0x79  ...                             Jns   ...                                          ... ...

0x7a  ...                             Jp     ...                                         ... ...

0x7b  ...                             Jnp   ...                                         ... ...

0x7c  ...                             Jl       ...                                         ... ...

0x7d  ...                             Jge    ...                                        ... ...

0x7e  ...                             Jle     ...                                        ... ...

0x7f  ...                              Jg      ...                                        ... ...

短跳: 2字节

第一个字节: 操作码

第二个字节: 跳转偏移

2. 常用单字节OPCode概览D -- 90~9F

Opcode                       asm                           Using

0x90                    Nop/xchg eax,eax       _emit(0x90)

0x91                    Xchg eax,ecx

0x92                    Xchg eax,edx

0x93                    Xchg eax,ebx

0x94                    Xchg eax,esp

0x95                    Xchg eax,ebp

0x96                    Xchg eax,esi

0x97                    Xchg eax,edi

3. OPCode与指令的对应关系

同类型的指令OPCode不一定相同

B8 01000000    mov eax, 1

8B C3                mov eax, ebx

8B C7                mov eax, edi

OPCode相同的情况下指令也不一定相同

90 nop

90 xchg ax, ax

90 xchg eax, eax

结论: OPCode与汇编指令并非是单纯的对应关系

4. OPCode详解A -- 主要数据域

以上数据域只有Code域是必须存在的,其他数据域视指令格式而定,或有或无

一个指令的长度在1Byte~16Byte之间

实际正常的最长指令是,13Byte

4. OPCode详解B -- 前缀

前缀(Prefixes)的大小为1Byte,用于描述指令的前缀情况,他们可以被划分为5个集合:

66                                   -- 切换操作数大小

67                                   -- 切换地址大小

F2/F3                              -- 重复操作前缀

2E/36/3E/26/64/65       -- 修改默认段

F0                                   -- 锁定前缀

所以指令独此一份,不可能为其他机器码

注意:

a.  "切换"的意思是将其在两种状态间来回切换,而并非特指某种状态

b.  将默认值修改为其他段的操作称之为"修改默认段"

c.  一个OpCode可能会有几个Prefixes

d.  如果有多个Prefixes,那么它们的顺序可能打乱

e.  如果Prefixes不能对随它之后的OpCode起作用,那么它就会被忽略

4. OPCode详解C -- 前缀

切换操作数大小

40               INC EAX

66 40          INC AX

切换顺序: 从大到小

无效的前缀应用

8AC1            MOV AL, CL

66 BAC1       MOV AL, CL

重复操作段前缀

F3 66 AD      REP LODSW

F2 AC            REPNE LODSB

段超越前缀

8B 03             MOV EAX, [DWORD DS:EBX]

658B 03        MOV EAX, [DWORD GS:EBX]

4. OPCode详解D -- ModR/M

OPCode的主要解析逻辑都集中在ModR/M域,我们可以通过对照Intel手册中的表来解析OPCode中的ModR/M域来确定指令的具体格式

例如:

89  D8   mov eax, ebx

D8 = 11011000

Mod  Reg  R/M

11      011  000

4. OPCode详解E -- Opcode小注

/0~7:  此ModR/M只使用R/M域的信息

/r :       此ModR/M同时使用R/M域与Reg域信息

+rb:    寄存器码, 此码将加载OPCode原有值上

AL = 0, CL = 1, DL = 2, BL = 3, AH = 4, CH = 5, DH = 6, BH = 7

+rw:    寄存器码,此码将加载OPCode原有值上

AX = 0, CX = 1, DX = 2, BX = 3, SP = 4, BP = 5, SI = 6, DI = 7

+rd:     寄存器码,此码将加载OPCode原有值上

EAX = 0, ECX = 1, EDX = 2, EBX = 3, ESP = 4, EBP = 5, ESI = 6, EDI = 7

+i:        仅限于浮点计算时,增加的数可以是0~7, 用于标记当前使用的FPU

堆栈,此码将加载OPCode原有值上

4. OPCode详解F -- 高大上指令赏析

13字节汇编指令赏析

F0:26:C7 8491AA000000 11000000

LOCK MOV DWORD PTR ES: [EDX*4 + ECX + 0AA], 11

Prefix    OPCode    ModR/M    SIB     Displacement    Immediate

F0:26:        C7               84          91      AA000000         01000000

注1          注2              注3       注4          偏移                  立即数

注1:  锁定前缀 + ES段超越

注2:  MOV r/m32, imm32

注3:  R/M = disp32[--][--]     Mod != EAX

注4:  Index = [EDX*4]               r32 = ECX

84 91 AA000000  -->  [EDX*4 + ECX +0xAA]

5. 练习

①. 83C4 04

分析:

83 /0 ib: ADD r/m32,imm8             ;/0~7 只使用R/M信息

C4:           ESP

结果:

add esp, 04

②. A1 78812801

A1         : MOV EAX,moffs32*               ;Move doubleword at (seg:offset) to EAX, moffs32为32位地址

结果:

mov eax, dword ptr ds:[1288178]

③. A3 54812801

A3 MOV moffs32*,EAX                        ;Move EAX to (seg:offset),moffs32为32位地址

结果:

mov dword ptr ds:[1288154], eax

④. 68 54812801

PUSH imm32

结果:

push 1288154

⑤. 8B0D 74812801

8B /r  MOV r32,r/m32                        ;/r 同时使用R/M域与Reg域信息

OD 有效地址: disp32   REG: ECX

结果:

mov ecx, dword ptr ds:[1288174]

⑥. 51

50+rdPUSH r32                              ;EAX = 0, ECX = 1, EDX = 2, EBX = 3, ESP = 4, EBP = 5, ESI = 6, EDI = 7

结果:

push ecx

⑦. 68 48812801

68           PUSH imm32

结果:

push 1288148

⑧. FF15 A4922801

FF /3CALL m16:32                         ;/0~7 只使用R/M信息

15  有效地址: disp32

结果:

call dword ptr cs:[12892A4]

总结:

ModR/M信息与确认是否有SIB字节

当Mod != 11b并且R/M的值为100b的时候,表示指令后续有SIB字节,并且该内存操作对象由SIB编码。

MODR/M里有三种情况会有SIB字节

java opcode 反汇编,OPCode详解及汇编与反汇编原理相关推荐

  1. OPCode详解及汇编与反汇编原理

     1. 何为OPCode 在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处 ...

  2. 【逆向工程】C/C++的反汇编表示详解(1)函数调用,栈平衡,变量与参数的内存布局

    很多人学完汇编,去看C/C++的反汇编就会很懵,发现单独看一条指令看的明明白白,但连在多条指令连在一起就不知道有什么作用了,如 push ebp mov ebp,esp sub esp,40h lea ...

  3. Java单元测试之JUnit4详解

    2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...

  4. java -jar 和 -cp详解

    java -jar 和 -cp详解 命令行执行程序 假如我们有一个程序,把它打包成Test.jar,如何运行才能成功输出Hello World package com.test; public cla ...

  5. java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...

    java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...

  6. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  7. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java 8引入 ...

  8. 你真的弄明白了吗?Java并发之AQS详解

    你真的弄明白了吗?Java并发之AQS详解 带着问题阅读 1.什么是AQS,它有什么作用,核心思想是什么 2.AQS中的独占锁和共享锁原理是什么,AQS提供的锁机制是公平锁还是非公平锁 3.AQS在J ...

  9. java定时任务框架elasticjob详解

    这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...

最新文章

  1. linux 关闭redis 命令_redis----------linux和mac如何安装redis和启动,关闭
  2. 绿盟数据库审计系统hive_数据库审计系统
  3. Live Messenger 邀请,再次放送
  4. android MPV架构快速实现,不是所有的MPV都叫GL8,一体化智能座舱体验来袭
  5. 【C语言】能不能更快?
  6. php 如何保存录像文件,如何录制屏幕并保存下来?
  7. 【POJ2887】Big String(块状链表,模板)
  8. @EnableWebMVC注解理解
  9. 【随机数】深入理解random和srandom
  10. 特斯拉造芯片:不能失去集成电路的高地,就像西方不能失去耶路撒冷
  11. commandname
  12. 一年半JAVA工作经验的总结
  13. OSChina 周六乱弹 —— 谁小时候没当过熊孩子呀
  14. MySQL窗口函数——分组排序函数:number_rank(),rank(),dense_rank()
  15. petalinux(3)——创建APP
  16. gitlab找回已删除的分支
  17. 使用高匿代理访问西刺代理(假如ip被封可用高匿ip访问网站)
  18. 九度 1365 贝多芬第九交响曲
  19. 招商银行信用卡中心大数据
  20. EasyRecovery 15 mac中文免费密钥数据恢复 安装软件的方法教程及版本对比

热门文章

  1. 编译语言与解释语言,动态与静态,以及强类型和弱类型的区别
  2. Win8 Metro(C#)数字图像处理--2.52图像K均值聚类
  3. Nginx 静态资源缓存配置
  4. Python学习笔记(八)
  5. 深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手
  6. 缩略图在网页设计中应用的35个优秀案例
  7. WINRAR 命令行语法
  8. sklearn gridcv
  9. [python教程入门学习]Python标准库映射类型与可散列数据类型的关系
  10. 隐藏表白图“我喜欢你”就像你看不见但它也依然存在