build-db
使用 jar-analyzer-engine 从 JAR/WAR/Class 文件构建 SQLite 分析数据库。这是进行 Java 代码安全审计、方法调用分析的第一步。
对 jar-analyzer-engine 构建的 SQLite 数据库执行安全审计分析查询。支持方法调用搜索、调用链追踪、Spring 组件分析、字符串搜索、漏洞模式检测等。
$ npx -y skills add jar-analyzer/jar-analyzer-claude --skill do-analyze --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/do-analyzeContext preview
The summary Claude sees to decide when to auto-load this skill.
对 jar-analyzer-engine 构建的 SQLite 数据库执行安全审计分析查询。支持方法调用搜索、调用链追踪、Spring 组件分析、字符串搜索、漏洞模式检测等。
name: do-analyze description: 对 jar-analyzer-engine 构建的 SQLite 数据库执行安全审计分析查询。支持方法调用搜索、调用链追踪、Spring 组件分析、字符串搜索、漏洞模式检测等。
在 `build-db` skill 构建好 `jar-analyzer.db` 后,使用本 skill 对数据库进行各类安全分析查询。 通过 SQL 查询 + 反编译验证的方式,实现方法调用搜索、调用链追踪、漏洞模式检测等功能。
> **不要在本文件中重复描述数据库表结构。** > 请参考 `<plugin_dir>/references/DATABASE.md` 获取完整的数据库 Schema、字段说明、表关联关系和常用查询模式。
任何方法节点必须通过 **四元组** 唯一标识:
(jar_id, class_name, method_name, method_desc)
> **禁止**仅用方法名进行 join 或追链,因为方法重载很常见。
数据库中的类名使用 `/` 分隔(JVM 内部格式),而非 `.` 分隔:
使用 JVM 方法描述符格式:
**优先使用 `sqlite3` 命令行工具**(直接、高效):
# 单条查询 sqlite3 jar-analyzer.db "SELECT COUNT(*) FROM method_table;" # 格式化输出(带表头、列对齐) sqlite3 -header -column jar-analyzer.db "SELECT class_name, method_name FROM method_table LIMIT 10;" # 多条查询 sqlite3 -header -column jar-analyzer.db <<'EOF' SELECT 'JAR文件' AS type, COUNT(*) AS count FROM jar_table UNION ALL SELECT '类', COUNT(*) FROM class_table UNION ALL SELECT '方法', COUNT(*) FROM method_table; EOF # 输出为 CSV sqlite3 -header -csv jar-analyzer.db "SELECT * FROM spring_method_table;" > routes.csv
**如果 `sqlite3` 不可用,使用 Python 作为备选**:
import sqlite3
conn = sqlite3.connect('jar-analyzer.db')
cursor = conn.execute("SQL_QUERY_HERE")
for row in cursor:
print(row)
conn.close()> 将上述代码写入临时 `.py` 文件执行,分析完成后删除临时文件。
SELECT 'JAR文件' AS type, COUNT(*) AS count FROM jar_table UNION ALL SELECT '类', COUNT(*) FROM class_table UNION ALL SELECT '方法', COUNT(*) FROM method_table UNION ALL SELECT '方法调用', COUNT(*) FROM method_call_table UNION ALL SELECT '字符串常量', COUNT(*) FROM string_table UNION ALL SELECT 'Spring Controller', COUNT(*) FROM spring_controller_table UNION ALL SELECT 'Spring 映射', COUNT(*) FROM spring_method_table UNION ALL SELECT 'Servlet/Filter', COUNT(*) FROM java_web_table;
-- 查找谁调用了某个特定类的方法(精确搜索)
SELECT DISTINCT
caller_class_name, caller_method_name, caller_method_desc
FROM method_call_table
WHERE callee_class_name = 'java/lang/Runtime'
AND callee_method_name = 'exec';
-- 模糊搜索
SELECT DISTINCT
caller_class_name, caller_method_name,
callee_class_name, callee_method_name
FROM method_call_table
WHERE callee_class_name LIKE '%ClassName%'
AND callee_method_name LIKE '%methodName%';-- 精确搜索 SELECT class_name, method_name, method_desc, is_static, line_number FROM method_table WHERE method_name = 'execute'; -- 模糊搜索 SELECT class_name, method_name, method_desc, line_number FROM method_table WHERE method_name LIKE '%upload%' OR method_name LIKE '%file%';
-- 使用 SQLite 递归 CTE 追踪调用链(推荐)
WITH RECURSIVE call_chain AS (
SELECT caller_class_name, caller_method_name, caller_method_desc,
callee_class_name, callee_method_name, callee_method_desc, 1 AS depth
FROM method_call_table
WHERE callee_class_name = 'java/lang/Runtime' AND callee_method_name = 'exec'
UNION ALL
SELECT mc.caller_class_name, mc.caller_method_name, mc.caller_method_desc,
mc.callee_class_name, mc.callee_method_name, mc.callee_method_desc, cc.depth + 1
FROM method_call_table mc
JOIN call_chain cc ON mc.callee_class_name = cc.caller_class_name
AND mc.callee_method_name = cc.caller_method_name
AND mc.callee_method_desc = cc.caller_method_desc
WHERE cc.depth < 10
)
SELECT DISTINCT caller_class_name, caller_method_name, depth
FROM call_chain
ORDER BY depth;> 也可以编写 Python 脚本实现 DFS/BFS 调用链追踪,灵活度更高。
-- 列出所有 Spring Controller SELECT class_name FROM spring_controller_table; -- 列出所有 HTTP 映射(API 入口) SELECT class_name, method_name, restful_type, path FROM spring_method_table ORDER BY path; -- 查找特定 URL 模式的处理方法 SELECT class_name, method_name, method_desc, restful_type, path FROM spring_method_table WHERE path LIKE '%user%' OR path LIKE '%admin%';
-- 列出所有 Servlet/Filter/Listener SELECT type_name, class_name FROM java_web_table; -- 只看 Filter(可能是安全过滤器) SELECT class_name FROM java_web_table WHERE type_name = 'Filter';
-- 搜索包含关键字的字符串(如密码、密钥等) SELECT class_name, method_name, value FROM string_table WHERE value LIKE '%password%' OR value LIKE '%secret%' OR value LIKE '%key%' OR value LIKE '%token%'; -- 搜索 JNDI/LDAP/RMI 相关字符串 SELECT class_name, method_name, value FROM string_table WHERE value LIKE '%jndi%' OR value LIKE '%ldap://%' OR value LIKE '%rmi://%'; -- 搜索 SQL 语句(可能有 SQL 注入风险) SELECT class_name, method_name, value FROM string_table WHERE value LIKE '%SELECT%FROM%' OR value LIKE '%INSERT%INTO%' OR value LIKE '%UPDATE%SET%' OR value LIKE '%DELETE%FROM%'; -- 搜索 IP 地址和 URL SELECT class_name, method_name, value FROM string_table WHERE value LIKE '%://%' OR value LIKE '%.%.%.%';
-- 查找某个类的所有子类 SELECT class_name, super_class_name FROM class_table WHERE super_class_name LIKE '%AbstractController%'; -- 查找某个接口的所有实现类 SELECT class_name, interface_name FROM interface_table WHERE interface_name LIKE '%Serializable%'; -- 查找方法实现(接口方法 → 具体实现) SELECT class_name, method_name, method_desc, impl_class_name FROM method_impl_table WHERE method_name = 'doFilter';
-- 查找所有带特定注解的类/方法 SELECT class_name, method_name, anno_name FROM anno_table WHERE anno_name LIKE '%RequestMapping%' OR anno_name LIKE '%GetMapping%' OR anno_name LIKE '%PostMap
基于 jar-analyzer 的 Claude Code 插件,用于 Java JAR/WAR 包静态分析与安全审计。
使用 jar-analyzer-engine 从 JAR/WAR/Class 文件构建 SQLite 分析数据库。这是进行 Java 代码安全审计、方法调用分析的第一步。