Chinaunix首页 | 论坛 | 博客
  • 博客访问: 164586
  • 博文数量: 36
  • 博客积分: 1466
  • 博客等级: 上尉
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-17 17:43
文章分类

全部博文(36)

分类: 网络与安全

2008-07-08 00:09:34

PE文件的格式比较复杂,复习下面的名词

file offset                   = 文件偏移
raw offset                    = 物理地址
virtual address(VA)           = 虚拟地址
relative virtual address(RVA) = 相对虚拟地址

相对虚拟地址(RVA) = 虚拟地址(VA) - 基地址(ImageBase)

File Offset = RVA - Δk
File Offset = VA - ImageBase - Δk

------------------------------------

PE文件格式的总体结构主要如下图
------------------------------------------------------------------------
在shallcode和脱壳的过程中主要是对输出表和输入表做手脚,所以重点记下。

输出表结构定义如下

输出表的作用是帮助我们通过 函数名字 或者 函数序号 找到函数地址。

从 序号(ordIndex) 得到 某一函数的RVA 方法为:
WORD functionIndex = AddressOfNameOrdinals[ordIndex - Base];
DWORD functionAddress = AddressOfFunctions[functionIndex]

从 函数名称(function_name) 得到函数的RVA方法复杂一点:
WORD nameIndex = FindIndexOfString(AddressOfNames, "function_name");
WORD functionIndex = AddressOfNameOrdinals[nameIndex];
DWORD functionAddress = AddressOfFunctions[functionIndex];

关于 AddressOfFunctions 数组,有两件重要的事情需记住。第一,如果 Base 是 10 ,则此数组之第一个 DWORD 应该对应序号 10 ,第二个 DWORD 应该对应序号 11 ,依此类推。第二,序号可以跳号。如果此一模块输出两个函数(假设Base为1),序号 为 1 和 3 ,AddressOfFunctions 数组还是需要三个元素。数组中的元素如果不对应到一 个输出函数,那么元素内容应该是 0 。

AddressOfNames,此数组每个元素所向的 函数名字 必须是唯一的。但是不同的 函数名字 可能指向同一个函数地址。

AddressOfNameOrdinals中的元素和AddressOfNames一一对应。但它的元素值不必是唯一的(因为不同的 函数名字 可以指向同一个函数)。

在研究输入表的过程中我以一个样板DLL为例,画了一个图~~~

-----------------------------------------------------------------------


输入表输入表

阅读(1786) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~