Windows PE 重定位表编程(枚举重定位地址)
原理之前单独总结过,在这里:
http://blog.csdn.net/u013761036/article/details/54051347
下面是枚举重定位信息的代码:
// ReLocationX86.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <string>
#include <windows.h>
#include <shlwapi.h>
#include <Dbghelp.h> //ImageRvaToVa
#pragma comment(lib, "Dbghelp.lib")
#pragma comment(lib, "shlwapi.lib")
using namespace std;
#pragma warning(disable : 4996)unsigned char bMemory[1024*1024*5] = {0};DWORD dwLoadPE2Memory(string strPePath){
FILE *fpLoadDll;
char cCache[1024];
if((fpLoadDll = fopen(strPePath.c_str(),"rb")) == NULL) {
return 0;
}
DWORD dwNowReadId = 0;
while (1) {
ZeroMemory(cCache ,sizeof(cCache));
DWORD dwReadSize = fread(cCache,1,1024 ,fpLoadDll);
DWORD dwErrorCode = GetLastError();
if(dwReadSize == 0){
break;
}
for(int i = 1 ;i <= dwReadSize ;i ++){
bMemory[dwNowReadId++] = cCache[i-1];
}
}
fclose(fpLoadDll);
return dwNowReadId;
}void DoReLocation( void * pBaseAddress){PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pBaseAddress;
PIMAGE_NT_HEADERS pNtHeaders = (PIMAGE_NT_HEADERS)((PBYTE)pBaseAddress + pDosHeader->e_lfanew); //PIMAGE_BASE_RELOCATION pNowPageAddress = (PIMAGE_BASE_RELOCATION)((unsigned long)pBaseAddress + pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
if(pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress == 0){
return ;
}
PIMAGE_BASE_RELOCATION pNowPageAddress = (PIMAGE_BASE_RELOCATION)ImageRvaToVa(
pNtHeaders, pBaseAddress,
pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,
NULL);while ((pNowPageAddress->VirtualAddress + pNowPageAddress->SizeOfBlock) != 0) {WORD *pLocalListAddress = (WORD *)((PBYTE)pNowPageAddress + sizeof(IMAGE_BASE_RELOCATION));int nNumberOfReloc = (pNowPageAddress->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION))/sizeof(WORD);for ( int i=0 ; i < nNumberOfReloc; i++){if ((DWORD)(pLocalListAddress[i] & 0x0000F000) == 0x00003000){DWORD* pNeedReLocationAddress = (DWORD *)((PBYTE)pBaseAddress + pNowPageAddress->VirtualAddress + (pLocalListAddress[i] & 0x0FFF));DWORD dwDelta = (DWORD)pBaseAddress - pNtHeaders->OptionalHeader.ImageBase;*pLocalListAddress += dwDelta;DWORD dwSorAddress ,dwNewAddress ,dwImageBaseAddress ,dwVirtualBaseAddress;
dwSorAddress = *pLocalListAddress - dwDelta;dwNewAddress = *pLocalListAddress;
dwImageBaseAddress = pNtHeaders->OptionalHeader.ImageBase;
dwVirtualBaseAddress = (DWORD)pBaseAddress;
printf("ImageBasAd:%X ,VirtualBasAd:%X ,SorAd:%X ,NewAd:%X\n" ,dwImageBaseAddress ,dwVirtualBaseAddress ,dwSorAddress ,dwNewAddress);}}pNowPageAddress = (PIMAGE_BASE_RELOCATION)((PBYTE)pNowPageAddress + pNowPageAddress->SizeOfBlock);}
}int _tmain(int argc, _TCHAR* argv[])
{
//HMODULE hModule = GetModuleHandle(NULL);
if(dwLoadPE2Memory("C:\\TTT.exe")){
DoReLocation(bMemory);
}
return 0;
}
Windows PE 重定位表编程(枚举重定位地址)相关推荐
- 导入表编程-枚举导入表
导入表编程-枚举导入表 思路: 首先导入表的RVA地址,就在optional Header的DataDirectory的第二个元素中.通过它我们定位到导入表. 导入表类似一个二级索引.一级是一个模块目 ...
- Windows PE第6章 栈与重定位表
第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...
- PE格式第七讲,重定位表
PE格式第七讲,重定位表 作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首 ...
- 操作系统是如何使用重定位表的
一.重定位表的结构 重定位表是数据目录中第6项,它的结构如图示: 重定位表由多个块(block)组成,每个块内部由三部分组成--VirtualAddress.SizeOfBlock 和若干个2字节偏移 ...
- 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc)
系列汇总 写一个PE的壳_Part 1:加载PE文件到内存 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc) 写一个PE的壳_Part 3:Section里实 ...
- PE学习(六)第六章 栈与重定位表 实例栈溢出、模拟加载器加载DLL、遍历重定位表
第六章 栈与重定位表 16bit OS 存在长调用 lcall push cs,ip 相应的iret pop ip, cs 而call/ret only focus ip register 3 ...
- PE结构基址重定位表
PE体系 PE结构&整体叙述 PE结构&导入表 PE结构&导出表 PE结构&基址重定位表 PE结构&绑定导入实现 PE结构&延迟加载导入表 重定位表定位 ...
- PE文件-手工修改重定位表-WinHex-CFF Explorer
文章目录 1.CFF Explorer 2.计算添加后的重定位大小 3.作者答疑 1.CFF Explorer 如果需要修改exe,dll等的二进制代码,遇到添加绝对地址时,需要将绝对地址的位置添 ...
- 滴水逆向三期实践15:重定位表修正
我们知道,重定位表是由于在代码中写入的绝对地址,而 DLL 不能按照设想的 ImageBase 作起始加载位置去了别的地方占坑,那么需要根据重定位表记录的这些绝对地址在内存中的位置(RVA),逐一去到 ...
最新文章
- Github 树形菜单插件
- java培训分享:java软件开发可以用哪些软件?
- (原)War3 脚本分析5-基础脚本资源
- 两个server 两个数据库 微服务_微服务的数据库设计
- android替换电话应用,android – 替换调用应用程序
- 基于ARQ反馈的无人机通信中继自主选择研究
- Unreal的控制台命令参数合集
- javascript 校验 非空_前端(js+JQuery非空校验)
- 复函数图像怎么画_matlab复变函数画图形
- print to pdf in windows 7
- 剪枝算法(算法优化)
- 大数定律、中心极限定理总结
- Django框架学习记录(3)
- 【MAF】MAF插件框架简介
- PC端实现微信支付功能(Vue2.0)
- 计算机视觉物体识别的过程,(物体识别过程.doc
- Verilog学习笔记-——Verilog模块例化
- CentOS 5设置千兆网卡
- java培训机构靠谱吗,已入坑老司机给你的几点忠告
- sql语句的批量添加