当前位置: 首页 > 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.jsqmd.com/news/1049450/

相关文章:

  • emWin皮肤定制实战:从回调机制到四大控件深度解析
  • 2026 西安高价回收名表 瑞士品牌腕表全品类承接 - 薛定谔的梨花猫
  • 2026 年萍乡市厨卫屋顶防水修缮三家横向测评:吉修匠 99.8 分稳居榜首 - 吉修匠
  • 2026无锡翡翠回收行情解析|多门店横向对比,透明变现指南 - 讯息早知道
  • 2026苏州黄金回收避雷红宝书:只推荐支持先检验后报价的透明门店 - 商业快讯早知道
  • Sketch设计效率革命:sandros-sketch-plugins完全指南 - 10个必备插件提升你的设计工作流
  • 嵌入式GUI开发实战:emWin多触点与指针输入设备驱动与手势应用详解
  • 针对新乡医学临床医学考研的培训机构有哪些,推荐这个机构,本地考研参考 - 考研机构推荐
  • 2026年6月水泥预制件厂商推荐,钢承口顶管/装配式水泥构件/电力检查井/水泥排水管道,水泥预制件源头厂家推荐 - 品牌推荐师
  • 2026年最新!青海青甘大环线旅游网红路线与靠谱公司推荐:青海峰渡阿里将军同款体验测评盘点/全攻略! - 速递信息
  • 网络工程-无线技术
  • WinAXP音乐播放器更新
  • 2026年项目审批流程总是拖慢进度,项目经理咨询众智商学院PMP前如何复盘治理和决策问题? - 众智商学院职业教育
  • Python之antennass包语法、参数和实际应用案例
  • 2026苏州黄金回收靠谱榜:本地人亲测五年以上老店,附实时黄金回收价参考 - 商业信息快查
  • 2026广州局改装修价格透明化:一物一图一价模式解析 - 优家闲谈
  • 在陕西用过的路灯公司,哪家能真正让人满意呢? - 速递信息
  • Docker部署RAGFlow:从零搭建本地知识库问答系统
  • 2026汕头市装修公司排行榜,汕头及潮南口碑好的装饰公司有哪几家 - 速递信息
  • 深度解析Android运行时(ART):从原理到实战优化指南
  • 深圳龙岗泰语培训排名 - 速递信息
  • 2026 安徽省|中考两三百分想学护理 3+2,全省统一最新简章发布,招生联系方式多少 - 我叫小周
  • 告别Appium Desktop:NPM+Appium Inspector打造高效Android自动化测试环境
  • 2026 东莞汽车音响改装行业标杆:虎门杰生全维度领跑,铸就绝对第一实力 - 汽车音响改装
  • 深圳意大利语培训哪家口碑好 - 速递信息
  • 深圳离婚律师选择指南2026年 - 曹律
  • 2026长春黄金回收攻略,5家正规门店实测,实时行情价回收 - 商业信息快查
  • 避坑干货|2026 杭州格力中央空调公司横向测评 6 强榜单 - 速递信息
  • 甘肃农村一氧化碳报警器厂家推荐,一氧化碳厂家电话咨询:185-9427-5329立可安适配西北燃煤取暖环境 - 厂家新闻网
  • emWin窗口管理器高级API:运动支持、工具提示与多缓冲实战解析