通用返回_寄存器——通用寄存器

d82a171b8fba65af4556b5f7ebcdcf72.png

寄存器是什么?

就像人的正常生活需要吃喝拉撒,一个程序的运行也需要各方面的东西,如堆、栈和寄存器,今天首先谈一下寄存器。如果使用过OD、x64dbg之类的调试器,可以发现汇编代码中大多是对寄存器进行操作。为什么要使用它?这是由于寄存器属于CPU中的一块存储区域,拥有着非常高的读写速度,而程序运行最重要的就是快(和男人不一样)

5b2a6128ba8530861ef20e77b2b73764.png
汇编代码操作寄存器

逆向与寄存器的py关系?

在平常的逆向分析当中,读懂汇编代码是非常重要的,而汇编代码中的寄存器又扮演着非常重要的角色,每个寄存器中的值又代表了不同的含义。所以对寄存器有了基本的理解后,对逆向分析是有很大帮助的。

寄存器结构

前面瞎掰了那么多,这里首先看一下寄存器的结构。下图一以64位寄存器rax为例,其中0到31就是平常分析32位程序是常见的eax,0到15则是ax,而ah和al则分别是8到15和0到7。看到这里可能有点晕,这个的东西重点在那里?其实只要知道汇编指令中取ax、ah这些值时,获取的是那一部分数据就行,如下图二。

d6f7cbc00ad476317e4685784df47d63.png
RAX寄存器结构

9c95abc79dca0d4ba3de0565200f6b24.png
rax寄存器各部分的值

通用寄存器

逆向分析中常见的寄存器有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
源码和反编译代码1

对于ecx,edx,esi和edi则可以在我们memcpy函数实现中找到,memcpy函数就是把第二个参数地址的值复制到第一个参数的地址处,看一下核心实现处。其中esi是源地址寄存器,指向了string;edi是目的地址寄存器,指向了lpAddress;edx是数据寄存器,用于保存要复制的数据;ecx作为计数器,保存了要复制数据的大小。

dd8deb9eb39c393d340d6afa5bb7b260.png
源码和反编译代码2

细心的你可能发现,我们这里主要讲了寄存器eax,ecx,edx,esi和edi。对于ebx,ebp和esp却没有提到,其中ebx找了半天也没找到对应的实例,大家就靠名字“数据指针基址寄存器”去天人感应一下,而ebp和esp则在栈那部分讲会比较清晰。

参考

《逆向工程核心原理》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值