ItsMehRAWRXD/RawrXDA

GitHub: ItsMehRAWRXD/RawrXDA

这是一个用纯x64 MASM汇编编写的PE32+写入器,能够从头生成可运行的Windows可执行文件,解决零依赖下的PE文件构建需求。

Stars: 2 | Forks: 0

# RawrXD PE 写入器 - 完整实现 ## 概述 这是一个用纯 x64 MASM 汇编编写的完整 PE32+ 写入器和机器码生成器,零依赖且不使用 CRT。它能够从头生成可运行的 Windows 可执行文件。 ## 架构 该 PE 写入器遵循后端设计者的方法,提供了一个干净的 API,用于: - 创建 PE 可执行文件上下文 - 添加带有正确 IAT/INT 结构的导入 - 发射带有段管理的机器码 - 写入包含所有必需头部的完整 PE 文件 ## 核心组件 ### 1. 定义的结构体 - **IMAGE_DOS_HEADER**:标准 DOS 头部,包含 e_lfanew 指针 - **IMAGE_NT_HEADERS64**:NT 头部,包含文件头和可选头 - **IMAGE_SECTION_HEADER**:用于 .text、.rdata、.idata 的段头部 - **IMAGE_IMPORT_DESCRIPTOR**:导入表描述符 - **PE_CONTEXT**:用于构建 PE 文件的内部上下文结构 ### 2. 关键函数 #### PEWriter_创建可执行文件 - **输入**:RCX = 映像基址 (0 = 默认值),RDX = 入口点 RVA - **输出**:RAX = PE 上下文句柄 (0 = 失败) - **目的**:分配并初始化完整的 PE 上下文结构 **实现细节**: - 为 DOS 头部、NT 头部、段头部分配内存 - 使用正确的签名和 e_lfanew 初始化 DOS 头部 - 使用 AMD64 机器类型和 PE32+ 魔数设置 NT 头部 - 使用映像基址、段/文件对齐配置可选头 - 分配代码缓冲区和导入表 - 设置默认虚拟地址和文件偏移量 #### PEWriter_添加导入 - **输入**:RCX = PE 上下文,RDX = DLL 名称,R8 = 函数名称 - **输出**:RAX = 1 成功,0 失败 - **目的**:构建带有正确 IAT/INT 结构的导入表 **实现细节**: - 管理多个 DLL 的导入描述符 - 创建导入查找表 (INT) 条目 - 设置导入地址表 (IAT) 条目 - 处理按名称导入的结构 - 跟踪导入计数并验证限制 #### PEWriter_添加代码 - **输入**:RCX = PE 上下文,RDX = 代码缓冲区,R8 = 代码大小 - **输出**:RAX = 代码的 RVA (0 = 失败) - **目的**:处理机器码发射,带有正确的段管理 **实现细节**: - 将机器码复制到内部缓冲区 - 验证代码大小是否超过最大限制 - 计算并返回代码的 RVA - 更新内部代码大小跟踪 - 管理 .text 段内容 #### PEWriter_写入文件 - **输入**:RCX = PE 上下文,RDX = 文件名 - **输出**:RAX = 1 成功,0 失败 - **目的**:完整文件写入,包括所有头部、段和导入表 **实现细节**: - 使用正确的 Win32 API 调用创建输出文件 - 写入 DOS 头部和 DOS 存根 - 计算并更新最终的 NT 头部值 - 写入 .text、.rdata、.idata 的段头 - 实现正确的文件填充和对齐 - 写入带有导入表的段数据 - 处理所有 RVA 计算和文件偏移量 ## 内存管理 该实现使用 Windows 堆 API: - **GetProcessHeap()**:获取当前进程堆 - **HeapAlloc()**:分配零初始化内存 - **HeapFree()**:在清理时释放已分配的内存 所有内存分配都包含适当的错误处理和清理。 ## 文件结构布局 ``` DOS Header (64 bytes) DOS Stub (variable size, padded to 0x80) NT Headers (248 bytes for PE32+) Section Headers (40 bytes × 3 sections) Padding to file alignment (0x400) .text Section (code) - Machine code - Padded to file alignment .rdata Section (read-only data) - String constants, resources - Padded to file alignment .idata Section (import data) - Import descriptors - Import lookup table - Import address table - Import by name structures - Padded to file alignment ``` ## 虚拟地址布局 ``` 0x1000: .text section (SECTION_ALIGNMENT) 0x2000: .rdata section 0x3000: .idata section 0x4000: Next available virtual address ``` ## 常量和默认值 - **映像基址**:0x140000000 (x64 默认值) - **段对齐**:0x1000 (4KB) - **文件对齐**:0x200 (512 字节) - **入口点**:可配置的 RVA - **子系统**:控制台应用程序 (IMAGE_SUBSYSTEM_WINDOWS_CUI) ## 使用示例 ``` ; Create PE context mov rcx, 0 ; Default image base mov rdx, 1000h ; Entry point RVA call PEWriter_CreateExecutable mov rbx, rax ; Save context ; Add kernel32.dll imports mov rcx, rbx mov rdx, offset dll_kernel32 mov r8, offset func_GetStdHandle call PEWriter_AddImport ; Add machine code mov rcx, rbx mov rdx, offset code_buffer mov r8, code_size call PEWriter_AddCode ; Write executable file mov rcx, rbx mov rdx, offset filename call PEWriter_WriteFile ``` ## 构建说明 1. 确保安装了 MASM64 和 Windows SDK 2. 运行 `build.bat` 编译 PE 写入器和示例 3. 执行 `PE_Writer_Example.exe` 生成 `hello.exe` 4. 测试生成的可执行文件 ## 错误处理 所有函数在失败时返回 0,成功时返回非零值。该实现包括: - 内存分配失败检查 - 文件 I/O 错误处理 - 输入验证 - 正确的资源清理 - 缓冲区的边界检查 ## 限制 - 最多 99 个导入 (MAX_IMPORTS - 1) - 最大 64KB 代码大小 (MAX_CODE_SIZE) - 三个固定段 (.text、.rdata、.idata) - 仅控制台子系统 - 不支持重定位 - 无数字签名 ## 高级功能 该实现为以下功能提供了坚实的基础: - 自定义段创建 - 复杂的导入绑定 - 资源嵌入 - 数字签名 - 重定位支持 - 异常处理表 ## 技术说明 - 纯 x64 MASM 汇编 - 无 CRT 依赖 - 使用 Windows 堆进行内存管理 - 为 x64 生成 PE32+ 格式 - 兼容 Windows Vista 及更高版本 - 遵循 Microsoft PE 规范 - 除 kernel32.dll 外零外部库依赖 此实现提供了一个完整、可用于生产环境的 PE32+ 写入器,适用于代码生成后端、自定义编译器和可执行文件打包器。
标签:DAST, MASM汇编器, PE写入器, PE文件格式, Windows可执行文件, Windows系统编程, x64汇编语言, 二进制安全, 二进制文件工具, 云资产清单, 低级系统编程, 可执行文件生成, 安全工具开发, 安全报告生成, 导入表管理, 恶意软件分析, 无依赖软件开发, 机器代码发射, 汇编编程, 系统底层开发, 逆向工程