本文更新于 2024 年 11 月 12 日,不保证对该时间往后的软件版本生效。
如有谬误,敬请指出,十分感谢!
关于 SootUp
项目链接
SootUp 发布
2022年12月,SootUp 正式发布,它的架构经过了全面改造,更加模块化、可测试、可维护和可用。
官方说法它是一个架构全面革新的新版的 Soot,Soot 本身就是一个知名的字节码静态分析工具,相信学习过软件分析的小伙伴不会陌生。值得一提的是南大软件分析课程里涉及的 Tai-e(太阿)分析工具,其前端应该也是基于 Soot 的部分模块的,并重新设计了自己的 IR 及其它功能。
如果想开发一个新的程序分析项目,考虑到未来的更新维护,更推荐使用 SootUp(但目前它的功能还相对有限)。由于当下 SootUp 的功能还不够完善,因此,“老”的 Soot 目前仍在继续维护中,特别是那些需要 Instrumentation 能力(参考 JavaAgent 机制的 Instrumentation)或稳健支持安卓的项目,依然是离不开 Soot 的。由于变化较大,并不推荐原先基于 Soot 开发的项目直接升级到 SootUp(略坑)。
请注意!!!
SootUp 是一次彻底的重构,并非 Soot 的一次版本更新或替代品。由于设计了新的架构和接口,想将基于 Soot 的现有项目更新到 SootUp 并非易事。
它能做什么?
前文说到,SootUp 是对静态分析框架 Soot 的全面改造,现有功能如下:
- 将 JVM 字节码转换为 Jimple 类型的中间表示
- 提供类层次结构(ClassHierarchy)的生成
- 基于不同算法/精度生成调用图(CallGraph)
- 使用基于 Heros 的 IDE/IFDS 框架进行过程间数据流分析
- 在检索方法体时执行简单的转换(参见 方法体拦截器 BodyInterceptor)
- 提供 Jimple IR 的序列化。
PS:上述如有不熟悉的关键词可自行搜索,Jimple(Jimple IR)后续(应该、也许、可能、大概)会更新(的吧?)。
为什么要大改?
经过 20 多年的发展,SootUp 的前身 Soot 已经发展成为一个强大的框架,是静态分析社区中使用最广泛的工具之一。不断接受社区的需求作为指导,并通过特定更新来改进。因此,Soot 可以做很多事情,但与此同时,也愈发臃肿、难以维护和理解。因此,官方决定清理代码库,例如:改进软件架构,移除不在 Java 运行时(Java Runtime)中的遗留数据结构。简言之,SootUp 旨在解决 Soot 的缺点,创建一个更轻量级的库,易于理解和维护,以便其他项目的引用。
结语
本篇主要译自官方英文文档,辅上一些个人见解,内容可能存在偏差。
总而言之,先前不了解 Soot 也没关系,SootUp 变化还是相当大的,就从头开始认识它吧。