当前位置: 首页 > news >正文

LoadPE 代码实现部分(ASM汇编版本)>>04

目录

整体调用逻辑

源码实现部分


整体调用逻辑

start (程序入口) ↓ INVOKE LoadPE ↓ 1. 获取自身 ImageBase ↓ 2. 打开 PlantsVsZombies.exe → CreateFile → CreateFileMapping → MapViewOfFile ↓ 3. 解析 PE 结构 ├── DOS Header ├── NT Header(获取区段数量、入口点、SizeOfHeaders 等) └── Section Table 位置 ↓ 4. VirtualProtect(把自己内存改成可写可执行) ↓ 5. 拷贝 PE Headers 到自身内存 ↓ 6. 循环拷贝所有 Section(.text、.data、.rsrc 等) ↓ 7. 手动修复 Import Table(IAT) ├── 遍历每个 DLL ├── LoadLibrary 加载 DLL └── GetProcAddress + 填充 IAT ↓ 8. 清理文件映射和句柄 ↓ 9. JMP @dwEP ← 跳转到 PlantsVsZombies.exe 的原始入口点

源码实现部分

.386 .model flat, c option casemap:none include windows.inc include msvcrt.inc include kernel32.inc include user32.inc includelib msvcrt.lib includelib kernel32.lib includelib user32.lib .const IMAGE_SIZE EQU 394000H ; 自身预留内存大小(可后续优化为动态) .data g_szFile db "PlantsVsZombies.exe", 0 ; 要加载的目标程序 .code db 90h ; NOP 占位 ORG IMAGE_SIZE ; 代码放在高地址,避免覆盖自身 ;============================================================ ; 主加载函数 ;============================================================ LoadPE PROC ;===================== 局部变量 ===================== LOCAL @hFILE:HANDLE LOCAL @hFileMap:HANDLE LOCAL @szPeBuffer:LPVOID ; 文件映射指针 LOCAL @pDosHeader:PTR IMAGE_DOS_HEADER LOCAL @pNtHeader:PTR IMAGE_NT_HEADERS LOCAL @pSectionHeader:PTR IMAGE_SECTION_HEADER LOCAL @dwNumberSec:DWORD LOCAL @dwSizeOfHeader:DWORD LOCAL @dwEP:DWORD ; 目标 OEP (Original Entry Point) LOCAL @pImageImpHeader:PTR IMAGE_IMPORT_DESCRIPTOR LOCAL @ZeroHeadImp: IMAGE_IMPORT_DESCRIPTOR LOCAL @dwImageBase:DWORD ; 自身 ImageBase LOCAL @dwMod:HANDLE ; DLL 句柄 LOCAL @dwOld:DWORD ; 旧内存保护属性 ; 1. 获取自身模块基址 INVOKE GetModuleHandle, NULL MOV @dwImageBase, EAX ; 2. 打开并映射目标 PE 文件到内存 INVOKE CreateFile, offset g_szFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL MOV @hFILE, EAX INVOKE CreateFileMapping, @hFILE, NULL, PAGE_READONLY, 0, 0, NULL MOV @hFileMap, EAX INVOKE MapViewOfFile, @hFileMap, FILE_MAP_READ, 0, 0, 0 MOV @szPeBuffer, EAX ; 内存中的 PE 文件镜像 ; 3. 解析 PE Header MOV @pDosHeader, EAX ASSUME ESI :PTR IMAGE_DOS_HEADER MOV ESI, EAX ADD EAX, [ESI].e_lfanew ; 定位 NT Header MOV @pNtHeader, EAX ASSUME ESI :PTR IMAGE_NT_HEADERS MOV ESI, @pNtHeader MOV EAX, [ESI].OptionalHeader.SizeOfHeaders MOV @dwSizeOfHeader, EAX MOVZX EAX, [ESI].FileHeader.NumberOfSections MOV @dwNumberSec, EAX ; 计算目标入口点 OEP MOV EAX, [ESI].OptionalHeader.AddressOfEntryPoint ADD EAX, @dwImageBase MOV @dwEP, EAX ; 定位 Section Table MOVZX EAX, [ESI].FileHeader.SizeOfOptionalHeader LEA EBX, [ESI].OptionalHeader ADD EAX, EBX MOV @pSectionHeader, EAX ; 4. 修改自身内存保护权限(关键步骤) INVOKE VirtualProtect, @dwImageBase, IMAGE_SIZE, PAGE_EXECUTE_READWRITE, ADDR @dwOld ; 5. 拷贝 PE Headers INVOKE crt_memcpy, @dwImageBase, @szPeBuffer, @dwSizeOfHeader ; 6. 拷贝所有 Sections MOV ESI, @pSectionHeader ASSUME ESI :PTR IMAGE_SECTION_HEADER XOR ECX, ECX .WHILE ECX < @dwNumberSec MOV EDI, @dwImageBase ADD EDI, [ESI].VirtualAddress ; 目标地址 MOV EDX, @szPeBuffer ADD EDX, [ESI].PointerToRawData ; 源地址 PUSH ECX PUSH EDX INVOKE crt_memcpy, EDI, EDX, [ESI].SizeOfRawData POP EDX POP ECX INC ECX ADD ESI, SIZEOF IMAGE_SECTION_HEADER .ENDW ; 7. 修复 Import Table(IAT) MOV ESI, @pNtHeader MOV EAX, [ESI].OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT * 8].VirtualAddress ADD EAX, @dwImageBase MOV @pImageImpHeader, EAX MOV ESI, @pImageImpHeader ASSUME ESI:PTR IMAGE_IMPORT_DESCRIPTOR .WHILE TRUE INVOKE crt_memcmp, ESI, ADDR @ZeroHeadImp, SIZEOF IMAGE_IMPORT_DESCRIPTOR .IF EAX == 0 .BREAK .ENDIF .IF [ESI].Name1 == NULL || [ESI].FirstThunk == NULL || [ESI].OriginalFirstThunk == NULL .BREAK .ENDIF ; LoadLibrary 加载 DLL MOV EAX, [ESI].Name1 ADD EAX, @dwImageBase PUSH ECX PUSH EDX INVOKE LoadLibrary, EAX POP EDX POP ECX MOV @dwMod, EAX ; 修复该 DLL 的 IAT MOV EBX, [ESI].FirstThunk ADD EBX, @dwImageBase MOV EDI, [ESI].OriginalFirstThunk ADD EDI, @dwImageBase .while DWORD PTR[EDI] != 0 .IF dword PTR[EDI] & 80000000h MOV EDX, DWORD PTR[EDI] AND EDX, 0FFFFH .ELSE MOV EDX, DWORD PTR[EDI] ADD EDX, @dwImageBase ADD EDX, 2 .endif PUSH ECX PUSH EDX INVOKE GetProcAddress, @dwMod, EDX POP EDX POP ECX MOV DWORD PTR[EBX], EAX ADD EBX, 4 ADD EDI, 4 .endw ADD ESI, SIZEOF IMAGE_IMPORT_DESCRIPTOR .ENDW ; 8. 清理资源 INVOKE UnmapViewOfFile, @szPeBuffer INVOKE CloseHandle, @hFileMap INVOKE CloseHandle, @hFILE ; 9. 跳转执行目标程序 JMP @dwEP ret LoadPE ENDP ;============================================================ start: INVOKE LoadPE invoke ExitProcess, 0 ret end start
http://www.gsyq.cn/news/1561366.html

