java opcode 反汇编,OPCode详解及汇编与反汇编原理
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详解及汇编与反汇编原理相关推荐
- OPCode详解及汇编与反汇编原理
1. 何为OPCode 在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处 ...
- 【逆向工程】C/C++的反汇编表示详解(1)函数调用,栈平衡,变量与参数的内存布局
很多人学完汇编,去看C/C++的反汇编就会很懵,发现单独看一条指令看的明明白白,但连在多条指令连在一起就不知道有什么作用了,如 push ebp mov ebp,esp sub esp,40h lea ...
- Java单元测试之JUnit4详解
2019独角兽企业重金招聘Python工程师标准>>> Java单元测试之JUnit4详解 与JUnit3不同,JUnit4通过注解的方式来识别测试方法.目前支持的主要注解有: @B ...
- java -jar 和 -cp详解
java -jar 和 -cp详解 命令行执行程序 假如我们有一个程序,把它打包成Test.jar,如何运行才能成功输出Hello World package com.test; public cla ...
- java访问修饰符详解——学java,零基础不怕,不只要理论,更要实践+项目,a href=http://www.bjweixin.com太原维信科技提供 /a...
java访问修饰符详解--学java,零基础不怕,不只要理论,更要实践+项目 <a href=http://www.bjweixin.com>太原维信科技提供 </a> pub ...
- Java编程配置思路详解
Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java 8引入 ...
- 你真的弄明白了吗?Java并发之AQS详解
你真的弄明白了吗?Java并发之AQS详解 带着问题阅读 1.什么是AQS,它有什么作用,核心思想是什么 2.AQS中的独占锁和共享锁原理是什么,AQS提供的锁机制是公平锁还是非公平锁 3.AQS在J ...
- java定时任务框架elasticjob详解
这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...
最新文章
- linux 关闭redis 命令_redis----------linux和mac如何安装redis和启动,关闭
- 绿盟数据库审计系统hive_数据库审计系统
- Live Messenger 邀请,再次放送
- android MPV架构快速实现,不是所有的MPV都叫GL8,一体化智能座舱体验来袭
- 【C语言】能不能更快?
- php 如何保存录像文件,如何录制屏幕并保存下来?
- 【POJ2887】Big String(块状链表,模板)
- @EnableWebMVC注解理解
- 【随机数】深入理解random和srandom
- 特斯拉造芯片:不能失去集成电路的高地,就像西方不能失去耶路撒冷
- commandname
- 一年半JAVA工作经验的总结
- OSChina 周六乱弹 —— 谁小时候没当过熊孩子呀
- MySQL窗口函数——分组排序函数:number_rank(),rank(),dense_rank()
- petalinux(3)——创建APP
- gitlab找回已删除的分支
- 使用高匿代理访问西刺代理(假如ip被封可用高匿ip访问网站)
- 九度 1365 贝多芬第九交响曲
- 招商银行信用卡中心大数据
- EasyRecovery 15 mac中文免费密钥数据恢复 安装软件的方法教程及版本对比
热门文章
- 编译语言与解释语言,动态与静态,以及强类型和弱类型的区别
- Win8 Metro(C#)数字图像处理--2.52图像K均值聚类
- Nginx 静态资源缓存配置
- Python学习笔记(八)
- 深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手
- 缩略图在网页设计中应用的35个优秀案例
- WINRAR 命令行语法
- sklearn gridcv
- [python教程入门学习]Python标准库映射类型与可散列数据类型的关系
- 隐藏表白图“我喜欢你”就像你看不见但它也依然存在