diabloidyobane/SpfDrv

GitHub: diabloidyobane/SpfDrv

对一款商业 HWID spoofer 的完整静态逆向分析,涵盖 IOCTL 协议还原、嵌入式内核驱动提取及 spoof 目标映射。

Stars: 0 | Forks: 0

SpfDrv

对一个 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驱动, 云安全监控, 内核安全, 反作弊对抗, 逆向分析, 逆向工具, 静态分析