2022 年 12 月,我们正式发布了 SootUp,这是一个经过彻底改造、更加模块化、可测试、可维护和可用架构的 Soot 版本。如果您想开始一个新的程序分析项目,请查看此内容。
由于存在一些混乱:SootUp 的功能尚未完成。因此,“旧的”Soot 暂时需要继续存在,特别是对于需要仪器功能或强大的 Android 支持的项目。 “旧”Soot 仍在维护中,直到可以安全地放弃它以获取功能完整的继任者。
我们定期申请资金来帮助我们维护 Soot。您可以通过让我们了解使用 Soot 的项目(无论是商业项目还是研究工具的形式)来为我们提供巨大帮助。
也非常感谢您通过免费使用的开源许可证支持 Soot!
...支持Soot的进一步发展!亚马逊网络服务是金牌赞助商。
在这里阅读更多关于如何自己成为赞助商的信息。
尝试参与 Soot 的 Java 9 前沿开发。
ModuleScene
中的模块Soot 是一个 Java 优化框架。它提供了四种用于分析和转换 Java 字节码的中间表示形式:
有关详细信息,请参阅 https://soot-oss.github.io/soot。
我们在 wiki 中有一些关于 Soot 的文档,还有大量关于 Soot 的教程。
有关详细信息,另请考虑 Soot 的 JavaDoc 和选项文档。
当前为master
分支的每次提交构建了一个 Soot 版本。您可以使用以下坐标通过 Maven、Gradle、SBT 等将 Soot 作为依赖项包含在内:
< dependencies >
< dependency >
< groupId >org.soot-oss</ groupId >
< artifactId >soot</ artifactId >
< version >4.3.0</ version >
</ dependency >
</ dependencies >
您还可以获得master
分支的较旧版本。完整的构建列表可以在 Maven Central 上找到。
当前为develop
分支的每次提交构建了一个 Soot SNAPSHOT。您可以使用以下坐标通过 Maven、Gradle、SBT 等将 Soot 作为依赖项包含在内:
< dependencies >
< dependency >
< groupId >org.soot-oss</ groupId >
< artifactId >soot</ artifactId >
< version >4.4.0-SNAPSHOT</ version >
</ dependency >
</ dependencies >
< repositories >
< repository >
< id >sonatype-snapshots</ id >
< url >https://oss.sonatype.org/content/repositories/snapshots</ url >
< releases >
< enabled >false</ enabled >
</ releases >
</ repository >
</ repositories >
您还可以获得develop
分支的较旧版本。完整的构建列表可以在 Maven Central 上找到。
我们建议将 Soot 与 Maven 一起使用,您可以直接获取 Soot 的最新版本。您可以直接获取 Soot 的最新 SNAPSHOT 版本。
soot-<RELEASE>-jar-with-dependencies.jar
文件是一个一体化文件,还包含所有必需的库。
soot-<RELEASE>.jar
文件仅包含 Soot,允许您根据需要手动选择依赖项。如果您不想担心依赖关系,我们建议使用前者。
如果您无法使用预构建版本并且需要自己构建 Soot,请考虑 wiki 以获取进一步的步骤。
Soot 遵循 git-flow 约定。版本和修补程序在主分支中维护。开发发生在开发分支中。要抓住 Soot 的前沿,请查看后者。
我们很高兴以 GitHub Pull 请求的形式接受对 Soot 的任意改进。在设置拉取请求之前,请阅读我们的贡献指南。
您正在使用 Soot 并愿意在未来帮助我们支持它吗?那么请填写这个小网络表格来支持我们。
这样您就可以通过两种方式帮助我们:
如果您想使用 Java > 8 运行 Soot,那么您就完成了。像往常一样运行即可。如果您想使用 Java 8 执行 Soot 但分析 Java >8 项目,反之亦然,请参见下文。
要从 java 加载 Soot 的ModuleScene
中的模块:
// configure Soot's options, refer to example configurations below
Options . v (). set_soot_modulepath ( modulePath );
// load classes from modules into Soot
// Here, getClassUnderModulePath() expects the module path to be set using the Options class as seen above
Map < String , List < String >> map = ModulePathSourceLocator . v (). getClassUnderModulePath ( modulePath );
for ( String module : map . keySet ()) {
for ( String klass : map . get ( module )) {
logger . info ( "Loaded Class: " + klass + " n " );
loadClass ( klass , false , module );
// the loadClass() method is defined below
}
}
//this must be called after all classes are loaded
Scene . v (). loadNecessaryClasses ();
public static SootClass loadClass ( String name , boolean main , String module ) {
SootClass c = ModuleScene . v (). loadClassAndSupport ( name , Optional . of ( module ));
c . setApplicationClass ();
if ( main )
Scene . v (). setMainClass ( c );
return c ;
}
ModuleUtil.module_mode() 帮助您检查 Soot 中是否启用了模块。这是根据是否使用 Options 类设置模块路径来完成的。
if ( java < 9 ) { // when you have a target benchmark with Java < 9 and hence no modules
Options . v (). set_prepend_classpath ( true );
Options . v (). set_process_dir ( Arrays . asList ( applicationClassPath (). split ( File . pathSeparator )));
Options . v (). set_soot_classpath ( sootClassPath ());
}
if ( java >= 9 && USE_CLASSPATH ) { // when you have a target benchmark with Java >= 9 and do not want module support
Options . v (). set_soot_classpath ( "VIRTUAL_FS_FOR_JDK" + File . pathSeparator + sootClassPath ());
Options . v (). set_process_dir ( Arrays . asList ( applicationClassPath (). split ( File . pathSeparator )));
}
if ( java >= 9 && USE_MODULEPATH ) { // when you have a target benchmark with Java >= 9 and want module support
Options . v (). set_prepend_classpath ( true );
Options . v (). set_soot_modulepath ( sootClassPath ());
Options . v (). set_process_dir ( Arrays . asList ( applicationClassPath (). split ( File . pathSeparator )));
}
在上面的示例中,applicationClassPath() 应替换为 Soot 分析的应用程序类的路径,sootClassPath() 应替换为 Soot 类路径。
要使用 Java 1.9 执行 Soot,但分析类路径运行,就像以前一样: java -cp soot-trunk.jar soot.Main --process-dir directoryToAnalyse
如果要显式指定类路径,请运行: java -cp soot-trunk.jar soot.Main -cp VIRTUAL_FS_FOR_JDK --process-dir directoryToAnalyse
VIRTUAL_FS_FOR_JDK
值表示 Soot 也应该在 Java 的 (>9) 虚拟文件系统jrt:/
中搜索类,尽管 Soot 不是在模块模式下执行的。
要使用 java 1.8 加载 Soot 中的模块和类,请运行:
java -cp PATH_TO_JAVA9/jrt-fs.jar:soot-trunk.jar soot.Main -pp -soot-modulepath modules/
请将PATH_TO_JAVA9
替换为 java 9 本地安装的路径jrt-fs.jar
是 jrt:// 文件系统 java 9 使用的内置 NIO 文件系统提供程序,用于替换rt.jar
。