原文发表于百度空间,2008-11-02========================================================================== 先定义一下用到的几个变量:char *hModule=NULL;//映射后的基址PIMAGE_OPTIONAL_HEADER pOptHeader;//扩展头PIMAGE_DATA_DIRECTORY pRelocTable=NULL;//指向重定位表PIMAGE_BASE_RELOCATION pReloc…
重定位表 ​ 当链接器生成一个PE文件时,会假设这个文件在执行时被装载到默认的基地址处(基地址+RVA就是VA).并把code和data的相关地址写入PE文件.如果像EXE一样首先加载就是它imageBase没问题能算出真正的VA,但是要有多个DLL文件,就会出现基址不对的问题,通过基址+RVA算出来的数据地址和函数地址就会出问题(链接器算的)需要重定位表来调整.在PE文件中重定位表往往单独作为一个节用".reloc"表示. #define IMAGE_DIRECTORY_ENTRY_…
原理之前单独总结过,在这里: http://blog.csdn.net/u013761036/article/details/54051347 下面是枚举重定位信息的代码: // ReLocationX86.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <string> #include <windows.h> #include <shlwapi.h> #include <Dbghel…
原文发表于百度空间,2009-03-30========================================================================== 阅读提示:由于继续使用了chichou同学的CodeHighlighter来修饰代码,造成文章字数过多,故分成三篇,且后两篇内容的顺序稍有调整,阅读时请根据大标题的顺序来~ 前置知识:Windows句柄表的基本结构本文以WRK1.2的代码为参考,主要分析Windows句柄表的分配算法,其实只要了解了句柄表的结…
原文发表于百度空间,2009-02-28========================================================================== 句柄是Windows对象管理中引入的一个东西,它的实际意义是对象在句柄表中的索引.Windows2000使用的是固定的三层句柄表,而WindowsXP和Windows2003都是使用的动态可扩展的三层句柄表,这是一种很优秀的结构,易扩展,且查找迅速,值得学习.通常情况下每个进程的句柄表都是一级表,当句柄数超过…
原文发表于百度空间,2009-03-31========================================================================== 理论结合实践,这是我一贯的学习方法~~实验目的:以实验的方式观察PspCidTable的变化,从中了解Windows句柄表的分配过程.实验器材:Windbg,RunIt(一个可控的不断创建线程的程序),DebugView知识回顾: 如图所示,句柄表的结构根据TableLevel来确定:TableLevel为0…
原文发表于百度空间,2009-03-30========================================================================== 三.当需要申请一个新的二级表(MidLevelTable)时,调用ExpAllocateMidLevelTable函数 PHANDLE_TABLE_ENTRY * ExpAllocateMidLevelTable ( IN PHANDLE_TABLE HandleTable, IN BOOLEAN DoIni…
原文发表于百度空间,2009-03-30========================================================================== 四.句柄表的扩容:已分配的句柄表被用完时,ExpAllocateHandleTableEntrySlow被调用以分配一个新的句柄表,实现对句柄表的扩容.每次增加粒度都是一个一级表的大小(大小为PAGE_SIZE,句柄容量为PAGE_SIZE/sizeof(HANDLE_TABLE_ENTRY)*HANDLE_…
PE格式第七讲,重定位表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先,我们先看一段代码,比如调用Printf函数,使用OD查看. 那么大家有没有想过这么一个问题,函数的字符串偏移是00407030位置,函数Call的地址是00401020的位置 但是如果模块首地址申请不到了,变为了00100000的位置,那么此时的偏移是不是都是错的了? 首先说下,一般重定位表格都是D…
第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构.重定位表则是在一个PE中的代码被加载到任意一个内存地址时,用来描述相关操作数地址变化规律的数据结构.通过重定位技术,代码运行在内存中的任意位置时,可以避免因操作数的定位错误而导致失败. 6.1栈 前面基本概念直接过... 程序在运行的时候会为系统分配一块内存区域作为栈,由栈选择子SS和栈定指针(es…