LoadPE  被加载PE文件代码分析(ASM汇编版本)>>03
目录一、整体加载流程概览二、详细实现步骤汇编思路阶段0: OEP环境设置引用等确定OEP加载程序需要加载的程序大小编译器链接器解决基地址(到时候在看看)申请LoadPE所需要的空间加载的过程包引用环境变量等查看基地址是否在400000地址加载定义全局变量三、阶段分析阶段 1打开目标文件阶段 2 3文件映射到虚拟内存阶段 4解析 PE 结构核心阶段阶段 5跳到目标程序运行四、汇编实现的核心特点五、总结一、整体加载流程概览LoadPE 的加载过程主要分为5 个大阶段共 10 余个具体步骤打开文件映射虚拟内存获取虚拟内存解析 PE 结构最核心、最复杂的一步跳到目标程序运行二、详细实现步骤汇编思路阶段0: OEP环境设置引用等确定OEP加载程序首先要确定加载的程序的入口点也就是OEP但是加载到目标主机 可能0x40000被占用所以我们loadPE需要解决这个问题需要加载的程序大小可选头里面有个sizeofImage 394000也就是这个大小编译器链接器解决基地址(到时候在看看)工程选项 设置链接器申请LoadPE所需要的空间也就是在程序入口点code的位置后面申请394000H 字节的空间给我的 LoadPE函数加载的程序IMAGE_SIZE EQU 394000H .code ORG IMAGE_SIZE ; 也就是LoadPE函数的其实位置是394000H 1H LoadPE PROC ; Function ret LoadPE endp加载的过程包引用环境变量等使用的模式.386 .model flat,c option casemap:none引用的宏静态库.const ; constant IMAGE_SIZE EQU 394000H .data ; data g_szfile db PlantsVsZombies.exe ; file Name .code ORG IMAGE_SIZE LoadPE PROC ; Function ret LoadPE endp start: ; main INVOKE LoadPE ; call function end start查看基地址是否在400000地址加载这也就说明成功加载到了0x00400000的位置400000以后的位置都预留好了 --- 394000定义全局变量LOCAL hFILE:HANDLE LOCAL hFileMap:HANDLE LOCAL szPeBuffer:LPVOID LOCAL pDosHeader:PTR IMAGE_DOS_HEADER LOCAL pNtHeader:PTR IMAGE NT HEADERS LOCAL pSecetionHeader:PTR IMAGE_SECTION_HEADER LOCAL dwNumberSec:DWORD LOCAL dwSizeOfHeader:DWORD LOCAL dwEP:DWORD LOCAL plmagelmpHeader:PTR IMAGE_IMPORT_DESCRIPTOR LOCAL ZeroHeadImp: IMAGE IMPORT DESCRIPTOR LOCAL dwImageBase:DWORD LOCAL dwMod:HANDLE三、阶段分析阶段 1打开目标文件使用CreateFileAPI 打开目标程序文件例如PlantsVsZombies.exe。以只读方式打开获取文件句柄hFILE。阶段 2 3文件映射到虚拟内存调用CreateFileMapping创建一个文件映射对象。调用MapViewOfFile将文件内容映射到进程的虚拟内存空间得到内存指针szPeBuffer。此时目标 PE 文件的内容以只读的形式存在于内存中供后续解析使用。阶段 4解析 PE 结构核心阶段这是整个 LoadPE 中最重要、最体现汇编功底的部分需要一步步手动解析 PE 文件格式4.1 获取 DOS 头将映射的内存首地址赋值给pDosHeader。通过e_lfanew字段定位到 PE 头的位置。4.2 获取 NT 头根据 DOS 头的e_lfanew偏移找到IMAGE_NT_HEADERS。4.3 获取文件头大小SizeOfHeaders从 NT 头的 OptionalHeader 中读取SizeOfHeaders用于后续拷贝头部。4.4 获取节数量NumberOfSections从 FileHeader 中读取节的数量后续用于遍历所有节。4.5 获取程序入口点AddressOfEntryPoint读取 OptionalHeader 中的AddressOfEntryPointRVA并加上 ImageBase得到最终入口点地址。4.6 获取导入表Import Directory从 DataDirectory 中找到导入表的位置IMAGE_DIRECTORY_ENTRY_IMPORT。由于植物大战僵尸是需要api函数由于我们是脱了操作系统那就没人帮我获取请api需要自己手动解析导入表4.7 获取名称表和 IAT 表遍历IMAGE_IMPORT_DESCRIPTOR结构分别获取 DLL 名称 RVA 和 FirstThunkIAT、OriginalFirstThunkINT。4.8 加载所需的 DLL对于每个需要导入的 DLL调用 LoadLibrary 将其加载到当前进程。填充IAT表4.9 修复导入地址表IAT遍历 IAT 中的每个函数如果是序号导入则直接使用序号。如果是名称导入则通过 GetProcAddress 获取函数地址。将获取到的真实函数地址填充回目标程序的 IAT 表中使其能正常调用系统 API。阶段 5跳到目标程序运行对目标加载地址通常为00400000进行VirtualProtect修改内存保护属性为PAGE_EXECUTE_READWRITE。将解析好的 PE 头部和所有节数据拷贝到目标地址空间。完成所有准备工作后使用JMP指令直接跳转到目标程序的入口点dwEP。此时控制权完全交给目标程序LoadPE 的使命完成。四、汇编实现的核心特点全程手动操作几乎所有 PE 结构字段都需要通过寄存器偏移手动读取和计算。寄存器密集由于汇编无法直接进行内存到内存的操作大量使用MOV、ADD、LEA等指令以及ASSUME伪指令来模拟结构体。内存精确控制通过VirtualProtectcrt_memcpy实现对内存的精准拷贝和权限管理。地址固定技巧使用ORG IMAGE_SIZE将自身代码推后为目标程序的 ImageBase00400000预留足够空间。五、总结用汇编实现 LoadPE 的本质是自己当一次 Windows Loader—— 手动打开文件、映射内存、解析 PE 头、拷贝数据、修复导入表最后把执行权交给目标程序。整个过程虽然代码量较大、逻辑繁琐但赋予了开发者对加载流程的完全控制权为后续的免杀优化例如手动导出表解析、减少敏感 API 调用、直接 syscall 等提供了坚实的基础。这就是为什么许多高隐蔽 Loader 都倾向于使用汇编来实现核心加载逻辑。

