pe_to_shellcode核心技术解析:深入理解PE头修改与加载器stub机制

张开发
2026/4/6 17:15:42 15 分钟阅读

分享文章

pe_to_shellcode核心技术解析:深入理解PE头修改与加载器stub机制
pe_to_shellcode核心技术解析深入理解PE头修改与加载器stub机制【免费下载链接】pe_to_shellcodeConverts PE into a shellcode项目地址: https://gitcode.com/gh_mirrors/pe/pe_to_shellcodepe_to_shellcode是一款强大的工具能够将PE文件转换为可直接执行的shellcode为开发者和安全研究人员提供了灵活的代码部署方案。本文将深入解析其核心技术原理包括PE头修改技术和加载器stub机制帮助读者全面理解这一工具的工作流程和实现细节。什么是PE转Shellcode技术PEPortable Executable文件是Windows系统下的可执行文件格式而shellcode是一段能够直接在内存中执行的机器码。pe_to_shellcode通过特定的转换技术将PE文件转换为可独立执行的shellcode实现了无需完整PE文件即可在内存中运行程序的能力。这项技术的核心价值在于实现内存中直接执行减少磁盘操作痕迹规避传统PE文件的加载检测机制提供灵活的代码注入和执行能力PE头修改技术详解PE头是PE文件的重要组成部分包含了文件的结构信息和执行参数。pe_to_shellcode通过修改PE头为后续的shellcode执行奠定基础。PE头结构调整在pe2shc/main.cpp中overwrite_hdr函数负责修改PE头以植入重定向代码bool overwrite_hdr(BYTE *my_exe, size_t exe_size, DWORD raw, bool is64b) { // 代码省略... memcpy(my_hdr-redir, redir_code, redir_size); my_hdr-load_status LDS_CLEAN; return true; }这段代码将重定向代码redir_code写入PE头的特定区域redir字段同时设置加载状态为干净LDS_CLEAN。重定向代码设计pe_to_shellcode为32位和64位架构设计了不同的重定向代码// 32位重定向代码 BYTE redir_code32[] \x4D //dec ebp \x5A //pop edx \x45 //inc ebp \x52 //push edx \xE8\x00\x00\x00\x00 //call next_line \x58 // pop eax \x83\xE8\x09 // sub eax,9 \x50 // push eax (Image Base) \x05 // add eax, \x59\x04\x00\x00 // value \xFF\xD0 // call eax \xc3; // ret // 64位重定向代码 BYTE redir_code64[] \x4D\x5A //pop r10 \x45\x52 //push r10 \xE8\x00\x00\x00\x00 //call next_line \x59 // pop rcx \x48\x83\xE9\x09 // sub rcx,9 (rcx - Image Base) \x48\x8B\xC1 // mov rax,rcx \x48\x05 // add eax, \x59\x04\x00\x00 // value \xFF\xD0 // call eax \xc3; // ret这些汇编代码通过修改寄存器值实现了代码执行流程的重定向是PE转shellcode的关键步骤之一。加载器Stub机制解析加载器stub是一段小型的引导代码负责在内存中加载和执行转换后的shellcode。pe_to_shellcode提供了多个版本的加载器实现。加载器结构定义在loader_v2/peloader.h中定义了最小化的PE头结构用于在转换后的shellcode中存储加载状态typedef struct _min_hdr { BYTE redir[MAX_REDIR_SIZE]; BYTE load_status; } min_hdr_t;其中redir数组存储重定向代码load_status记录加载状态如LDS_CLEAN、LDS_LOADED等。32位加载器实现loader_v1/hldr32/hldr32.asm提供了32位环境下的加载器汇编实现主要完成以下工作恢复kernel32基地址解析导出表获取API地址处理导入表加载所需DLL应用重定位调用程序入口点核心代码片段如下; 解析导出表 parse_exports: pop esi mov ebx, ebp mov eax, dword [ebp lfanew] add ebx, dword [ebp eax IMAGE_DIRECTORY_ENTRY_EXPORT] cdq ; 处理导入表 import_dll: mov ecx, dword [ebp _IMAGE_IMPORT_DESCRIPTOR.idName] jecxz import_popad add ecx, dword [ebx] push ecx call dword [ebx mapstk_size krncrcstk.kLoadLibraryA] ; 代码省略... ; 应用重定位 reloc_block: pushad mov ecx, dword [edi IMAGE_BASE_RELOCATION.reSizeOfBlock] sub ecx, IMAGE_BASE_RELOCATION_size cdq ; 代码省略...资源管理与Stub加载在pe2shc/resource.h中定义了stub资源的ID#define STUB32 101 #define STUB64 102这些ID对应不同架构的stub二进制文件stub32.bin和stub64.bin在转换过程中被加载并附加到PE文件中int res_id is64b ? STUB64 : STUB32; BYTE *stub peconv::load_resource_data(stub_size, res_id);PE转Shellcode完整流程pe_to_shellcode的转换过程主要在pe2shc/main.cpp的shellcodify函数中实现完整流程如下加载PE文件读取输入的PE文件到内存加载Stub根据目标架构32/64位加载相应的stub合并PE与Stub将PE文件与stub合并到新的缓冲区修改PE头植入重定向代码和加载状态信息保存输出将转换后的shellcode保存到输出文件核心代码实现BYTE* shellcodify(BYTE *my_exe, size_t exe_size, size_t out_size, bool is64b) { // 加载stub int res_id is64b ? STUB64 : STUB32; BYTE *stub peconv::load_resource_data(stub_size, res_id); // 分配缓冲区并合并PE和stub size_t ext_size exe_size stub_size; BYTE *ext_buf peconv::alloc_aligned(ext_size, PAGE_READWRITE); memcpy(ext_buf, my_exe, exe_size); memcpy(ext_buf exe_size, stub, stub_size); // 修改PE头 DWORD raw_addr exe_size; overwrite_hdr(ext_buf, ext_size, raw_addr, is64b); out_size ext_size; return ext_buf; }支持与限制pe_to_shellcode对输入PE文件有一定的要求和限制在is_supported_pe函数中定义必须包含重定位表确保代码可以在不同内存地址正确执行不支持.NET应用托管代码需要CLR环境无法直接转为shellcodeTLS回调处理支持包含TLS回调的PE文件但会给出提示bool is_supported_pe(BYTE *my_exe, size_t exe_size) { if (!peconv::has_relocations(my_exe)) { std::cerr [ERROR] The PE must have relocations! std::endl; return false; } // 检查.NET目录 IMAGE_DATA_DIRECTORY* dotnet_dir peconv::get_directory_entry(my_exe, IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR); if (dotnet_dir) { std::cerr [ERROR] .NET applications are not supported! std::endl; return false; } // 代码省略... }总结与应用场景pe_to_shellcode通过巧妙的PE头修改和加载器stub设计实现了PE文件到shellcode的高效转换。这项技术在以下场景中具有重要应用内存加载直接在内存中加载执行程序减少磁盘操作代码注入作为代码注入技术的基础组件规避检测绕过基于PE文件特征的检测机制软件保护实现更复杂的软件保护方案通过深入理解pe_to_shellcode的核心技术开发者可以更好地掌握内存中代码执行的原理为安全研究和软件开发提供有力支持。快速开始使用pe_to_shellcode要开始使用pe_to_shellcode工具首先克隆项目仓库git clone https://gitcode.com/gh_mirrors/pe/pe_to_shellcode项目提供了多个组件包括pe2shcPE转shellcode转换器、injector注入器和不同版本的loader可根据具体需求进行编译和使用。【免费下载链接】pe_to_shellcodeConverts PE into a shellcode项目地址: https://gitcode.com/gh_mirrors/pe/pe_to_shellcode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

更多文章