diabloidyobane/SpfDrv
GitHub: diabloidyobane/SpfDrv
对一款商业 HWID spoofer 的完整静态逆向分析,涵盖 IOCTL 协议还原、嵌入式内核驱动提取及 spoof 目标映射。
Stars: 0 | Forks: 0
对一个 37 MB 商业 HWID spoofer 的静态分析。该二进制文件采用了逐字符串 XOR 加密(捕获了 684 个解密补丁)、414 个 INT 2D 反调试陷阱、完全加密的 `.data` 段,以及一个嵌入式签名内核驱动(iqvw64e.sys,Intel NAL)用于访问物理内存。本仓库记录了 IOCTL 协议、驱动加载序列、spoof 目标识别,以及使用 pe-sieve reflection dump 和 Python 静态分析进行的嵌入式驱动提取。全程未附加调试器,未进行 DLL injection,也未使用内核回调。
## 概述
- 对 37 MB 受保护二进制文件(PID 5844,扫描了 140 个模块,54 个被修改,27 个 shellcode 区域)的 **pe-sieve reflection dump**
- **684 个解密的 XOR 字符串补丁**已映射到功能类别(驱动程序路径、registry key、权限名称、API 字符串)
- 对 iqvw64e.sys 命令多路复用接口的 **IOCTL 协议逆向**(单一 IOCTL `0x80862007`,5 个调用点中的 4 个命令代码)
- 在 RVA 0x47490 处解码的**驱动加载序列**:临时暂存、通过 registry 执行 NtLoadDriver、spoof 后的清理链
- 从文件偏移量 0x021B9FA0 提取的**嵌入式驱动**(26,624 字节,经 SHA256 校验与已知的 iqvw64e.sys 一致)
- 根据解密的字符串和 DeviceIoControl wrapper 分析得出的 **spoof 目标映射**:SMBIOS、磁盘、MAC、卷、registry
## 文件
| 路径 | 描述 |
|---|---|
| `dump/iqvw64e_extracted.sys` | 从文件偏移量 0x021B9FA0 提取的 iqvw64e.sys(26,624 字节,头部被 packer 剥离) |
| `dump/scan_report.json` | pe-sieve 扫描报告:140 个模块,54 个被修改,6 个植入的 PE,27 个 shellcode 区域 |
| `dump/module_map.csv` | 通过 import 交叉引用分析得出的 RVA 到函数的映射 |
| `dump/ioctl_calls.csv` | 包含命令代码和缓冲区布局的所有 5 个 DeviceIoControl 调用点 |
| `dump/decrypted_strings.txt` | 按函数分组的 684 个 XOR 解密字符串补丁 |
| `scripts/extract_embedded_driver.py` | 在已知偏移量处从 packed 二进制文件中切出 iqvw64e.sys blob |
| `scripts/map_ioctl_protocol.py` | 交叉引用 DeviceIoControl 导入并提取命令多路复用器结构 |
| `scripts/decrypt_xor_strings.py` | 遍历 .text 段 XOR 模式并恢复明文字符串 |
| `scripts/map_spoof_targets.py` | 从解密的 registry key、API 名称和物理内存写入模式中识别 spoof 目标 |
| `WALKTHROUGH.md` | 从 pe-sieve 基线到驱动程序提取再到 spoof 目标映射的叙述性分析 |
## 架构
来自 pe-sieve reflection dump 的二进制文件概况:
| 字段 | 值 |
|---|---|
| 大小 | 37,258,832 字节 |
| 架构 | x86-64, MSVC |
| Entry RVA | 0x2175EEC |
| .text | 35 MB,熵值 7.79 |
| .data | 1.1 MB,熵值 7.99(完全加密) |
| 段 | 7(.text .rdata .data .pdata .rsrc .reloc + 未命名) |
| 字符串保护 | .text 中的逐字符串 XOR,684 个补丁 |
| 反调试 | 414x INT 2D、IsDebuggerPresent、NtQueryInformationProcess、DbgBreakPoint、HeapWalk、FindWindowA |
## 嵌入式驱动
| 字段 | 值 |
|---|---|
| 身份 | iqvw64e.sys v1.03.0.7, Intel Corporation (2013) |
| 文件偏移量 | 0x021B9FA0 |
| 大小 | 26,624 字节 |
| 设备 | `\Device\Nal` / `\DosDevices\Nal` |
| SHA256 | `bbe08f20fd4f7891ff2ea9257f319c35df1e3dfa74feab888a8823b832875d1f` |
| Authenticode | 已剥离(嵌入的 blob 没有签名) |
关键导入:MmMapIoSpace、MmGetPhysicalAddress、MmMapLockedPagesSpecifyCache、MmAllocateContiguousMemory、IoCreateDevice、MmUnmapIoSpace、MmBuildMdlForNonPagedPool。
## IOCTL 协议
单一 IOCTL `0x80862007`(`CTL_CODE(0x8086, 0x801, METHOD_NEITHER, FILE_ANY_ACCESS)`)。输入缓冲区的第一个 QWORD 用于选择命令:
| 调用 RVA | 命令 | 操作 |
|---|---|---|
| 0x0419DA | 0x33 | MapIoSpace:将物理内存区域映射到内核 VA |
| 0x04239E | 0x33 | MapIoSpace:第二次映射调用 |
| 0x042469 | 0x25 | UnmapIoSpace:释放映射区域 |
| 0x0424D1 | 0x19 | GetPhysicalAddress:VA 到 PA 的转换 |
| 0x042546 | 0x1A | MemCopy:内核空间 memcpy |
模式:`GetPhysAddr(target)` -> `MapIoSpace(PA)` -> 读/写 -> `UnmapIoSpace`。这是 kdmapper 和类似加载器使用的标准 iqvw64e.sys 物理内存读写原语。
## 驱动加载序列
位于 RVA 0x47490 处的函数(约 2.5 KB,栈帧 0x230):
1. `GetTempPathW` 寻找可写入的位置
2. 将嵌入的 iqvw64e.sys blob 写入临时文件
3. 创建 registry key:`\Registry\Machine\System\CurrentControlSet\Services\
`
4. 设置 `ImagePath`、`Type` (1)、`ErrorControl`、`Start` 值
5. 通过 `GetProcAddress` 从 ntdll.dll 解析 `NtLoadDriver` + `NtUnloadDriver`
6. 使用 UNICODE_STRING registry 路径调用 `NtLoadDriver`
7. 通过 `CreateFileW(\\.\Nal)` 打开设备
8. spoof 完成后:`NtUnloadDriver`、`DeleteFileW`、`RegDeleteTreeW`
位于 RVA 0x47750-0x47A80 的加载后验证将 30 多个加密的 64 位常量加载到栈槽中,这可能是用于驱动完整性校验的哈希比对表。
## spoof 目标
从解密的字符串和 DeviceIoControl wrapper 交叉引用中识别得出:
| 目标 | 证据 |
|---|---|
| SMBIOS/固件 | `SystemFirmwareTable`、`BIOS`、`BaseBoardManufacturer` 字符串;通过 MapIoSpace 进行物理内存写入 |
| 磁盘序列号 | `GetVolumeInformationA` 导入、`PhysicalDrive` 设备路径 |
| 网络 MAC | 解密字符串池中的网络适配器引用 |
| 卷序列号 | `GetVolumeInformationA`(返回卷序列号) |
| Registry HWID | 4x `RegSetValueExW` (REG_BINARY, REG_SZ x2, REG_DWORD) |
物理内存原语在物理内存级别修改 SMBIOS 表和 NIC MAC 地址,绕过了操作系统级别的硬件标识符缓存。
## 模块映射
通过 pe-sieve dump + 导入交叉引用重构:
| RVA 范围 | 模块 |
|---|---|
| 0x038000-0x03A000 | VirtualProtect wrapper |
| 0x041000-0x043000 | 驱动程序通信(CreateFileW + 5x DeviceIoControl) |
| 0x045000-0x046000 | GetTempPathW 驱动程序暂存 |
| 0x047000-0x049000 | NtLoadDriver / NtUnloadDriver 生命周期 |
| 0x05E000-0x060000 | OpenProcess x6 进程枚举 |
| 0x05F000-0x060000 | OpenSCManager + QueryServiceStatusEx 服务状态 |
| 0x063000-0x064000 | 提权(AdjustTokenPrivileges) |
| 0x06F000-0x074000 | 动态 API 解析(NtQuery*, DbgBreakPoint) |
| 0x20F000-0x210000 | Registry 写入(REG_BINARY, REG_SZ x2) |
| 0x212000-0x213000 | Registry + OpenProcess + CreateProcessW 编排 |
| 0x218000-0x21A000 | 文件 I/O + DeleteFileW 清理 |
| 0x021B9FA0 | 嵌入式 iqvw64e.sys blob(26,624 字节) |
## 相关工具
- [hasherezade/pe-sieve](https://github.com/hasherezade/pe-sieve) -- 用于 reflection dump 的内存扫描器
- [diabloidyobane/PEReconstruct](https://github.com/diabloidyobane/PEReconstruct) -- 与目标无关的 DLL 重构工具包
## 免责声明
仅供教育和研究目的使用。本分析记录了一款商业 HWID spoofer 的内部架构,旨在增进对内核驱动加载、IOCTL 协议设计以及物理内存操纵技术的理解。原始二进制文件不会被重新分发;仅包含分析后的输出结果。标签:0day挖掘, PE解析, Windows驱动, 云安全监控, 内核安全, 反作弊对抗, 逆向分析, 逆向工具, 静态分析