第4章 x86反汇编速成班

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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章 x86反汇编速成班的主要内容,如果未能解决你的问题,请参考以下文章

反汇编基本原理与x86指令构造

如何反汇编原始 16 位 x86 机器代码?

x86 反汇编,涉及模块化散列

反汇编问题

第一章 反汇编简介

第一章 反汇编简介