Windows平台PE文件,内存地址到磁盘地址的转换(RVA to RAW),破解补丁原理

来源:互联网 发布:软件安全性设计 编辑:程序博客网 时间:2024/06/07 00:58

本文需要了解基本的PE文件概念


我们在破解软件的时候,经常会使用工具,对某个EXE进行修改,以实现破解。本文介绍这种方法的基本原理。


修改EXE实现破解,需要知道待修改的磁盘地址,而实际过程中,我们一般是通过调试,得到关键区域的内存地址,因此需要将内存地址转换为磁盘地址,方法如下:

Windows平台PE文件,节区头(Section Header)是非常重要的数据结构。头文件定义如下:

#define IMAGE_SIZEOF_SHORT_NAME              8typedef struct _IMAGE_SECTION_HEADER {    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];    union {            DWORD   PhysicalAddress;            DWORD   VirtualSize;    } Misc;    DWORD   VirtualAddress;    DWORD   SizeOfRawData;    DWORD   PointerToRawData;    DWORD   PointerToRelocations;    DWORD   PointerToLinenumbers;    WORD    NumberOfRelocations;    WORD    NumberOfLinenumbers;    DWORD   Characteristics;} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

地址转换过程中,需要使用到的是VirtualAddress(内存中节区起始地址)以及PointerToRawData(磁盘文件中节区起始位置)
计算公式为 RAW = RVA(相对虚拟地址) - VirtualAddress + PointerToRawData
RVA = VA(虚拟地址) - ImageBase(基址)
=>RAW = VA - ImageBase - VirtualAddress + PointerToRawData
看公式很抽象,下面举例说明

首先编写以下代码

#include "stdafx.h"#include <Windows.h>int _tmain(int argc, _TCHAR* argv[]){    char* p = "YunZhangFang";           //获取字符串在内存中的地址    auto hBase = GetModuleHandle(NULL); //获取进程基址    DWORD dwOffset = (DWORD)p - (DWORD)hBase;//获取字符串在内存中的相对地址    printf("Base is :%p\n", hBase);    printf("VA is :%p\n", p);    printf("RVA is :%#02x\n", dwOffset);    printf("%s\n", p);    return 0;}

编译链接后,生成可执行文件DiskToMemory.exe
运行结果如下图
这里写图片描述
可以看出,“YunZhangFang”字符串:
VA=0x003A20F4
ImageBase =0x003A0000,
RVA=VA - ImageBase = 0x003A20F4 - 0x003A0000 = 0x20F4

使用PEiD工具,打开DiskToMemory.exe,查看其节表结果,如下图
这里写图片描述
可以看到0x20F4地址位于VirtualAddress 为0x2000的.rdata节,偏移为0x20F4 - 0x2000 = 0xF4
观察节表,.rdata的PointerToRawData为0xE00,字符串在磁盘中的地址为0xE00 + 0xF4 = 0xEF4
使用公式:
RAW = VA - ImageBase - VirtualAddress + PointerToRawData = 0x003A20F4 - 0x003A0000 - 0x2000 + 0xE00 = 0xEF4
使用二进制方式打开DiskToMemory.exe,观察 地址0xEF4处的内容,如下如所示
这里写图片描述
在文件DiskToMemory.exe的0xEF4处,内容就是YunZhangFang的ANSI编码。

实际破解过程中,可以使用OD等软件动态调试,获取到关键内存地址,然后通过以上公式计算,得到关键内存地址对应的磁盘地址,修改dll或者exe文件相应地址的内容,实现破解。

阅读全文
0 0