目录
[第一层:XX文件分析 ------ AI 如何描述 exe/dll/sys 的分析](#第一层:XX文件分析 —— AI 如何描述 exe/dll/sys 的分析)
[1.1 为什么从文件目录开始](#1.1 为什么从文件目录开始)
[1.2 步骤详解](#1.2 步骤详解)
[1.3 三类文件的分析描述差异(重点)](#1.3 三类文件的分析描述差异(重点))
[exe ------ 问"通讯与权限"](#exe —— 问"通讯与权限")
[dll ------ 问"谁加载它、导出什么"](#dll —— 问"谁加载它、导出什么")
[sys ------ 问"四个入口"(内核攻击面四要素)](#sys —— 问"四个入口"(内核攻击面四要素))
[1.5 XX实战案例还原(截图4/5 + 截图2/3 结论)](#1.5 XX实战案例还原(截图4/5 + 截图2/3 结论))
[第二层:静态逆向 -- IDA 无头批处理 + AI Agent 自动化](#第二层:静态逆向 -- IDA 无头批处理 + AI Agent 自动化)
[2.1 为什么"IDA 不需要 MCP"](#2.1 为什么"IDA 不需要 MCP")
[2.2 必须告诉 Agent 什么](#2.2 必须告诉 Agent 什么)
[2.3 提示词模板](#2.3 提示词模板)
[2.6 XX实战案例:sysdiag.sys 结构层结论](#2.6 XX实战案例:sysdiag.sys 结构层结论)
[第三层:动态调试 ------ WinDbg 命令行驱动](#第三层:动态调试 —— WinDbg 命令行驱动)

XX文件分析步骤
一条流水线:

第1层 文件层 右键VSCode打开目标目录 → 枚举exe/dll/sys → 情报搜索
产出:功能点清单 + 攻击面排序
▼
第2层 结构层 告诉Agent IDA路径 → 无头批量分析 → 驱动入口/设备/分发器
产出:模块表、分发路由图、设备对象清单
▼
第3层 功能层 按IOCTL通讯码逐个分发器深度反编译 → 恢复功能语义
产出:每个IOCTL码的功能说明书(≈源码)
▼
第4层 数据流层 交叉引用追踪:信任字段写入者/魔数校验者/缓冲区生命周期
产出:信任边界图 + 校验覆盖度审计
▼
第5层 漏洞层 校验缺失/TOCTOU/MDL竞争/认证弱点 → 漏洞假设
产出:漏洞假设清单(证据链+触发路径)
▼
第6层 验证层 WinDbg动态断点验证 → 确认或推翻假设
产出:确认的漏洞/逻辑缺陷
▼
第7层 应用层 检测逻辑地图 → 免杀规则分析 / 漏洞报告 / 利用评估
这条流水线的四个核心原则:
-
分层递进:每一层的产出是下一层的输入。
-
文件层找目标,结构层找入口,功能层找语义,数据流层找边界,漏洞层找缺陷。
-
永远不做"跳层分析"(一上来就逐函数硬啃)。
-
-
中间产物全部落盘:IDA 数据库(.i64)、每轮分析报告(.md/.txt)、脚本全部留在固定目录。
-
Agent 每轮只读上一轮产出,上下文可以跨轮次、跨会话复用------
-
这就是为什么"9 轮无头分析"可行:不是 9 个孤立提问,而是 9 个接力赛。
-
-
以通讯码为索引:
- IOCTL 码是功能的目录。拿到目录,就能按条目逐项深挖,不漏不重。
-
每个结论必须可验证:
- 静态结论(代码路径)→ 动态验证(断点观测)→ 才进入下一步。防 AI 幻觉。
工作流翻译成一句话:
先用 AI 摸清"目标是谁、有哪些文件、每个文件干什么",再用 AI 驱动 IDA/WinDbg 把驱动还原到源码级,然后以 IOCTL 通讯码为目录逐项审计功能逻辑,找出校验缺陷与逻辑漏洞,最后把逆向成果映射回"哪个模块检查什么行为",形成检测规则与绕过思路的分析。
第一层:XX文件分析 ------ AI 如何描述 exe/dll/sys 的分析
1.1 为什么从文件目录开始
安全产品的完整攻击面 = 用户态组件(exe/dll)× 内核组件(sys)× 通讯接口(设备/管道/回调)。
- 文件目录是攻击面枚举的最快入口:看到文件清单,就能推断产品架构;看到驱动清单,就能锁定内核攻击面。
- XX的安装目录 Sysdiag\就是一个标准样本:bin\(驱动与核心二进制)、LICENSE.*、uninst.exe、VERSION。
1.2 步骤详解
Step 1 ------ 收集与枚举
-
右键目标目录 → "打开文件夹" 进入 VSCode(让 Agent 获得整个目录的读写视角);
-
或者直接把绝对路径喂给 Agent,例如截图里的 ls -la 'f:/An/Huorong/Sysdiag/';
-
让 Agent 递归枚举:所有 .sys 的路径、所有 .exe/.dll 的路径、文件大小与时间戳(时间戳能反推哪个组件随哪个版本更新,指向活跃的攻击面)。
Step 2 ------ 逐文件识别功能("分析或上网搜索当前所有文件中的 sys 驱动的功能")
对每个文件,Agent 做三件事:静态识别 + 情报搜索 + 交叉验证:
-
静态识别:读 PE 头、版本资源(CompanyName/ProductName/FileDescription------XX的文件版本资源里写得很清楚)、导入表(驱动导入了哪些 ntoskrnl API,能直接猜出功能类别);
-
情报搜索:网上搜索文件名(看雪论坛、GitHub、CVE 库、MSDN)。XX这种国民级产品,公开讨论极多,很多驱动名、设备名、已知问题都能搜到;
-
交叉验证:把静态结论与情报结论对照,标注"已确认/待验证"。
Step 3 ------ 攻击面排序
排序规则(从上到下优先级递减):
|-----|----------------------------------|--------------------------|
| 优先级 | 文件类型 | 理由 |
| P0 | .sys 驱动 | 内核权限、IOCTL 攻击面、自我保护机制的核心 |
| P1 | 核心服务 exe(HipsDaemon/TrafficProt) | 与内核的通讯通道、策略下发方、事件消费方 |
| P2 | 界面 exe(HipsMain/HipsTray) | 特权操作入口(往往有 IPC 到服务进程) |
| P3 | 功能 dll | 依赖注入点、导出函数攻击面 |
Step 4 ------ 产出功能点清单
对每个 P0/P1 文件输出一行结论:文件名 → 角色 → 通讯接口(设备名/管道名/回调) → 分析优先级 → 依据(版本资源/导入表/网上资料)。
1.3 三类文件的分析描述差异(重点)
- exe / dll / sys 三类文件,问 AI 的角度完全不同,这是很多人描述不好导致分析浅的根因:
exe ------ 问"通讯与权限"
1. 服务注册:sc query / 注册表 HKLM\SYSTEM\CurrentControlSet\Services 下注册了哪些服务?
启动类型?以什么账户运行(LocalSystem=高价值目标)?
2. 通讯接口:它打开什么设备(\Device\xxx)、命名管道、socket?------ 这决定它与哪个驱动/组件对话
3. 角色推断:名称 + 版本资源 + 行为推断(HipsDaemon=守护+策略,TrafficProt=流量监控)
4. 高价值问题:它下发的策略/配置是什么格式?------ 它是内核的"指挥官",逆向它能得到内核接口的语义字典
dll ------ 问"谁加载它、导出什么"
1. 导出函数清单 + 参数形态(IDA 静态,或 dumpbin /exports)
2. 加载者:谁 LoadLibrary 它(交叉引用);是否被注入(dll 劫持/白加黑面)
3. 角色:界面插件?通信封装(供 exe 调用驱动)?扫描引擎?
4. 高价值问题:它封装了哪些 IOCTL 调用?------ dll 经常是用户态调用驱动接口的薄封装,
逆向 dll 能直接拿到 IOCTL 码 + 输入输出结构体的语义(比从内核侧猜快得多)
sys ------ 问"四个入口"(内核攻击面四要素)
1. 入口点 DriverEntry:创建了什么设备(IoCreateDevice)、符号链接(IoCreateSymbolicLink)、
注册了什么分发器(MajorFunction)、注册了什么回调(Ob/Ps/Cm/Filter/WFP)
2. 分发器:DEVICE_CONTROL 是主攻面 ------ IOCTL 码全集
3. 回调:进程/线程/镜像回调、对象回调(自我保护)、minifilter、WFP ------ 检测逻辑的钩子点
4. 设备可达性:设备 ACL、符号链接 ------ 谁能打开设备(攻击面暴露度)
1.4 提示词模板
分析目录 F:\...\Huorong\Sysdiag\ 下的所有文件:
1. 递归列出所有文件(含 bin 子目录),标注每个 .sys/.exe/.dll 的:
- 版本资源信息(公司名/产品名/文件描述/版本号)
- 文件大小、时间戳
2. 对每个 .sys:分析导入表,列出它导入的 ntoskrnl 关键 API(Zw*/Io*/Ob*/Ps*/Cm*/Flt*/Mm* 类),
按 API 类别推断驱动功能(文件过滤?进程监控?网络过滤?自我保护?)
3. 上网搜索每个驱动/核心 exe 的公开资料(看雪、GitHub、CVE),与静态推断交叉验证
4. 输出:功能点清单表(文件 → 角色 → 通讯接口 → 优先级 → 依据),
并按攻击面价值排序(驱动 > 服务exe > 界面exe > dll)
文件 F:\...\bin\sysdiag.sys 的角色已确认为XX主驱动/HIPS。现在分析:
1. 它的服务注册信息(服务名、启动类型、组、依赖)------ 用 sc qc 或注册表
2. 它的设备名和符号链接名(网上搜索 + 后续IDA确认)------ 用户态组件如何打开它
3. 它与其他XX组件(HipsDaemon.exe、TrafficProt.exe、其他.sys)的关系图
4. 已知漏洞/公开逆向资料汇总(标注来源链接)
1.5 XX实战案例还原(截图4/5 + 截图2/3 结论)
-
目标目录:F:\...\Huorong\Sysdiag\(含 bin\);
-
第 1 层结论:核心攻击面 = sysdiag.sys(主驱动/HIPS 内核,557KB,x64),用户态指挥官 = HipsDaemon(策略下发+事件消费)、TrafficProt(网络流量监控,依赖 NSI 过滤设备);
-
分析优先级:sysdiag.sys(P0)→ 其内部的 nxeng 网络引擎、ActMon 行为监控、NSI 过滤、DTrampoline 注入通道(这是第 2/3 层才能展开的)。
第二层:静态逆向 -- IDA 无头批处理 + AI Agent 自动化
2.1 为什么"IDA 不需要 MCP"
IDA 本身就支持命令执行,所以不需要 MCP。
IDA 的自动化接口 = 命令行参数 + IDAPython + 文件落盘
Agent 与 IDA 的完整交互协议(这就是"自动吊起 IDA"的底层机制):
-
Agent 写一个 IDAPython 脚本到磁盘(例如 round3_dispatch.py);
-
Agent 用命令行吊起 IDA:
F:\App\IDA\ida64.exe -A -S"F:\work\round3_dispatch.py" -L"F:\work\round3.log" "F:...\sysdiag.sys"
-
脚本执行 :等待自动分析完成(ida_auto.auto_wait()),做反编译/枚举/交叉引用,把结果写进文本文件(round3_report.txt);
-
IDA 退出 ,Agent 读报告文件,基于结果写下一轮脚本。
关键参数详解(这就是截图里"具体的执行命令"的含义):
|---------------|--------------------------|--------------------------------------------|
| 参数 | 含义 | 说明 |
| -A | 自动模式 | 不弹任何对话框(没有 GUI 交互),自动分析完就绪 |
| -S"script.py" | 自动分析完成后运行指定 IDAPython 脚本 | 脚本内 auto_wait() 保证等分析完成 |
| -L"log.txt" | 日志落盘 | Agent 靠它判断分析是否异常 |
| .i64 数据库 | 自动保存 | 下次再分析同一文件时自动复用,不用重跑分析 ------ 这是多轮分析的根基 |
MCP 方案(IDA/Ghidra MCP server)也能做,但你的"文件落盘协议"有三个优势:
-
长任务可靠:MCP 连接中断会丢状态;文件落盘每一步都有产物,断了从产物续;
-
数据库复用:9 轮分析共享同一个 .i64,Agent 的命名/注释/结构体恢复会累积;
-
无授权限制:headless 模式只需要本地 Hex-Rays 许可,不依赖任何第三方插件。
2.2 必须告诉 Agent 什么
IDA 安装路径:F:\App\IDA\(ida64.exe / idat64.exe 的目录)
目标文件:F:\...\sysdiag.sys(绝对路径)
工作目录:F:\work\huorong_analysis\(所有脚本、报告、数据库放这里)
输出约定:每轮脚本 → 每轮报告文件(UTF-8 txt/md),报告开头标注轮次与目标
约束:全程无头(-A),禁止需要 GUI 的操作
2.3 提示词模板
使用 IDA 无头模式分析驱动 F:\...\sysdiag.sys:
- IDA 路径:F:\App\IDA\ida64.exe(-A -S 方式)
- 工作目录:F:\work\huorong_analysis\(脚本与报告都放这里,数据库会自动生成)
第1轮脚本要求:
1. 列出所有函数数量、段信息、导入的 ntoskrnl 函数(分类:Io/Ob/Ps/Cm/Flt/Mm/Ke)
2. 反编译 DriverEntry:定位所有 IoCreateDevice / IoCreateSymbolicLink / IoCreateDeviceSecure 调用,
提取设备名、符号链接名、DeviceType、设备扩展大小
3. 提取 MajorFunction 数组的每个槽位(分发器函数地址),标注哪个是 DEVICE_CONTROL
4. 全部输出到 round1_report.txt
基于已生成的 .i64 数据库(函数命名已累积),继续第5轮:
目标函数 sub_140E890(核心模块二次路由分发器)。
1. 完整反编译该函数及其调用的全部子函数(递归2层)
2. 输出每个分支的:IOCTL码 → 调用的子函数 → 功能推断(结合输入输出缓冲区的使用方式)
3. 对每个子函数标注:缓冲区来源(SystemBuffer/MDL/Type3InputBuffer)、
长度校验点、锁使用(ExAcquireResource*/Ndis锁)、内存操作(IoAllocateMdl/MmProbeAndLockPages)
4. 结果追加到 round5_report.txt,格式:每个 IOCTL 码一节
追踪"进程信任字段"的数据流:
1. 已知进程记录结构:偏移 +1354 存 PID,偏移 +2712 是信任标志(CREATE 校验用)
2. 找出所有写 +2712 的代码位置(交叉引用)------列出写入者函数、写入条件
3. 找出所有读 +2712 的代码位置------哪些分发器/子接口在读、读后做什么决策
4. 结论:是否存在"非受信路径写入信任标志"的可能性?输出证据链
2.6 XX实战案例:sysdiag.sys 结构层结论
总体架构:统一分发器 + 模块表(5 个模块)
DriverEntry (sub_140?A60):
1. 校验启动参数(?w?),失败返回 0
2. 用 MmGetSystemRoutineAddress 动态解析函数(部分符号无法静态解析的原因)
3. 遍历模块表,调用各模块初始化(支持卸载)
4. 创建设备:IoCreateDevice,DeviceType=0x22(FILE_DEVICE_UNKNOWN),
DACL 开放(所有人可访问)→ 说明安全不靠设备 ACL,而靠 IOCTL 层进程信任校验
模块表(5 项):
模块0: 主接口模块(核心设备,二次路由入口 sub_140E890)
模块1: nxeng 网络引擎(优先打开已有设备,不存在才自建)
模块2: 功能码查询接口 (sub_14??, 1975字节)
模块3: 功能码查询接口 (sub_1404220, 1713字节)
模块4: NSI 过滤设备(附加到 NSI 设备,拦截查询类请求)
核心模块二次路由 sub_140E890 ------ 按 DeviceObject 再分发到三个子接口:
1. HR::ActMon ------ 行为监控(4.5KB,多个 IOCTL)
2. HR::DTrampoline ------ 注入通道(Trampoline 跳板)
3. HR::Base ------ 基础接口(启动会话、进程信任)
第三层:动态调试 ------ WinDbg 命令行驱动
- 后续分析
第四层:功能源码级分析与深度漏洞挖掘
- 后续分析