Wine中PE格式文件的加载(四):DLL的装入和连接

本文详细介绍了Wine如何在PE可执行文件加载过程中,通过LdrInitializeThunk函数实现DLL的装入和连接。从exe开始,递归装入所有依赖的dll,通过import_dll和load_dll函数完成模块的加载和函数地址解析。同时,文章提到了wineconfig的dll配置、fake dll的处理以及native和built-in dll的装入区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在加载完PE可执行文件后,回到kernel32的入口函数__wine_kernel_init中,接下来调用了函数LdrInitializeThunk。dll的装入和连接过程主要是该函数实现的。

函数部分代码如下图所示:

 

先用main_exe_file判断主模块是否已经被建立了,这是在wine_process_init函数中被赋值的一个句柄类型。

get_moderf的作用正如注释所说,是为可执行文件分配一个模块的引用结构。

在Wine装入和连接dll的时候,每个用到的dll以及exe,都对应于一个“模块的引用结构”,WINE_MODREF类型,并且装载过程中也将单个dll或exe视作一个模块。结构如下图所示:

其中LDR_MODULE类型来源于Windows。由于每个dll中都描述了其直接依赖的一组dll,所以需要用一个指针数组deps来记录。而nDeps顾名思义就是直接依赖的dll个数。

所以在装入和连接过程中,应该是有这样一颗树

然后就是对PEB信息进行填充。

该函数中直接负责dll装载和连接的,只有fixup_imports。函数代码如下图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值