第4章 x86反汇编速成班
4.1 抽象层次
硬件<微指令<机器码<低级语言<高级语言<解释型语言
4.2 逆向工程
4.3 x86体系结构
冯-诺依曼体系结构
中央处理器(CPU): 负责执行代码。
内存(RAM): 负责存储所有的数据和代码。
输入/输出(I/O): 为硬盘、键盘、显示器等设备提供接口。
控制单元(control unit): 从内存取得要执行的指令。
算术逻辑单元 : 执行内存中取来的指令。
4.3.1 内存
数据:数据节(data section)
代码:代码节(code)
堆:堆是为了程序执行期间需要的动态内存准备的,用于创建(分配)新的值,以及消除不再需要的值。将其称之为动态内存(dynamic memory)
栈:栈用于函数的局部变量和参数,以及控制程序执行流。
4.3.2 指令
指令是汇编程序的构成块。
4.3.3 操作码和字节序
每条指令使用(二进制)操作码告诉CPU程序要执行什么样的操作。
字节序:数据的字节序(endianness)是指在一个大数据项中,最高位(大端,big-endian)还是最低位(小端,little-endian)被排在第一位。
4.3.4 操作数
mov ecx, 0x42
立即数(immediate)操作数是一个固定的值,0x42。
寄存器(register)操作数指向寄存器,ecx。
内存地址(memory address)操作数指向感兴趣的值所在的内存地址,一般由方括号内包含值、寄存器或方程式组成,如[eax]。
4.3.5 寄存器
寄存器是可以被CPU使用的少量数据存储器,访问其中内容的速度会比其他存储器要快。x86处理器中有一组寄存器,可以用于临时存储或者作为工作区。
通用寄存器(EAX(AX,AH,AL)/EBX/ECX/EDX/EBP(BP)/ESP(SP)/ESI(SI)):cpu在执行期间使用,一般使用于存储数据或者内存地址,交替使用以完成程序。
Tips:一些x86指令只能使用特定的寄存器。例如,乘法和除法指令就只能使用EAX和EDX
段寄存器(CS/SS/DS/ES/FS/GS),用于定位内存节。
状态标志(EFLGS),用于作出决定,在执行期间每位要么置位(值位1),要么是清楚(值位0),并且这些值来控制CPU的运算,或者给出某些CPU运算的值。
Tips:常见标志
ZF:当一个运算的结果等于0时,ZF被置位,否则被清除。
CF:当一个运算的结果相对于目标操作数太大或太小时,CF被置位,否则被清除。
SF:当一个运算的结果为负数,SF被置位;若结果为正数,SF被清除。对算术运算,当运算结果的最高位值为1时,SF也会被置位。::
TF:TF用于调试。当它被置位时,x86处理器每次只执行一条指令。
指令指针(EIP)或程序计数器,用于定位要执行的下一条指令,保存了将要执行的下一条指令在内存中的地址。EIP的唯一作用就是告诉处理器下一步做什么。
通用的寄存器的大小都是32位,可以在汇编代码中以32位或16位引用。有4个寄存器(EAX/EBX/ECX/EDX)还可以8位值的方式引用。
4.3.6 简单指令
mov指令(读写内存的指令):mov destination,source
如:mov eax,ebx 表示将EBX中的内容复制至EAX寄存器 / mov eax,[ebx] 表示将EBX寄存器指向的内存地址4个字节复制到EAX寄存器
lea(load effective address)指令:lea destination,source
如:lea eax,[ebx+8] 表示将EBX+8的值给EAX。
算术运算:
add指令(减法):add destination,source
sub指令(减法):sub destination,source。sub指令会修改两个重要的标志:ZF和CF,如结果为零,则ZF置位;如果目标操作数比要减去的值小,则CF被置位。
inc指令:inc dex,将寄存器加一。
dec指令:dec dex,将寄存器减一。
mul指令(乘法):mul value。将EAX乘上value,因此EAX寄存器在乘法指令出现前必需赋值。乘法的结果以64位的形式分开存储在两个寄存器中:EDX和EAX。其中,EDX储存了高的32位,EAX存储低的32位。
div指令(除法):div value。将EDX和EAX的64位结果除以value,因此EDX和EAX在做除法之前这两个寄存器必须赋值。除法的商将存储到EAX,余数则存储在EDX中。
Tips:程序员可以通过模(modulo)的运算等到余数
逻辑运算:OR\AND\XOR指令。xor eax,eax 快速将EAX寄存器置零的方法。
位移运算:移出目标操作数边界的位则会先移动到CF标志中。在移位时,使用0填充新的位。CF标志为重包含了最后移出目标操作数的那一位
shr/shl指令:shr/shl destination,count
循环位移指令:移动位到目标操作数的另外一端
ror/rol指令:ror/rol destination,count
Tips:位移运算被当作乘法运算的优化,不要过于陷入细节。
Nop(无运算 xchg eax,eax)指令:跳过当前指令,执行下一条指令,opcode=0x90。
4.3.7 栈
用于函数的内存、局部变量、流程控制结构等被存储在栈中。栈市一种用压和弹操作来刻画的数据结构,向栈中压入一些东西,然后再把它们弹出来。它是一种后入先出(LIFO)的结构。栈只能用于短期存储。它经常用于保存局部变量、参数和返回地址。其主要的用途是管理函数调用之间的数据交换。
函数调用:函数是程序中的一段代码,执行一个特定的任务,并与其他代码相对独立。
4.3.8 条件指令
所有编程语言都能做比较,并根据比较结果做出决定。条件指令就是用来比较的指令。
test指令(与and指令功能相同):test eax,eax,test指令只设置标志位。test指令执行后我们关注ZF标志位。
cmp指令(与sub指令功能相同):cmp dst,src,cmp指令也是只设置标志位。ZF与CF标志位会发生变化。
4.3.9 分支指令
分支指令是一串指令根据程序流有条件地执行。分支这个词用于描述控制流到了程序地枝干上。最常见地分支指令是跳转指令,jmp无法实现语句等价逻辑。在汇编代码中没有if语句,而是用了条件跳转。
条件跳转语句:
jz loc : 如果ZF=1,跳转到指定位置
jnz loc :如果ZF=0,跳转至制定位置
4.3.10 重复指令
重复指令是一组操作数据缓冲区的指令。数据缓冲区通常是一个字节数组的形式,也可以是单字或者双字。
常见的数据缓冲区操作指令是movsx、cmpsx、stosx、scasx,其中X可以是b、w或者d,分别表示字节、字和双字。
ESI寄存器:源索引寄存器
EDI寄存器:目的索引寄存器
ECX作为计数的变量
rep指令终止条件:rep 循环终止ECX=0/ repe.repz 循环终止条件ECX=0 or ZF=0/ repne,repnz 循环终止条件ECX=0 or ZF = 1
4.3.11 C语言主函数和偏移
第4章 x86反汇编速成班的更多相关文章
- 恶意代码分析实战-x86反汇编速成班
x86反汇编速成 x86体系结构 3种硬件构成: 中央处理器:负责执行代码 内存(RAM):负责存储所有的数据和代码 输入/输出系统(I/O):为硬盘.键盘.显示器等设备提供接口 内存 一个程序的内存 ...
- 火爆微信朋友圈的Excel速成班视频课程
Excel速成班视频课程,一共有10节课,附带课件. 目录结构如下: 目录:/2020032-Excel速成班视频 [4.6G] ┣━━课件 [1.9M] ┃ ┣━━第八课Excel实用技巧12例.x ...
- 第18章-x86指令集之常用指令
x86的指令集可分为以下4种: 通用指令 x87 FPU指令,浮点数运算的指令 SIMD指令,就是SSE指令 系统指令,写OS内核时使用的特殊指令 下面介绍一些通用的指令.指令由标识命令种类的助记符( ...
- (lintcode全部题目解答之)九章算法之算法班题目全解(附容易犯的错误)
--------------------------------------------------------------- 本文使用方法:所有题目,只需要把标题输入lintcode就能找到.主要是 ...
- 移动端全兼容的flexbox速成班
说起flexbox,都算是件陈年旧事了,它是2009年W3C提出的一种全新的可伸缩的CSS布局方式.依赖flexbox,我们可以更简单,高效的完成可伸缩式页面的布局. 业界与flexbox的相关教程文 ...
- Markdown速成班
更多内容请参考: http://ibruce.info/2013/11/26/markdown/
- GOOGLE机器学习速成班
地址:https://developers.google.cn/machine-learning/crash-course/ 不用***就可以学习.
- [转]C语言SOCKET编程指南
1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...
- C++ 系列:socket 资料收集
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
随机推荐
- 自定义 XIB subview的时候 为什么控件都是 空的
http://blog.wtlucky.com/blog/2014/08/10/nested-xib-views/
- 点滴积累【other】---.net程序员面试题总结
自己总结的.net的面试题. 说明:以下代码均已经过验证正确无误! C#: 1.c#实现N的阶乘: class Program { static void Main(string[] args) { ...
- MongoDB GridFS规范
This is being changed for 2.4.10 and 2.6.0-rc3. Tyler Brock's explanation: Now that the server uses ...
- Windows/OS X下制作Mac安装U盘
Windows下制作: 方法一:(适用于OSX 10.9以前) 前期准备:一台windows电脑 UltraISO软件 Mac系统镜像dmg(这里使用Mac os x 10.8.4) 至少8GB的U盘 ...
- HTML5七巧板canvas绘图
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- JVM Specification 9th Edition (4) Chapter 3. Compiling for the Java Virtual Machine
Chapter 3. Compiling for the Java Virtual Machine 内容列表 3.1. Format of Examples 3.2. Use of Constants ...
- Failed to resolve: com.android.support:appcompat-v7:26.0.0wenti
在安装Android Studio 3.0的时候出现了这个问题.查阅了许多资料都没有找到原因.到最后才发现,Android Studio默认https是不走代理的,只要勾选上https的代理就顺利的安 ...
- golang模板语法简明教程
[模板标签] 模板标签用"{{"和"}}"括起来 [注释] {{/* a comment */}} 使用“{{/*”和“*/}}”来包含注释内容 [变量 ...
- impala+hdfs+csv格式文件
[创建目录]hdfs dfs -mkdir -p /user/hdfs/sample_data/csv/devicehdfs dfs -mkdir -p /user/hdfs/sample_data/ ...
- 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderList
最近在用idea部署war文件的时候,总是出现了部署失败的错误,刚开始并没有在意,但是现在次数越来越多了,不得不在意了,然后就在百度上搜,然后就有了各种说法 1,错误的信息是: One or more ...