在soot的学习过程中会遇到大量的和配置相关的一些内容,这些内容设置的不正确会很让人感到苦恼,为此做出以下总结。
使用soot进行编程的流程
基本的流程图如下:
- 【类加载】在类加载阶段,可以设置加载哪些类,哪些不进行加载。
- 【类加载】类加载之后,还需要对类贴上一定的标签,分类。(哪些类是应用的类,哪些类是library类等等),进而为phase的处理阶段进行一定的准备。
-【phase处理类】 phase阶段对于一些类的处理,是可以定制的。(比如说,只解析应用的类,而不考虑library类等)【因为前面对于类进行了标记】
参数配置(总述):(包含下面几个大的方面)
* 一般配置
* 输入配置
* 输出配置
* 处理配置
* 应用模式的配置
* 输入特性的配置
* 输出特性的配置
* 注释的配置
* 其他配置
一般配置(General Options)
1.1. -help
展现帮助,以及退出。
1.2. -phase-list
打印可能的阶段。
1.3. -verbose
啰嗦模式,会打印在处理过程中,丰富的提示信息。
1.4. -app
应用模式运行。
1.5. -whole-program
开启全局模式。对于阶段会产生一定的效果,效果如下:
1.6. -on-the-fly
复杂分析的办法,能够提升精确度。(但是会消耗较多的时间)
输入配置(Input Options)
(通过观察call graph边的数量来查看相应的效果)
1.1. -no-bodies-for-excluded
不加载被排除的类的类体(body)。
【效果】false —》(93749条边) , true —》 (131)
PS:
* 哪些类被排除了?soot默认会排除哪些类?
* flowdroid会排除哪些类?
1.2. -allow-phantom-refs
允许未被处理(unresolve)的类,可能引发错误。
什么叫做未处理的类?
* 找不到对应的源代码就被称作是虚类(phantom class)。
设置为true的时候,出现下面一些提示信息:
* 这条语句的 意思是,无法找到 LambdaMetafactory的源代码。(也就是解析无法进入其中)
Warning: java.lang.invoke.LambdaMetafactory is a phantom class!
设置为false的时候,可能引发异常:
异常信息:
* 之所以会出现异常是因为,大部分情况下,不可能将所有需要的类都加载进来。【建议为true】
Exception in thread “main” java.lang.RuntimeException: Phantom refs not allowed
at soot.SootMethod.setPhantom(SootMethod.java:212)
at soot.SootResolver.processResolveWorklist(SootResolver.java:160)
at soot.Soot