相关新闻

AI Agent 面试题 799:Agent系统的微服务拆分和服务网格设计

AI Agent 面试题 799:Agent系统的微服务拆分和服务网格设计

🔥 AI Agent 面试题 799:Agent系统的微服务拆分和服务网格设计摘要:本文深入解析了「Agent系统的微服务拆分和服务网格设计」这一 AI Agent 领域的核心面试题。文章从 容器化部署 的基本概念出发,系统性地剖析了 微服务、服务网格…

2026/6/20 10:28:44阅读更多 →
Mac本地跑大模型实操指南:Ollama+GGUF+Metal零失败部署

Mac本地跑大模型实操指南:Ollama+GGUF+Metal零失败部署

1. 项目概述:为什么Mac本地跑大模型不再是“玄学”,而是手把手就能落地的事最近在几个技术群和本地AI爱好者聚会上,总有人问:“Mac上真能跑得动Gemma4或者Qwen3.5这种级别的大模型吗?不是只能靠API调用、天天看Token余…

2026/6/20 10:23:44阅读更多 →
Gin vs Actix-Web:Go 与 Rust 两大顶尖 Web 框架全维度深度对比

Gin vs Actix-Web:Go 与 Rust 两大顶尖 Web 框架全维度深度对比

在现代后端开发领域,Go 语言的 Gin 与 Rust 语言的 Actix-Web 是各自生态中对标高性能 API、微服务、高并发场景的标杆级 Web 框架。二者均以极致性能为核心标签,却因底层语言特性、设计哲学、运行模型的差异,走向了完全不同的技术路线。本文…

2026/6/20 10:23:44阅读更多 →
XXMI启动器:一站式游戏模组管理终极指南,告别繁琐配置的完整解决方案

XXMI启动器:一站式游戏模组管理终极指南,告别繁琐配置的完整解决方案

XXMI启动器:一站式游戏模组管理终极指南,告别繁琐配置的完整解决方案 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 你是否曾经为了给《原神》安装角色模…

