feat(workflow): non-PE multi-format cookbook U-AV (#65)

Add nonpe-format-cookbook for BAT/PS/VBA/JS/SYS/DLL/Android recipes.
Wire re-agent-workflow §3.4, malware/js/apk/kernel skills, verify asserts.
Dedup DLL Delay-Load with A-T R; detection-only for wiper/BYOVD/reflective.
This commit is contained in:
yhc
2026-08-12 21:09:04 +08:00
parent 0816b12435
commit 241fa77be0
7 changed files with 174 additions and 6 deletions
+5
View File
@@ -224,6 +224,10 @@ adb pull /data/local/tmp/file .
- 主 `package`
- `application`、`activity`、`service`、`receiver`
- `lib/` 目录里是否有 `.so`
4. Issue #65 威胁形态速查(授权样本/设备;详见 `../reverse-engineering/references/nonpe-format-cookbook.md` §7–8):
- 透明/隐藏图标(AU):`aapt dump badging` + manifest theme/label/icon → `E-android-hidden-icon-manifest`
- Magisk/脚本格机特征与远程 curl|sh(AR/AS)→ 特征与 URL 入证,**不执行**破坏命令
- 持久化路径(AT):`service.d` / `priv-app` 等 → `E-android-persistence`
### 2. Java 逻辑观察
@@ -408,3 +412,4 @@ frida -U -f com.example.app -l hook.js
- [ ] 我是否基于 `tool-index` 使用了真实工具路径?
- [ ] 我是否产出了可复现证据(命令/脚本/截图/报告)?
- [ ] 我是否完成并回写了 RULES 要求的 Checklist 项?
- [ ] 若命中隐藏图标/格机/持久化线索:是否按 U–AV cookbook 记录 E-android-* Evidence(授权范围内)?
+2
View File
@@ -132,6 +132,7 @@ description: 在使用 js-reverse-mcp 做前端 JavaScript 逆向时使用,适
- 如果当前任务只是出签名,这一阶段可以降级
- 如果要长期复用算法链路,这一阶段必须做
- Issue #65 混淆旁路(U–AV §4):JSVMP(AD)→ `E-js-vmp`;CFF+字符串数组(AE)→ `E-js-deobf`;DevTools/debugger 反调试(AF)→ `E-js-anti-debug`。完整触发表见 `../reverse-engineering/references/nonpe-format-cookbook.md`;AST 细节仍用 `references/ast-deobfuscation.md`
## 执行要求
@@ -153,6 +154,7 @@ description: 在使用 js-reverse-mcp 做前端 JavaScript 逆向时使用,适
- Node 复现:`references/node-env-rebuild.md`
- 插桩:`references/instrumentation.md`
- AST 去混淆:`references/ast-deobfuscation.md`
- 非 PE/JS 混淆菜谱 U–AV:`../reverse-engineering/references/nonpe-format-cookbook.md`(AD/AE/AF)
- 回退:`references/fallbacks.md`
- 输出契约:`references/output-contract.md`
+11 -1
View File
@@ -47,10 +47,11 @@ sha256sum sample.exe
```text
Triage MUST 清单(Issue #65):
□ 文件类型:EXE / DLL / SYS / .NET / 其他
□ 文件类型:EXE / DLL / SYS / .NET / 脚本(bat|ps1|vba) / 其他
□ 架构 x86/x64/ARM;查壳(DIE 等)与编译语言线索
□ DLL/SYS:导入表与导出表并列检查(见 Phase 2 硬门)
□ .NET:无传统 IAT → 走 dnSpy/IL/元数据等价锚点(见 Phase 2)
□ 脚本/宏/DLL 专项 P0:见 nonpe-format-cookbook U–AV(E-batch-deobf / E-ps-decode / E-vba-pcode / E-dll-*)
```
### Phase 1b: 脱壳与 IAT 处理(有壳时 · Issue #65)
@@ -136,6 +137,13 @@ Triage MUST 清单(Issue #65):
□ P1:进程名扫描 / VEH / int3·DR / 重叠节 / Overlay / .rsrc / Delay-Load
□ H/S 平坦化与不透明谓词 → ollvm-deobfuscation.md(不在此复制长文)
□ 绕过失败也写 Evidence;禁止反调试退出 = 样本无害
非 PE / 脚本 / DLL 补洞(Issue #65 U–AV · 详见 reverse-engineering/references/nonpe-format-cookbook.md):
□ bat/cmd:SET 拼接还原(U)→ E-batch-deobf;UTF-16 BOM(V);REM/GOTO 淹没(W)
□ PowerShell:多层 Base64/Gzip(X)逐层 Evidence;IEX 拼接/反转(Z)
□ VBA:Stomping/P-Code(AA);Chr/Base64(AB);自修改宏(AC)
□ DLL:TLS+DllMain(AJ);导出异常/无导出(AK/AL);Delay-Load 见 A–T R(AM);侧加载/反射(AO/AP)
□ JS/APK/驱动:路由 js-reverse / apk-reverse / kernel-driver-reverse + cookbook,不在此复制长文
```
### Phase 4: YARA 规则编写
@@ -278,6 +286,7 @@ Triage RE Behav Intel Detect Remed
- `references/anti-analysis-techniques.md` — 94 种反分析技术检测
- `../reverse-engineering/references/re-agent-workflow.md` — IAT 铁律与六阶段门闩(Issue #65)
- `../reverse-engineering/anti-analysis.md` — Agent 响应菜谱 A–T(反调试/混淆旁路)
- `../reverse-engineering/references/nonpe-format-cookbook.md` — 非 PE/多格式菜谱 U–AV(脚本/宏/JS/驱动/DLL/Android)
- `../reverse-engineering/references/ollvm-deobfuscation.md` — 平坦化/不透明谓词(H/S)
## 任务完成自检(声称完成前 MUST 通过)
@@ -288,6 +297,7 @@ Triage RE Behav Intel Detect Remed
- [ ] 重做请求是否回到被点名步骤或经确认的前提协商?阻塞时是否说明+请确认而非偷换步骤?
- [ ] 动态是否按 TLS→EP→敏感 API→ExitProcess 保底顺序预置断点?时间盒/高危 API 组合是否按旁路处理?
- [ ] 反调试/混淆(A–T)是否按 anti-analysis 菜谱记录 Evidence?签名无效是否未错误降级威胁?
- [ ] 脚本/宏/DLL 等非 PE 类型是否按 U–AV cookbook 记录对应 Evidence(如 E-batch-deobf / E-ps-decode / E-vba-pcode / E-dll-*)?
- [ ] 我是否基于 `tool-index` 使用了真实工具路径?
- [ ] 我是否产出了可复现证据(命令/脚本/截图/报告)?
- [ ] 我是否完成并回写了 RULES 要求的 Checklist 项?
@@ -275,6 +275,16 @@ lx-dmesg # 内核日志
---
## Agent 动作锚点(Issue #65 U–AV)
与 `references/nonpe-format-cookbook.md` §5 对齐(短表,不替代上文流程):
| ID | 动作 | Evidence |
|----|------|----------|
| AG | `DriverEntry` 短 → 扫 `MajorFunction` 非空槽,优先 DEVICE_CONTROL/CREATE | `E-driver-irp-handlers` |
| AH | 建立 IOCTL 控制码 → handler 表与 METHOD_* | `E-driver-ioctl` |
| AI | 疑 BYOVD:对照公开脆弱驱动列表;记名/哈希/签名与调用意图;**不写 exploit 步骤** | `E-driver-byovd` |
## 参考资源
| 资源 | 说明 | 链接 |
@@ -0,0 +1,119 @@
# 非 PE / 多格式 Agent 响应菜谱 U–AV(Issue #65)
> 与 PE 反调试菜谱 A–T(../anti-analysis.md)并列:按**文件类型**给出「触发 → 动作一行 → Evidence」。
> **不是**第二套主流程。Triage 识别类型后跳转到对应 skill + 本表。
> 默认 **授权隔离 lab / 已授权样本与设备**。格机、BYOVD、反射注入等写**检测与取证**,不写未授权破坏/利用教程。
> 绕过或还原失败也 MUST 记 Evidence;禁止静默当「无害」。
## 0. 路由速查
| 类型线索 | 主 skill | 本表章节 |
|----------|----------|----------|
| .bat / .cmd / 批处理 | malware-analysis | §1 |
| .ps1 / PowerShell | malware-analysis | §2 |
| Office 宏 / VBA / .docm/.xlsm | malware-analysis | §3 |
| Web/前端 JS 混淆、JSVMP | js-reverse | §4 |
| .sys / 内核驱动 |
everse-engineering/kernel-driver-reverse.md + cre | §5 |
| .dll 侧重点 | malware-analysis /
e-agent-workflow | §6(与 A–T 去重) |
| APK / Magisk / 隐藏图标 | pk-reverse | §7–§8 |
Triage 文件类型为脚本/宏/JS/APK/DLL/SYS 时:完成本类型 **P0 锚点 Evidence** 后再深挖;PE 反调试仍走 A–T。
## 1. BAT/CMD(U V W)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **U** | 大量 SET 单字符变量 + %a%%b% 拼接,或 ^ 续行拆命令 | 逐行展开 SET;还原后命令列表;可用 batch 脱混淆工具;**禁止**未还原就当「无动作」 | E-batch-deobf | P0 |
| **V** | 文本打开乱码,HEX 头 FF FE(UTF-16 LE BOM) | 确认 BOM → 转 UTF-8 再解析;或 chcp 65001 + type | E-batch-encoding | P2 |
| **W** | 大量 REM/::、冗余 GOTO/标签淹没真实逻辑 | 去注释;梳 GOTO 真路径;隔离执行抓 cmd 实际命令日志 | E-batch-deadcode | P1 |
## 2. PowerShell(X Z)
> 编号保留提出者习惯:**无补丁 Y**。
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **X** | 多层 FromBase64String / Gzip / Compress / 嵌套 -replace | **逐层**解码;每层结果单独记;工具可选(PowerDecode 等),无工具则手工/脚本 | E-ps-decode-layer-N | P0 |
| **Z** | 字符串倒序、碎片 + 拼接后 Invoke-Expression/IEX | 还原完整串;对 IEX 下断或脚本块日志;明文命令入 Evidence | E-ps-string-restore | P1 |
## 3. VBA 宏(AA AB AC)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AA** | olevba/OLEDump 仅见 P-Code、源码流空(VBA Stomping) | P-Code 反编译工具;不全则 Word/Excel 宏调试观察;写清限制 | E-vba-pcode | P0 |
| **AB** | 大量 Chr() 拼接或 Base64 串,疑 shellcode/嵌套脚本 | 立即窗口/脚本还原串;解码后判类型;动态盯 CreateObject/Shell | E-vba-str-decode | P1 |
| **AC** | 无意义 If 1=2、或 InsertLines/DeleteLines 自修改 | 静跟真分支;动态 bp 自修改 API 并 dump 改后宏 | E-vba-selfmod | P2 |
## 4. JavaScript(AD AE AF)→ 主路径 js-reverse
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AD** | 自定义字节码数组 + while/switch 解释器(JSVMP) | 找 VM 入口与 opcode 分发;动态日志轨迹;AST+动态双轨;见 js-reverse DeepDive | E-js-vmp | P0 |
| **AE** | while(1){switch} + 大字符串数组下标 | AST/Babel 重构;数组下标还原字符串;wakaru 等可选;**勿**整份粘贴 PE ollvm-deobfuscation 长文 | E-js-deobf | P0 |
| **AF** | debugger、劫持 console、performance.now 差、DevTools 检测 | 停用断点/固定时间源/无头浏览器;patch 检测点;授权页面 | E-js-anti-debug | P1 |
## 5. SYS 内核驱动(AG AH AI)
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AG** | DriverEntry 很短,逻辑不在入口 | 扫 MajorFunction[] 非空槽;优先 IRP_MJ_DEVICE_CONTROL/CREATE;地址列表入证 | E-driver-irp-handlers | P0 |
| **AH** | 存在 DeviceIoControl / IOCTL 分发 | 建控制码→处理函数表;标 METHOD_* 与缓冲方向;用户态通信面 | E-driver-ioctl | P0 |
| **AI** | 样本加载/投放知名脆弱驱动或异常签名驱动(BYOVD 模式) | 对照 LOLDrivers 等**公开**列表;记驱动名/哈希/签名;分析**调用意图**;**不**展开 exploit 步骤 | E-driver-byovd | P1 |
详见 kernel-driver-reverse.md 流程;本表只补 agent 动作锚点。
## 6. DLL(AJ–AQ)— 与 A–T / #72 去重
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AJ** | DLL 分析只看了导出/EP,忽略 TLS 或 DllMain | **TLS 回调 + DllMain 都必须看**;动态断点顺序仍遵循四级火箭(TLS→EP/DllMain→API→ExitProcess) | E-dll-tls-dllmain | P0 |
| **AK** | 导出名前良后恶、错名、或导出与行为不符 | 导出表与实际调用交叉;异常导出列表 | E-exports-anomaly | P0 |
| **AL** | 无导出或导出极少,仍被加载 | 从入口、字符串、xrefs、调用方定位;不要因「无导出」放弃 | E-dll-noexport | P0 |
| **AM** | 静态 IAT 缺 DLL、运行时才用 | **See A–T 补丁 R**(Delay-Load / E-delay-import),此处不双写长文 | E-delay-import | P0 指针 |
| **AN** | 需还原导出函数参数与调用约定 | 交叉引用 + 动态看寄存器/栈;标注 stdcall/fastcall 等 | E-dll-export-abi | P1 |
| **AO** | 疑 DLL 劫持/侧加载 | 查应用目录同名 DLL、搜索路径、KnownDLLs;合法程序+异常 DLL 组合 | E-dll-sideload | P1 |
| **AP** | 无文件映射/反射加载线索 | 内存特征、加载器行为、无路径模块;授权环境取证 | E-dll-reflective | P1 |
| **AQ** | 仅因导出名「不像恶意」降风险 | **禁止**只凭导出名判安全;结合段权限、入口、字符串、动态行为 | E-dll-export-priority | P1 |
DLL/SYS 硬门仍:E-imports + E-exports(见
e-agent-workflow)。
## 7. Android 格机 / 持久化(AR AS AT)→ pk-reverse
> **仅授权样本、镜像或测试设备。** 动作是检测、提取 IOC 与持久化路径,不是实施破坏。
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AR** | Magisk 模块/脚本含删库、刷写、批量 rm 系统分区等**格机特征命令** | 特征命令表 + 模块路径;标高危破坏能力;不执行格机命令 | E-android-wiper-cmd | P0 |
| **AS** | 循环 curl|sh / 远程拉脚本、非常规 C2 URL | 提 URL;分析下载体是否含格机命令;记临时路径 | E-android-wiper-backdoor | P0 |
| **AT** | /data/adb/service.d、post-fs-data.d、可疑 /system/priv-app 等 | 列持久化脚本/APK;内容摘要入证 | E-android-persistence | P1 |
## 8. Android 透明/隐藏图标(AU AV)→ pk-reverse
| ID | 触发 | 动作(摘要) | Evidence | 优先 |
|----|------|--------------|----------|------|
| **AU** | LAUNCHER 图标全透明/空 label、Theme.NoDisplay、无 LAUNCHER category、组件 disabled | apt dump badging + manifest;反编译查图标像素;异常项入证 | E-android-hidden-icon-manifest | P0 |
| **AV** | 已装但桌面无图标,后台流量/自启/高危权限/动态恢复图标 | pm list vs 桌面;dumpsys package;广播与 device_admin;行为入证 | E-android-hidden-icon-behavior | P1 |
## 9. 约束(全局)
1. **不平行主流程**:阶段门闩仍以
e-agent-workflow / 各 skill 为准。
2. **Evidence 必记**:含失败、半还原、quality= 标注。
3. **与 A–T 去重**:PE 反调试不重复;AM→R;AJ 补 DLL 视角不推翻 TLS 火箭。
4. **工具缺失**:记 n/a + 手工等价,不假装已用商业套件。
5. **授权**:破坏性/注入/驱动漏洞类只做防御分析与取证表述。
## 10. P0 最小勾选(类型命中时)
` ext
□ bat/cmd → U(+ 需要时 V/W)
□ ps1 → X(+ Z)
□ vba → AA(+ AB/AC)
□ js 强混淆 → AD 或 AE(+ AF)
□ sys → AG + AH(+ AI 若疑 BYOVD)
□ dll → AJ + AK/AL;Delay-Load 走 R
□ apk 破坏/隐藏 → AR/AS 或 AU(+ AT/AV)
`
@@ -1,7 +1,7 @@
# RE Agent 工作流门闩(静态↔动态)
> 来源启发:binary-re 阶段划分、社区 RE skill(Frida/r2/Ghidra/IDA 循环)、Cerberus 三头环(静/动/插桩)
> Issue #65 增量:IAT 修复铁律、六阶段映射、.NET/DLL·SYS 等价路径;用户指令可行性门闩;旁路补丁 6–10;反调试/混淆菜谱 A–T(2026-08-12)
> Issue #65 增量:IAT 修复铁律、六阶段映射、.NET/DLL·SYS 等价路径;用户指令可行性门闩;旁路补丁 6–10;反调试/混淆菜谱 A–T;非 PE 多格式菜谱 U–AV(2026-08-12)
> 适用:`reverse-engineering/`、`ida-reverse/`、`radare2/`、`malware-analysis/`、与 cre 角色交接
## 0. 启动
@@ -31,7 +31,8 @@
```text
□ 计算样本 Hash(MD5/SHA256)→ 唯一 ID
□ 识别文件类型:EXE / DLL / SYS / ELF / Mach-O / .NET / 脚本 等
□ 识别文件类型:EXE / DLL / SYS / ELF / Mach-O / .NET / 脚本(bat/ps1/vba) / JS / APK 等
□ 非 PE/脚本/APK/驱动专项:见 §3.4 与 `references/nonpe-format-cookbook.md`(U–AV)
□ file / DIE / 熵 / 壳特征(PEiD / DIE / Exeinfo 等)
□ 架构:x86 / x64 / ARM;编译语言线索(VC++ / Delphi / .NET / Go / Rust)
□ 加壳类型线索:UPX / ASPack / VMProtect / Themida / 未知混淆
@@ -173,6 +174,23 @@
**约束**:绕过失败也记 Evidence;禁止把「反调试触发退出」写成「样本无害」。完整 A–T 与 P2(E 编译时间、O 花指令)见 anti-analysis 菜谱节。
### 3.4 非 PE / 多格式旁路(Issue #65 补丁 U–AV · 路由)
完整索引:`reverse-engineering/references/nonpe-format-cookbook.md`。此处只列 **类型 → 入口**;动作细节在 cookbook / 对应 skill。
| 类型 | 跳转 | P0 Evidence 锚点(示例) |
|------|------|---------------------------|
| BAT/CMD | cookbook §1 + malware | `E-batch-deobf` |
| PowerShell | cookbook §2 + malware | `E-ps-decode-layer-N` |
| VBA 宏 | cookbook §3 + malware | `E-vba-pcode` |
| JS 强混淆 / JSVMP | **js-reverse** + cookbook §4 | `E-js-vmp` / `E-js-deobf` |
| SYS 驱动 | kernel-driver-reverse + cookbook §5 | `E-driver-irp-handlers` / `E-driver-ioctl` |
| DLL 侧重点 | cookbook §6(AM≡A–T **R**) | `E-dll-tls-dllmain` / `E-exports` |
| Android 格机/隐藏图标 | **apk-reverse** + cookbook §7–8 | `E-android-wiper-*` / `E-android-hidden-icon-*` |
**约束**:不另起「非 PE 六阶段」;与 §3.3 A–T 分工(PE 反调试 vs 多格式)。授权 lab;格机/BYOVD/反射 = 检测取证表述。
## 4. Synthesis(IOC / 攻击链 / 报告)
```text
@@ -191,7 +209,7 @@
| 1 初步快速研判 | §0–§1 Triage | Hash、架构、文件类型、查壳;imports/等价锚点;§0.5 指令门闩 |
| 2 脱壳与 IAT | §1.2 | IAT 铁律;失败/自校验闪退 → Evidence → Dynamic |
| 3 基础静态锚点 | §2 Static | 高危 API 组合;时间盒 SHOULD |
| 4 深度交叉验证 | §3 Dynamic | 断点四级火箭;无行为应急;时间盒;§3.3 A–T 旁路速查 |
| 4 深度交叉验证 | §3 Dynamic | 断点四级火箭;无行为应急;时间盒;§3.3 A–T;§3.4 U–AV 类型路由 |
| 5 提取 IoC 与攻击链 | §4 Synthesis | IOC + Kill Chain / Path |
| 6 归档与规则化 | §4 + docs-generator / YARA | 结构化报告;规则可选 |
+6 -2
View File
@@ -178,7 +178,7 @@ Assert-Fields (Join-Path $skillsRoot 'ops/timeline-workitem.md') @('timeline.md'
Assert-Fields (Join-Path $skillsRoot 'ops/role-map.md') @('lead', 'cie', 'cpe', 'cre', 'Handoff')
Assert-Fields (Join-Path $skillsRoot 'ops/skill-supply-chain.md') @('AST10', 'MCP', 'bootstrap', 'MUST')
Assert-Fields (Join-Path $skillsRoot 'references/community-security-skills.md') @('trailofbits', 'agentskills.io', 'MUST', '2026-07')
Assert-Fields (Join-Path $skillsRoot 'reverse-engineering/references\re-agent-workflow.md') @('Triage', 'Static', 'Dynamic', 'Synthesis', 'IAT 修复铁律', 'E-iat-repair-fail', 'E-exports', 'dnSpy', '可行性门闩', 'E-self-check-crash', 'ExitProcess', '时间盒', 'E-api-hash', 'E-anti-debug-peb', 'E-wide-strings', 'A–T')
Assert-Fields (Join-Path $skillsRoot 'reverse-engineering/references\re-agent-workflow.md') @('Triage', 'Static', 'Dynamic', 'Synthesis', 'IAT 修复铁律', 'E-iat-repair-fail', 'E-exports', 'dnSpy', '可行性门闩', 'E-self-check-crash', 'ExitProcess', '时间盒', 'E-api-hash', 'E-anti-debug-peb', 'E-wide-strings', 'A–T', 'U–AV', 'nonpe-format-cookbook')
Assert-Fields (Join-Path $skillsRoot 'pentest-tools/references\recon-pipeline.md') @('auth.status', 'network_profile', 'Evidence', 'nuclei')
Assert-Fields (Join-Path $skillsRoot 'docs-generator/references\security-report-templates.md') @('Evidence Chain', 'Findings', 'Path')
Assert-Fields (Join-Path $skillsRoot 'field-journal/_template.md') @('Scope', 'Evidence', 'Finding')
@@ -203,8 +203,12 @@ if ($vendorRulesText -match '(?m)JS/Web 签名逆向报告\s*\|[^\r\n]*malware')
Ok 'vendor rules keep JS signature reports flavor-neutral'
}
Assert-Fields $vendorRulesPath @('skills/ops/evidence-finding-path.md', '来源证据', 'securelist.com/updated-mata', 'www.huorong.cn', 'thin overlay', 'vuln')
Assert-Fields (Join-Path $skillsRoot 'malware-analysis/SKILL.md') @('IAT 修复铁律', 'E-iat-repair-fail', 'E-exports', 'E-self-check-crash', 'ExitProcess', '时间盒', '可行性', 'E-api-hash', 'E-sig-forge', 'A–T')
Assert-Fields (Join-Path $skillsRoot 'malware-analysis/SKILL.md') @('IAT 修复铁律', 'E-iat-repair-fail', 'E-exports', 'E-self-check-crash', 'ExitProcess', '时间盒', '可行性', 'E-api-hash', 'E-sig-forge', 'A–T', 'U–AV', 'E-batch-deobf', 'E-vba-pcode')
Assert-Fields (Join-Path $skillsRoot 'reverse-engineering\anti-analysis.md') @('Agent 响应菜谱 A–T', 'E-anti-debug-cpuid', 'E-api-hash', 'SigCheck', 'ollvm-deobfuscation')
Assert-Fields (Join-Path $skillsRoot 'reverse-engineering/references\nonpe-format-cookbook.md') @('U–AV', 'E-batch-deobf', 'E-ps-decode-layer-N', 'E-vba-pcode', 'E-js-vmp', 'E-driver-irp-handlers', 'E-dll-tls-dllmain', 'E-android-hidden-icon-manifest', 'E-delay-import')
Assert-Fields (Join-Path $skillsRoot 'js-reverse/SKILL.md') @('E-js-vmp', 'E-js-deobf', 'nonpe-format-cookbook')
Assert-Fields (Join-Path $skillsRoot 'apk-reverse/SKILL.md') @('E-android-hidden-icon-manifest', 'nonpe-format-cookbook')
Assert-Fields (Join-Path $skillsRoot 'reverse-engineering\kernel-driver-reverse.md') @('E-driver-irp-handlers', 'E-driver-ioctl', 'E-driver-byovd')
Assert-Fields (Join-Path $skillsRoot 'docs-generator/references\security-report-templates.md') @('thin `vuln`', '1c. 漏洞技术分析')
if ($vendorRulesText -match '(?m)vuln.*默认全文' -or $vendorRulesText -match '第 3 个默认全文 flavor') {
# presence of explicit "not third default" language is OK; flag only if it claims vuln IS a third default full flavor