关于 patch-diff-analyzer
Patch Diff Analyzer 是用于比较反编译后的 JAR 或 .NET 二进制文件、调查修补前后安全相关变化的技能。它指导工作区设置、差异生成和针对代码变更的审查。
主要功能
- 01反编译 JAR 和 DLL 文件
- 02用 Git 提交和标签跟踪版本
- 03生成差异及变更文件报告
- 04指导审查安全相关变更
- 05区分专有代码与第三方库
适用场景
- 01调查安全补丁中的变更
- 02在源码不可用时审查编译后的二进制文件
- 03聚焦分析专有代码中的补丁
- 04评估漏洞修复是否完整
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hacktronai/ skills --skill patch-diff-analyzer安装后在 Claude Code 中输入/patch-diff-analyzer确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdexamples/example-workflow.mdscripts/analyze-diff.shdecompile-dll.shdecompile-jar.shsetup-workspace.sh详细介绍
补丁差异分析器
重要:用户可能会要求分析已编译二进制文件(JAR、DLL 等)中的安全补丁,以了解修复了哪些漏洞。此扩展可帮助反编译二进制文件、生成差异并识别与安全相关的变更。
可用脚本
此扩展包含以下脚本:
- setup-workspace.sh
<workspace-name>
功能:
- 创建工作区目录
- 初始化 git 仓库以跟踪差异
- 配置用于提交的 git 用户
- 创建子目录:
decompiled/、output/
- decompile-jar.sh <app.jar> /decompiled/
功能:
- 在工作区目录中创建反编译目录
- 在该目录中反编译 jar 文件。
- decompile-dll.sh <app.dll> /decompiled/
功能:
- 在工作区目录中创建反编译目录
- 在该目录中反编译 dll 文件。
- analyze-diff.sh
功能:
- 验证 git 仓库是否有 2 个或更多提交
- 识别
unpatched和patched标签(或使用 HEAD~1 和 HEAD) - 生成差异统计信息
- 创建
patch-analysis.diff文件 - 创建
changed-files.txt列表
工作流决策树
当用户请求分析补丁时:
-
识别二进制文件:是否需要确定哪个文件是已打补丁版本,哪个是未打补丁版本?
-
文件格式:要分析哪种类型的二进制文件?
- Java JAR → 使用 JAR 反编译工作流
- .NET DLL/EXE → 使用 .NET 反编译工作流
- 其他 → 咨询用户以确定合适的反编译器
-
分析背景:用户是否提供了漏洞信息?
- 是(提供了 CVE/描述) → 聚焦分析相关变更
- 否(盲目分析) → 全面分析安全相关变更
二进制文件识别
关键:反编译前,务必正确识别已打补丁的二进制文件。
识别方法
-
明确命名:
- 文件名为
patched.jar/unpatched.jar - 文件名为
vulnerable.jar/fixed.jar - → 按指定版本使用
- 文件名为
-
版本号:
app-1.2.3.jar与app-1.2.4.jar- → 通常较高的版本号是已打补丁版本(1.2.4 > 1.2.3)
- 语义化版本格式:major.minor.patch
-
文件时间戳:
ls -lt *.jar- 较新的时间戳通常表示已打补丁版本
- 注意:如果文件被复制或移动,这种方法并不可靠
-
无法确定时:
- 务必向用户确认
- 只要存在任何不确定性,就不要猜测
设置与反编译
工作区设置脚本
使用提供的设置脚本。
高效提取(跳过第三方库)
关键:对于 WAR 文件或大型应用,请仅在反编译前提取专有代码。这能显著节省时间和存储空间。
确定专有代码的位置
WAR 文件结构:
application.war
├── WEB-INF/
│ ├── classes/ ← Application code (DECOMPILE THIS)
│ │ └── com/
│ │ └── vendor/ ← Proprietary packages
│ └── lib/ ← Third-party JARs (SKIP THESE)
│ ├── jackson-*.jar
│ ├── spring-*.jar
│ └── hibernate-*.jar
└── META-INF/
仅提取专有代码
# 1. List WAR contents to identify proprietary packages
unzip -l unpatched.war | grep "WEB-INF/classes" | grep "\.class$" | head -30
# Look for company-specific packages:
# WEB-INF/classes/com/acme/
# WEB-INF/classes/com/vendor/
# WEB-INF/classes/org/internal/
# 2. Extract ONLY proprietary classes
mkdir -p temp-unpatched
unzip unpatched.war "WEB-INF/classes/com/vendor/*" -d temp-unpatched/
unzip unpatched.war "WEB-INF/classes/com/acme/*" -d temp-unpatched/
# 3. Create JAR from extracted classes
cd temp-unpatched/WEB-INF/classes
jar cf ../../../vendor-unpatched.jar .
cd ../../..
# 4. Repeat for patched version
mkdir -p temp-patched
unzip patched.war "WEB-INF/classes/com/vendor/*" -d temp-patched/
unzip patched.war "WEB-INF/classes/com/acme/*" -d temp-patched/
cd temp-patched/WEB-INF/classes
jar cf ../../../vendor-patched.jar .
cd ../../..
# Now decompile ONLY proprietary code (much faster!)
JAR 反编译工作流
第 1 步:反编译未打补丁版本(专有代码)
- 使用扩展提供的 JAR 反编译脚本反编译 JAR。
第 2 步:提交未打补丁版本
cd <workspace>
git add -A
git commit -m "Unpatched version"
git tag unpatched
关键:差异分析脚本会使用 unpatched 标签。
第 3 步:反编译已打补丁版本
重要:先清空反编译目录,以免文件混杂。
rm -rf <workspace>/decompiled/*
第 4 步:提交已打补丁版本
cd <workspace>
git add -A
git commit -m "Patched version"
git tag patched
关键:差异分析脚本会使用 patched 标签。
.NET 反编译工作流
第 1 步:反编译未打补丁版本
- 使用扩展提供的 DLL 反编译脚本反编译 DLL。
第 2-4 步:与 JAR 工作流相同
按照 JAR 工作流执行相同的 git 提交流程:
- 提交未打补丁的版本并添加标签
- 清空目录
- 反编译已打补丁的版本
- 提交已打补丁的版本并添加标签
差异生成与分析
生成差异
- 使用 analyze-diff.sh
<workspace>生成patch-analysis.diff和changed-files.txt列表
阅读并分析差异
必须:完整阅读生成的差异文件。
不要使用 grep 或模式匹配。大模型必须阅读并推理实际的代码变更。
安全分析
关键:在此处运用安全专业知识,理解漏洞修复。
第 1 步:筛选第三方库
必须先做:分析变更之前,将专有代码与第三方库分开。
原因:
- 第三方库更新是预期内且记录详尽的(Jackson、Spring、Hibernate 等)
- 专有代码变更表明存在应用特定的安全修复
- 自定义漏洞比已知的库 CVE 更值得关注
- 聚焦专有代码有助于发现独特的攻击向量
第 2 步:分析流程
- 阅读每项变更:不要跳过任何修改,即使是很小的修改
- 理解上下文:查看周边代码,而不只是差异行
- 识别安全变更:区分安全修复与重构或功能变更
- 推理漏洞成因:之前可能发生什么攻击?修复阻止了什么?
- 评估修复完整性:修复是否全面?是否仍有绕过方式?
需要关注的内容
高优先级指标:
- 在原本没有输入验证的地方新增验证
- 对用户可控数据进行清理或编码
- 新增身份验证或授权检查
- 在访问数组或缓冲区之前进行边界检查
- 类型检查或类型转换变更
- 文件路径规范化
- 使用参数化查询替代字符串拼接
- 反序列化过滤器或允许列表
- 资源限制(大小、超时、速率)
报告分析结果
报告结构
必须:分析报告采用以下结构:
# Patch Analysis Summary
## Overview
[Brief description of what was analyzed]
## Vulnerability Identified: [Type/CVE]
**Severity**: [Critical/High/Medium/Low]
## Detailed Analysis
### File: [path/to/file.java:line-range]
[Detailed analysis following the framework above]
## Completeness Assessment
[Is the fix complete? Any potential bypasses? Additional recommendations?]
## Confidence Level
Overall confidence: [HIGH/MEDIUM/LOW] ([percentage]%)
错误消息与解决方案
“未找到反编译器”
解决方案:安装 jadx(用于 JAR)或 ilspycmd(用于 DLL)
“不是 git 仓库”
解决方案:先运行 setup-workspace.sh 脚本
“至少需要 2 次提交”
解决方案:确保未打补丁和已打补丁的版本都已提交
“未发现差异”
解决方案:
- 确认反编译的是不同版本
- 检查
git log中的提交记录 - 这可能表示文件完全相同