2026/6/20 11:43:50阅读更多 →
EI框架:多模态医学图像分析的早期干预新范式

EI框架:多模态医学图像分析的早期干预新范式

1. EI框架:多模态医学图像分析的范式革新在医学影像分析领域,多模态数据融合一直是提升诊断准确性的关键路径。传统方法通常遵循"单模态嵌入后融合"(Fusion after Unimodal Image Embedding)的范式,这种延迟…

2026/6/20 11:43:50阅读更多 →
Maya glTF导出插件:从3D格式转换到高效工作流整合

Maya glTF导出插件:从3D格式转换到高效工作流整合

Maya glTF导出插件:从3D格式转换到高效工作流整合 【免费下载链接】maya-glTF glTF 2.0 exporter for Autodesk Maya 项目地址: https://gitcode.com/gh_mirrors/ma/maya-glTF 在当今3D内容创作领域,格式兼容性问题一直是困扰开发者和艺术家的主要…

2026/6/20 11:43:50阅读更多 →
深入解析Kinetis KL33引脚复用:从机制到硬件设计与低功耗优化

深入解析Kinetis KL33引脚复用:从机制到硬件设计与低功耗优化

1. 项目概述:为什么我们需要深入理解引脚复用? 在嵌入式硬件设计的初期,我们拿到一颗微控制器(MCU)的数据手册,最常翻看的部分除了电气特性,恐怕就是引脚定义和功能复用表了。对于像飞思卡尔&am…

2026/6/20 11:43:50阅读更多 →
终极指南:如何在Linux与Windows系统上快速安装doom-ascii的完整对比

终极指南:如何在Linux与Windows系统上快速安装doom-ascii的完整对比

终极指南:如何在Linux与Windows系统上快速安装doom-ascii的完整对比 【免费下载链接】doom-ascii DooM in the terminal! 项目地址: https://gitcode.com/gh_mirrors/do/doom-ascii 🚀 doom-ascii 是一款创新的终端版经典射击游戏,让你…

2026/6/20 11:43:50阅读更多 →
Poedit:跨平台翻译编辑器的终极解决方案

Poedit:跨平台翻译编辑器的终极解决方案

Poedit:跨平台翻译编辑器的终极解决方案 【免费下载链接】poedit Simple translation editor for PO, XLIFF, JSON etc. for Mac/Windows/Unix 项目地址: https://gitcode.com/gh_mirrors/po/poedit Poedit是一款专业的跨平台翻译编辑器,专门用于…

2026/6/20 11:38:50阅读更多 →
【课程设计/毕业设计】基于 Web 的高校县志馆藏信息综合管理系统设计与实现 基于Django的青岛滨海学院特色文献捐赠流转管理系统的设计与实现【附源码、数据库、万字文档】

【课程设计/毕业设计】基于 Web 的高校县志馆藏信息综合管理系统设计与实现 基于Django的青岛滨海学院特色文献捐赠流转管理系统的设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/20 0:02:40阅读更多 →
MC68HC908RF2A定时器PWM生成原理与实战:无缓冲与缓冲模式详解

MC68HC908RF2A定时器PWM生成原理与实战:无缓冲与缓冲模式详解

1. 项目概述与核心价值在嵌入式开发,尤其是电机驱动、LED调光、开关电源这些需要精确控制“能量”的领域,脉冲宽度调制(PWM)技术是工程师手中的一把瑞士军刀。它的本质很简单:用一个固定频率的方波,通过改变…

2026/6/20 0:02:40阅读更多 →
在银河麒麟V10桌面(2205版本)上实战部署软RAID 1:从模块黑名单到自动挂载

在银河麒麟V10桌面(2205版本)上实战部署软RAID 1:从模块黑名单到自动挂载

1. 银河麒麟V10桌面系统与软RAID 1基础认知 第一次在银河麒麟V10桌面上折腾软RAID 1时,我踩了不少坑。这个国产操作系统基于Linux内核,但2205版本对软RAID模块做了特殊处理,需要额外操作才能正常使用。软RAID 1其实就是磁盘镜像技术&#xff…

2026/6/20 0:02:40阅读更多 →