第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/ 欢迎转载,请保留此版权声明. -- ...
随机推荐
- python list插入、拼接
1可以使用"+"号完成操作 输出为: [1, 2, 3, 8, 'google', 'com'] 2.使用extend方法 . 输入相同 3使用切片 输出相同 PS:len(l1) ...
- 微信公众号弹出框在IOS最新系统中点击键盘上的“完成”导致事件无法触发问题
微信公众号弹出框在IOS最新系统中点击键盘上的"完成"导致事件无法触发问题 问题描述 微信公众号中有项功能是弹框模态框,输入信息后保存操作.但是在IOS系统中发现,当输入内容后,点 ...
- atitit.eclipse有多少api 扩展点,以及扩展点的设计
atitit.eclipse有多少api 扩展点,以及扩展点的设计 不赞成使用的.作废的以及内部的扩展点 [扩展]页显示了几个你不应该在你的插件中使用的扩展点.在附表C.1的[描述]栏中,我们使用如 ...
- C++语言基础(24)-四种类型转换运算符(static_cast、dynamic_cast、const_cast和reinterpret_cast)
一.static_cast static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外,如: #include <iostream> #include <cs ...
- 基于flink快速开发实时TopN程序
TopN 是统计报表和大屏非常常见的功能,主要用来实时计算排行榜.流式的TopN可以使业务方在内存中按照某个统计指标(如出现次数)计算排名并快速出发出更新后的排行榜. 我们以统计词频为例展示一下如何快 ...
- Apache服务器 403 Forbidden的几种错误原因小结!
403 Forbidden错误原因详解 403 - Forbidden(禁止访问),服务器拒绝请求 - forbidden request (matches a deny filter) => ...
- windows server 2003下搭建amp环境
参考: http://blog.csdn.net/binyao02123202/article/details/7578914 http://4359260.blog.51cto.com/434926 ...
- Javaweb开发中关于不同地方出现的绝对路径和相对路径
1.转发和包含路径 a)以“/”开头:相对当前项目路径,即默认为http://localhost:8080/项目名/ b)不以“/”开头:相对当前Servlet路径. eg:在Aservlet中写“B ...
- sqlmap里如何添加字典
在sqlmap的目录下有那么一个目录.即"TXT"目录. 该目录下是放字典的. 我在日一个站的时候没有破解出表明.然后不小心下载到了数据库. sqlmap无法猜出表是啥.ps:ac ...
- 【揭秘】什么是不对称秘钥和CA证书
密钥交换简单的说就是利用非对称加密算法来加密对称密钥保证传输的安全性,之后用对称密钥来加密数据. ★方案1--单纯用"对称加密算法"的可行性 首先简单阐述一下,"单纯用对 ...