在https://github.com/Adrninistrator/java-all-call-graph的“shell脚本”、“SQL语句”目录中,保存了一些脚本,可以用于对方法完整调用链进行一些分析操作,包含shell脚本与SQL语句。
以下情况,对应的方法找不到被调用关系,可能会被误识别为入口方法:
- 不是直接通过Java方法进行调用的情况(例如在XML文件中配置代码执行流程、通过注解配置代码执行流程、使用AOP处理等);
- 未被调用的方法。
当代码中引入了接口或抽象父类,且对应多个实现类或子类时,生成的方法完整调用链可能存在多余的调用关系。
当一个接口对应多个实现类时,若在某个类中引入了接口,并调用其方法,生成的完整调用链中,可能将当前类未使用的其他实现类相关的调用关系也包含进来;
当一个抽象父类对应多个非抽象子类时,若在某个类中引入了抽象父类,并调用其方法,生成的完整调用链中,可能将当前类未使用的其他非抽象子类相关的调用关系也包含进来。
当代码中使用工厂模式获取某个接口/抽象父类的实现类/非抽象子类时,也可能会出现类似的问题。
当存在以上情况时,本工具会在当前目录生成“_notice_multi_ITF.md”或“_notice_multi_SCC.md”文件,可按照文档中的提示,将前缀为“method_call_”的数据库表中不需要的方法调用设置为禁用。
当需要将禁用的方法调用恢复为启用时,可按照当前目录生成的“_notice_disabled_ITF.md”或“_notice_disabled_SCC.md”文件的说明进行操作。
使用本工具生成指定方法向下调用链的功能,可以将代码中复杂的方法调用转换为相对简单的方法调用链形式展示。
人工查看生成的调用链时,能够通过类名及方法名识别出对应含义。
支持将不关注的方法调用忽略,仅展示重要的方法调用。
对于分析代码执行流程有一定帮助,适合梳理交易流程、首次接触代码时熟悉流程等场景。
使用本工具生成指定方法向上调用链的功能,可以生成调用指定类的所有方法的调用链。
能识别入口方法,减少人工逐层确认入口方法的工作量。
可用于快速确认被修改代码的影响范围。
在进行应用功能拆分时,需要准确定位指定功能涉及的数据库表,及使用了对应数据库表的相关入口方法。
使用本工具生成指定方法向下调用链的功能,生成指定入口方法向下的调用链,能够根据类的包名快速找到Mapper接口(使用Mybatis的场景),即可找到相关的数据库表。
使用本工具生成指定方法向上调用链的功能,生成调用指定Mapper接口向上的调用链,能够根据“!entry!”找到入口方法。
重复执行以上过程,直到没有再找到新的Mapper接口(即数据库表)和入口方法,即可确认指定功能涉及的数据库表及相关入口方法。
在进行代码审计时,可使用本工具梳理交易流程,生成指定方法向下的调用链,查找是否有调用敏感API;或者生成指定方法向上的调用链,查找调用敏感API的场景。
在进行漏洞分析时,结合本工具生成的完整调用链辅助分析,也能提高效率。