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文件相应地址的内容,实现破解。
- Windows平台PE文件,内存地址到磁盘地址的转换(RVA to RAW),破解补丁原理
- 理解PE文件相对虚拟地址(RVA)到文件偏移的转换
- PE文件的相对虚拟地址(RVA)和文件偏移地址(FOA)的转换
- [PE文件结构学习]1.相对虚拟地址(RVA)与物理地址的转换
- PE文件关于虚拟相对地址RVA与基于文件的偏移地址关系
- PE文件地址与内存地址
- PE文件中RVA和Offset的转换
- PE文件中, RVA和文件偏移的转换
- RVA和RAW相互转换
- 把PE映像文件从内存中DUMP到磁盘
- 把PE映像文件从内存中DUMP到磁盘
- 把PE映像文件从内存中DUMP到磁盘
- 逻辑地址到线性地址的转换
- PE文件RVA-VA-Offset
- 我自己的PE文件RVA-VA-Offset心得
- Linux内存寻址之二:逻辑地址到虚拟地址的转换
- Linux内存管理:逻辑地址到线性地址和物理地址的转换
- Linux内存管理:逻辑地址到线性地址和物理地址的转换
- SDNU1431 16进制转化成10进制
- cocos 获取手机通讯录
- Async和Await异步编程的原理
- [网络流 24 题] 方格取数问题 骑士共存问题
- 7.3
- Windows平台PE文件,内存地址到磁盘地址的转换(RVA to RAW),破解补丁原理
- 亚马逊欧洲站对灯串有什么要求?灯串没EN60598-2-20标准报告会被下架?
- Java23种设计模式——中介者模式
- 带参数的装饰器
- android——高效调用系统图库
- insert /*+append*/
- react-router
- 树莓派编译FFMPEG
- 关于shrio在web校验权限时你所要知道的