相关文章:

  • 嵌入式GUI开发实战:emWin多触点与指针输入设备驱动与手势应用详解
  • 2026年最新!青海青甘大环线旅游网红路线与靠谱公司推荐:青海峰渡阿里将军同款体验测评盘点/全攻略! - 速递信息
  • Python之antennass包语法、参数和实际应用案例
  • 深圳意大利语培训哪家口碑好 - 速递信息
  • 2026 安徽省|中考两三百分想学护理 3+2,全省统一最新简章发布,招生联系方式多少 - 我叫小周
  • 西安GEO公司真实表现,一线观察揭示行业细节 - 速递信息
  • 甘肃农村一氧化碳报警器厂家推荐,一氧化碳厂家电话咨询:185-9427-5329立可安适配西北燃煤取暖环境 - 厂家新闻网
  • 昆明旧金回收完整指南,2026 榜单盘点与线下门店实测汇总 - 讯息早知道
  • 无套路现款秒结,2026哈尔滨回收黄金口碑商家优选榜单 - 名奢变现站
  • 筑影编辑器 房屋设计 建筑可视化设计工具 个人开发
  • Kimi 生成的数学试卷如何导出,AI 导出鸭针对性优化数理公式渲染,实测多类转换工具选出稳定导出方案
  • 2026 西安奢包回收 添价收鉴定不拆五金不损包身 全程在视线内操作 - 薛定谔的梨花猫
  • 2026 年厦门市厨卫屋顶防水修缮三家对比测评:吉修匠 99.8 分 - 吉修匠
  • TQVaultAE终极指南:如何轻松管理泰坦之旅无限装备仓库
  • 专业的深圳泰语企业培训 - 速递信息
  • 2026年国内知名防爆墙厂家排行 助力选靠谱供应商 - 速递信息
  • 湛江全屋定制品牌口碑实测 本地业主真实评价排行 - 速递信息
  • HSTracker终极指南:macOS炉石传说玩家的完整卡组管理与对战辅助工具
  • 2026广州大额离婚维权:专精家事律师推荐,高胜诉律师事务所实测盘点 - 速递信息
  • 2026 年 6 月下旬最新官方正式辟谣|亨得利官方全网不实维保资讯澄清 + 正规网点公示 + 用户咨询答疑合集 - 亨得利官方维修中心
  • 2026深圳黄金回收误区澄清逸程告诉你怎么避坑 - 逸程
  • 2026年新疆吐鲁番短线旅游导游安排和费用边界说明 - 盛世西域旅行
  • python自动生成ggb绘图展示
  • 20260615
  • 2026南宁奢侈品首饰回收行业白皮书:线上估价到店砍一半?本地正规回收报价实价统一、绝不临时压价 - 讯息早知道
  • 2027QS曼彻斯特大学申请中介怎么选,录取数据与专业匹配全对比 - 速递信息
  • 2026苏州婚纱摄影精选榜单 五大优质婚摄机构实力测评 - charlieruizvin
  • 2026西安钻石回收榜首|行业执牛耳,高溢价透明变现标杆 - 讯息早知道
  • 翼飞智训AI空间“职引未来”端午雅集圆满举行 - 速递信息
  • 深度解析青海青甘大环线旅游公司哪家好?2026年6月综合实力测评与靠谱推荐:青海峰渡不踩坑 - 速递信息