![d82a171b8fba65af4556b5f7ebcdcf72.png](https://i-blog.csdnimg.cn/blog_migrate/93217452ab35122bd0a2674dde4d1fc6.jpeg)
寄存器是什么?
就像人的正常生活需要吃喝拉撒,一个程序的运行也需要各方面的东西,如堆、栈和寄存器,今天首先谈一下寄存器。如果使用过OD、x64dbg之类的调试器,可以发现汇编代码中大多是对寄存器进行操作。为什么要使用它?这是由于寄存器属于CPU中的一块存储区域,拥有着非常高的读写速度,而程序运行最重要的就是快(和男人不一样)。
![5b2a6128ba8530861ef20e77b2b73764.png](https://i-blog.csdnimg.cn/blog_migrate/0572c1f4d8483795dab5beb96bbbcf1d.jpeg)
逆向与寄存器的py关系?
在平常的逆向分析当中,读懂汇编代码是非常重要的,而汇编代码中的寄存器又扮演着非常重要的角色,每个寄存器中的值又代表了不同的含义。所以对寄存器有了基本的理解后,对逆向分析是有很大帮助的。
寄存器结构
前面瞎掰了那么多,这里首先看一下寄存器的结构。下图一以64位寄存器rax为例,其中0到31就是平常分析32位程序是常见的eax,0到15则是ax,而ah和al则分别是8到15和0到7。看到这里可能有点晕,这个的东西重点在那里?其实只要知道汇编指令中取ax、ah这些值时,获取的是那一部分数据就行,如下图二。
![d6f7cbc00ad476317e4685784df47d63.png](https://i-blog.csdnimg.cn/blog_migrate/36935f3c7d6bcae29b0b74f741504eea.png)
![9c95abc79dca0d4ba3de0565200f6b24.png](https://i-blog.csdnimg.cn/blog_migrate/eef45336273df3d9e8c5b0c2cc3221b8.png)
通用寄存器
逆向分析中常见的寄存器有4种:通用寄存器、段寄存器、标志位寄存器和指令指针寄存器。今天主要讲的是32位下的通用寄存器,下面列出了各个寄存器的名称。
- EAX:(针对操作数和结果数据的)累加器 ,返回函数结果
- EBX:(DS段中的数据指针)基址寄存器
- ECX:(字符串和循环操作数)计数器
- EDX:(I/O指针)数据寄存器
- EBP:(SS段中栈内数据指针)扩展基址指针寄存器
- ESI:(字符串操作源指针)源变址寄存器
- EDI:(字符串操作目标指针)目的变址寄存器
- ESP:(SS段中栈指针)栈指针寄存器
上面对寄存器进行了简单的解释,不过对这种抽象的东西,还是用一个实例来梳理一下。下面编译环境为VS2015-x86-debug
#include<stdio.h>
#include<Windows.h>
int main()
{
LPVOID lpAddress;
char *string = "GeekFZ_QKSword";
lpAddress = VirtualAlloc(NULL, 0x100, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE);
if (lpAddress == NULL)
{
printf_s("VirtualAlloc failed!");
return 0;
}
memcpy(lpAddress, string, 0x15);
return 0;
}
对于eax寄存器,最主要的就是知道它保存的是函数的返回值。如图下所示,调用了函数VirtualAlloc并返回值lpAddress,最后判断lpAddress这个值是否成功获取。对应的汇编代码注释处可以看到相同的逻辑,而汇编中用来保存返回值的就是eax寄存器。
![749c4754485de918d286b7a974a24d01.png](https://i-blog.csdnimg.cn/blog_migrate/4dce95560293ea7855a333f4f0727310.jpeg)
对于ecx,edx,esi和edi则可以在我们memcpy函数实现中找到,memcpy函数就是把第二个参数地址的值复制到第一个参数的地址处,看一下核心实现处。其中esi是源地址寄存器,指向了string;edi是目的地址寄存器,指向了lpAddress;edx是数据寄存器,用于保存要复制的数据;ecx作为计数器,保存了要复制数据的大小。
![dd8deb9eb39c393d340d6afa5bb7b260.png](https://i-blog.csdnimg.cn/blog_migrate/477e0c405d8f97efbe07544b8bb66789.jpeg)
细心的你可能发现,我们这里主要讲了寄存器eax,ecx,edx,esi和edi。对于ebx,ebp和esp却没有提到,其中ebx找了半天也没找到对应的实例,大家就靠名字“数据指针基址寄存器”去天人感应一下,而ebp和esp则在栈那部分讲会比较清晰。
参考
《逆向工程核心原理》