动态加载dll到内存-未完待续

本文来自很早之前没看到的一个函数,今天偶然翻看记录,发现对我来说还挺有难度,所以打算记录一下,如有错误,还请留言不吝赐教啦!

一、PE文件组成

参考链接:
一个Windows NT的应用程序典型地拥有9个预定义段
 
 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text、.bss、.rdata、.data、.rsrc、.edata、.idata、.pdata和.debug。一些应用程序不需要所有的这些段,同样还有一些应用程序为了自己特殊的需要而定义了更多的段。

1、可执行代码段,.text

IAT + 代码段

.text段包含了早先提到过的入口点。IAT亦存在于.text段之中的模块入口点之前。(IAT在.text段之中的存在非常有意义,因为这个表事实上是一系列的jmp跳转指令,并且它们的跳转目标位置是已固定的地址。例如:jmp + 函数addr ,主函数调用fun函数时,先跳转到 IAT的 jmp fun 地址,然后执行跳转到 fun 函数中。)
当Windows NT的可执行映像装载入进程的地址空间时,IAT就和每一个导入函数的物理地址一同确定了。要在.text段之中查找IAT,装载器只用将模块的入口点定位,而IAT恰恰出现于入口点之前。既然每个入口拥有相同的尺寸,那么向后退查找这个表的起始位置就很容易了。

2、 数据段,.bss、.rdata、.data

.bss段:表示应用程序的未初始化数据,包括所有函数或源模块中声明为static的变量。用来存放程序中未初始化的全局变量的一块内存区域。
.rdata段:表示只读的数据,比如字符串文字量、常量和调试目录信息。
.data段:所有其它变量(除了出现在栈上的自动变量)存储在.data段之中。基本上,这些是应用程序或模块的全局变量。
导入导出数据段:
.idata段:是导入数据,包括导入库和导入地址名称表。虽然定义了IMAGE_DIRECTORY_ENTRY_IMPORT,但是WINNT.H之中并无相应的导入目录结构
.edata段:是导出数据,包含了应用程序或DLL的导出数据。在这个段出现的时候,它会包含一个到达导出信息的导出目录。

3、资源段,.rsrc

.rsrc段:包含了模块的资源信息。它起始于一个资源目录结构,这个结构就像其它大多数结构一样,但是它的数据被更进一步地组织在了一棵资源树之中。

6、调试信息段,.debug

.debug段:调试信息位于.debug段之中,同时PE文件格式也支持单独的调试文件(通常由.DBG扩展名标识)作为一种将调试信息集中的方法。调试段包含了调试信息,但是调试目录却位于早先提到的.rdata段之中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值