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汇编语言, 二进制安全, 二进制文件工具, 云资产清单, 低级系统编程, 可执行文件生成, 安全工具开发, 安全报告生成, 导入表管理, 恶意软件分析, 无依赖软件开发, 机器代码发射, 汇编编程, 系统底层开发, 逆向工程