Mergen架构详解探索LLVM IR提升引擎的内部工作原理【免费下载链接】MergenDeobfuscation via optimization with usage of LLVM IR and parsing assembly.项目地址: https://gitcode.com/gh_mirrors/me/Mergen你是否曾面对复杂的虚拟化保护代码感到束手无策Mergen作为一款革命性的x64 PE到LLVM IR提升工具专门为逆向工程师和二进制分析人员提供强大的去混淆和反虚拟化能力。本文将深入解析Mergen的架构设计帮助你理解这个LLVM IR提升引擎如何将汇编代码转化为可优化的中间表示从而简化逆向工程过程。什么是Mergen核心功能解析Mergen是一个函数级别的x64 PE到LLVM IR提升引擎专为去混淆和反虚拟化设计。它通过符号执行技术将受保护的二进制函数转换为LLVM中间表示让复杂的虚拟机保护和代码混淆变得透明化。这个工具的核心价值在于将不可读的虚拟化代码转换为标准化的LLVM IR为后续的优化和分析奠定基础。Mergen的工作流程可以概括为加载PE文件→解析目标函数→符号执行提升→生成LLVM IR→应用优化通道。整个过程完全自动化用户只需提供二进制文件和目标地址即可开始分析。核心技术架构七大阶段管道Mergen的架构采用精心设计的七阶段管道每个阶段都有明确的职责1. 运行时镜像验证阶段在lifter/core/RuntimeImageContext.hpp中实现负责验证PE头部信息并构建运行时镜像上下文。这是整个提升过程的基础确保二进制文件的完整性。2. 提升器配置阶段位于lifter/core/LifterStages.hpp调用loadFile函数解析PE导出表并自动为导出地址创建轮廓outline。这个阶段决定了哪些函数需要被提升。3. 内存策略配置阶段在lifter/memory/MemoryPolicySetup.hpp中实现设置内存访问策略。默认情况下使用符号内存访问SYMBOLIC但对于PE节区和栈区域则使用具体内存访问CONCRETE。栈保留空间被限制在[0x1000, 0x100000]范围内。4. 分页内存准备阶段lifter/core/LifterPipelineStages.hpp中的prepareRuntimePagedMemory函数负责标记内存映射区域的分页信息为后续的内存访问优化做准备。5. 签名分析阶段同样在lifter/core/LifterPipelineStages.hpp中运行基于签名的分析识别常见的代码模式和结构。6. 主提升循环阶段lifter/core/LiftDriver.hpp包含的核心提升循环负责将指令逐条提升为LLVM IR。这是整个系统的核心引擎。7. 定点优化阶段lifter/core/MergenPB.hpp中的run_opts函数执行定点优化循环包括GEPLoadPass、ReplaceTruncWithLoadPass、PromotePseudoStackPass和PromotePseudoMemory等关键优化通道。内存子系统符号与具体访问的平衡Mergen的内存子系统设计精巧平衡了符号执行的需求和具体内存访问的效率FileReader基类采用CRTP模式提供x86和x86_64的具体实现。关键方法包括RvaToFileOffset将RVA转换为文件偏移readMemory从内存地址读取数据address_to_mapped_address获取映射地址MemoryPolicy策略根据区域类型动态调整默认区域SYMBOLIC符号访问PE节区CONCRETE具体访问栈区域CONCRETE具体访问pageMap系统使用std::mapuint64_t, uint64_t实现分页内存区域的区间映射通过markMemPaged和isMemPaged方法管理内存页。控制流恢复智能跳转解析Mergen在控制流恢复方面表现出色能够处理多种复杂的跳转模式直接跳转与间接跳转lift_jmp函数根据指令操作数类型区分直接跳转Immediate8/16/32/64和间接跳转。直接跳转通过符号扩展立即数并与RIP相加得到绝对目标地址。返回指令处理lift_ret函数智能区分真实返回和ROP/继续返回当RSP折叠到常量STACKP_VALUE时视为最外层返回否则视为ROP/继续返回弹出返回目标并尝试解析IAT链返回处理针对Themida等保护器的特殊处理能够识别VM阶段的push target; ret模式将两个栈槽弹出合并为一次结构化调用。优化通道从伪内存到真实栈Mergen的优化通道设计巧妙逐步将伪内存访问转换为高效的LLVM操作GEPLoadPass折叠从PE镜像的常量加载当GEP的指针操作数为内存基址且地址可映射时将加载操作转换为常量整数。ReplaceTruncWithLoadPass将宽加载后截断的模式重写为窄加载利用小端序特性优化内存访问。PromotePseudoStackPass将栈地址范围内的伪内存GEP转换为真实的栈alloca操作显著提升性能。PromotePseudoMemory将剩余的伪内存GEP转换为原始的指针操作完成内存访问的最终优化。这些通道必须按顺序执行GEPLoadPass必须在PromotePseudoMemory之前运行否则具体的PE加载会被转换为inttoptr而丢失。支持的指令集与架构特性Mergen目前支持广泛的x86-64指令集整数运算支持119个处理器涵盖通用整数操作、BMI1/BMI2扩展、位操作、字符串操作、条件移动和标志操作。SSE2整数指令支持MOVDQA、MOVQ、PUNPCKLQDQ、PAND、POR、PXOR等XMM操作。控制流支持线性流、双向分支、直接跳转、调用/返回以及测试过的多目标跳转表形状。调用边界模型支持x64 MSVC和x86 cdecl/stdcall/fastcall的跨ABI框架默认使用strict模式。实际应用案例VMProtect去虚拟化让我们通过一个实际案例了解Mergen的强大功能。考虑一个简单的数学函数struct test { int a; int b; int c; }; int maths(test a, int b, int c) { return a.a b - c; }经过VMProtect虚拟化保护后原始代码变得难以理解。Mergen能够自动分析虚拟化代码生成清晰的LLVM IRdefine i64 main(i64 %rax, i64 %rcx, i64 %rdx, i64 %rbx, i64 %0, i64 %rbp, i64 %rsi, i64 %rdi, i64 %r8, i64 %r9, i64 %r10, i64 %r11, i64 %r12, i64 %r13, i64 %r14, i64 %r15, ptr nocapture readonly %memory) { entry: %stackmemory alloca i128, i128 13758960, align 8 %1 trunc i64 %r8 to i32 %2 trunc i64 %rdx to i32 %GEPLoadxd-5369456437- getelementptr i8, ptr %memory, i64 %rcx %3 load i32, ptr %GEPLoadxd-5369456437-, align 4 %adc-temp-5370242400- sub i32 %2, %1 %realnot-5369532059- add i32 %adc-temp-5370242400-, %3 %stackmemory10243.sroa.55.1375304.insert.ext10255 zext i32 %realnot-5369532059- to i64 ret i64 %stackmemory10243.sroa.55.1375304.insert.ext10255 }生成的IR经过编译后可以在反编译器中清晰查看大大简化了逆向分析过程。技术挑战与解决方案Mergen在开发过程中面临多个技术挑战循环处理通过路径求解上下文进行循环头泛化支持ConditionalBranch和DirectJump对于IndirectJump仅当目标已具体解析时才进行泛化。自修改代码目前尚未支持这是未来的研发方向之一。跳转表恢复支持绝对qword、RIP相对dword偏移、基址移位和共享目标等多种跳转表形状但仍基于具体目标地址分发。调用约定处理Mergen不严格遵循标准调用约定而是根据实际需要调整函数签名这需要用户了解x64调用约定和ABI规范。测试与质量保证Mergen拥有完善的测试体系确保可靠性处理器覆盖率119个处理器中115个有完整的测试套件覆盖4个有意跳过cpuid、rdtsc、ret、scasx。回归测试包含33个语义样本和177个运行时语义用例确保核心功能的稳定性。确定性输出通过黄金IR哈希验证确保输出的一致性防止回归。CI门控包含寄存器/标志正确性、重写基线、语义回归和Windows构建等多个测试通道。快速开始指南要开始使用Mergen你需要克隆仓库git clone https://gitcode.com/gh_mirrors/me/Mergen构建项目参考docs/BUILDING.md中的详细构建说明运行测试python test.py quick进行快速测试尝试示例使用提供的测试用例体验Mergen的强大功能对于重写工作确保基线回归门保持绿色。门控构建聚焦的PE样本运行lifter并验证提升的IR输出。详细工作流程请参考docs/REWRITE_BASELINE.md文档。未来发展方向Mergen团队正致力于以下方向的改进近期重点扩展控制流恢复能力改进循环、跳转表和间接分支的IR质量优化VM风格调度器形状的处理。长期目标在控制流路径稳定后扩展128位寄存器/指令支持超越当前的SSE2整数XMM子集。质量提升持续改进处理器覆盖率增加对更多保护器的支持优化输出IR的可读性和优化潜力。Mergen作为专业的LLVM IR提升引擎为逆向工程社区提供了强大的工具支持。无论是分析商业软件的虚拟化保护还是研究复杂的代码混淆技术Mergen都能帮助你揭开二进制代码的神秘面纱。通过深入了解Mergen的架构设计你可以更好地利用这个工具解决实际的逆向工程挑战提高分析效率加速安全研究进程。【免费下载链接】MergenDeobfuscation via optimization with usage of LLVM IR and parsing assembly.项目地址: https://gitcode.com/gh_mirrors/me/Mergen创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考