Linux内核实现PE加载器——Longene源码分析

本文深入分析Longene项目如何在Linux内核中实现PE加载器,使得Linux能够运行Windows应用。从load_pe_binary函数开始,详细讲解了预留进程地址空间、映射二进制文件、搜索ntdll.dll.so、调用LdrInitializeThunk等关键步骤,以及Linux内核模拟Windows APC机制来完成动态链接的过程。

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

Longene是一个源自中国的自由、开源的操作系统项目,目的是要把Linux的内核扩充成一个既支持Linux应用、也支持Windows应用,既支持Linux设备驱动、也支持Windows设备驱动的兼容内核;使用户可以直接在Linux操作系统上高效运行Windows应用。2006年发布了其第一个版本,但是自2014年以来,项目开发已停止,2018年5月其官网无法访问。这里就不多做介绍了,直接开始从源码角度分析Longene是怎么在Linux内核中实现PE加载器的。

Longene中PE可执行文件的加载以及动态链接的过程主要在/module/ke/文件夹中的代码实现。

Longene采用内核模块的形式,在内核中注册了pe格式的文件。(之前有分析过了如何扩展可支持的文件格式),该结构体为pe_format。

当执行某exe文件,例如在命令行里面敲入 ./notepad.exe的时候,首先linux内核调用execve系统调用最终走到会走到longene兼容模块的load_pe_bianry函数中(这也是前面分析过的)。

进入load_pe_binary函数,首先判断父进程是否是win32程序。

接下来就是一堆常规的操作,比如预留进程地址空间,将二进制文件映射至内存,调整堆栈大小,为解释器预留空间等。

然后是一个重要的步骤,搜索ntdll.dll.so,也就是wine代码生成的builtin dll。在$ PATH中搜索ntdll.dll.so,默认是/usr/local/lib/wine/ntdll.dll.so。找到后才可以执行下面的代码。

search_ntdll函数如下图所示:

调用函数map_system_dll映射ntdll.dll.so。该函数在sysdll.c中定义,先通过load_elf_interp函数将ntdll.dll.so装入,该函数主体部分基本是参考linux内核源码中ELF文件加载启动的那部分代码(binfmt_elf.c)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值