原理之前单独总结过,在这里:

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 重定位表编程(枚举重定位地址)相关推荐

  1. 导入表编程-枚举导入表

    导入表编程-枚举导入表 思路: 首先导入表的RVA地址,就在optional Header的DataDirectory的第二个元素中.通过它我们定位到导入表. 导入表类似一个二级索引.一级是一个模块目 ...

  2. Windows PE第6章 栈与重定位表

    第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...

  3. PE格式第七讲,重定位表

    PE格式第七讲,重定位表 作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首 ...

  4. 操作系统是如何使用重定位表的

    一.重定位表的结构 重定位表是数据目录中第6项,它的结构如图示: 重定位表由多个块(block)组成,每个块内部由三部分组成--VirtualAddress.SizeOfBlock 和若干个2字节偏移 ...

  5. 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc)

    系列汇总 写一个PE的壳_Part 1:加载PE文件到内存 写一个PE的壳_Part 2:ASLR+修复输入表(IAT)+重定位表支持(.reloc) 写一个PE的壳_Part 3:Section里实 ...

  6. PE学习(六)第六章 栈与重定位表 实例栈溢出、模拟加载器加载DLL、遍历重定位表

    第六章 栈与重定位表 16bit OS 存在长调用 lcall push cs,ip    相应的iret pop ip, cs  而call/ret only focus ip register 3 ...

  7. PE结构基址重定位表

    PE体系 PE结构&整体叙述 PE结构&导入表 PE结构&导出表 PE结构&基址重定位表 PE结构&绑定导入实现 PE结构&延迟加载导入表 重定位表定位 ...

  8. PE文件-手工修改重定位表-WinHex-CFF Explorer

    文章目录 1.CFF Explorer 2.计算添加后的重定位大小 3.作者答疑 1.CFF Explorer   如果需要修改exe,dll等的二进制代码,遇到添加绝对地址时,需要将绝对地址的位置添 ...

  9. 滴水逆向三期实践15:重定位表修正

    我们知道,重定位表是由于在代码中写入的绝对地址,而 DLL 不能按照设想的 ImageBase 作起始加载位置去了别的地方占坑,那么需要根据重定位表记录的这些绝对地址在内存中的位置(RVA),逐一去到 ...

最新文章

  1. Github 树形菜单插件
  2. java培训分享:java软件开发可以用哪些软件?
  3. (原)War3 脚本分析5-基础脚本资源
  4. 两个server 两个数据库 微服务_微服务的数据库设计
  5. android替换电话应用,android – 替换调用应用程序
  6. 基于ARQ反馈的无人机通信中继自主选择研究
  7. Unreal的控制台命令参数合集
  8. javascript 校验 非空_前端(js+JQuery非空校验)
  9. 复函数图像怎么画_matlab复变函数画图形
  10. print to pdf in windows 7
  11. 剪枝算法(算法优化)
  12. 大数定律、中心极限定理总结
  13. Django框架学习记录(3)
  14. 【MAF】MAF插件框架简介
  15. PC端实现微信支付功能(Vue2.0)
  16. 计算机视觉物体识别的过程,(物体识别过程.doc
  17. Verilog学习笔记-——Verilog模块例化
  18. CentOS 5设置千兆网卡
  19. java培训机构靠谱吗,已入坑老司机给你的几点忠告
  20. sql语句的批量添加

热门文章

  1. ES6简单总结(搭配简单的讲解和小案例)
  2. 大型企业云化2.0的深度思考与展望
  3. 5行脚本代码完美破解99%的过期软件
  4. ubuntu下磁道坏区的检测与修复
  5. Java代码-CPU占用过高排查思路
  6. Java 调用 C++ (Java 调用 dll)康哥手把手教你
  7. ROS Indigo下安装测试Xtion Pro
  8. bzoj 2190: [SDOI2008]仪仗队 线性欧拉函数
  9. ASP.NET动态的修改主题
  10. 在指定的查找范围内获取DOM元素