在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.SootResolver.resolveClass(SootResolver.java:134)
at soot.Scene.tryLoadClass(Scene.java:826)
at soot.Scene.loadBasicClasses(Scene.java:1487)
at soot.Scene.loadNecessaryClasses(Scene.java:1566)
at soot.pointTo.SPARKBasicTest.main(SPARKBasicTest.java:30)

1.3. -src-prec format
设置优先处理的源码的格式。(比如,java,apk等等)

1.4. -process-path dir 或者 -process-dir dir
处理所有在dir中发现的类。

1.5. -main-class class
在进行全局分析的时候,需要设定main class 作为入口处。

* 【jb】可以看出先将装载的相应的类通过jb阶段的处理转化为jimple形式。(phantom类是不被转化的,因为找不到类体)  【其他的都进行了转化吗?】
* 【call graph 构造】转化成jimple形式之后,接下来就是建立起call graph.(三种方式可选:CHA,SPARK,Paddle)
* 【phase的选择】,通过设置如下的形式:(开启spark模式)

Options.v().setPhaseOption(“cg.spark”, “on”);
* 【main】main class的作用在于,是生成call graph必不可少的环节。(call graph的定义,起点不同,则生成的call graph不同)

输出配置(Output Options)

目前关注此方面比较少,所以只说两个。
1. -output-dir dir
将输入的文件保存到 dir 中。

  1. -output-format format
    为soot设置输出的格式。(比如,jimple,shimple等等)

处理选项(Processing Options)

1.-phase-option phase opt:val
将阶段phase 的opt选项设置成value值。

spark开启后,运行时会出现如下的结果

[Spark] Pointer Assignment Graph in 0.1 seconds.
[Spark] Type masks in 0.0 seconds.
[Spark] Pointer Graph simplified in 0.0 seconds.
[Spark] Propagation in 0.0 seconds.
[Spark] Solution found in 0.0 seconds.

应用模式选项 (Application Mode Options)

  1. -include pkg
    将pkg中的类(classes)作为应用的类(application class)。【soot对于要处理的类,进行了分类】

  2. -exclude pkg
    将pkg中的类(classes)从应用类中排除。

3.-include-all
将排除(excluded)的包设置为空的列表。【就没有了被排除的包了】

4.-dynamic-class class
注意在class可以被动态加载。

5.-dynamic-dir dir
将dir中所有的类都认为可能是潜在的动态的。

6.-dynamic-package pkg
将包pkg中的类都设置为可能是潜在的动态的。

代码示例

1.soot 使用的配置。

package soot.pointTo;import java.util.Collections;
import java.util.HashMap;import soot.PackManager;
import soot.Scene;
import soot.SootClass;
import soot.jimple.spark.SparkTransformer;
import soot.jimple.toolkits.callgraph.CallGraph;
import soot.options.Options;public class SPARKBasicTest {public static String processDir = "test/testSpark";public static void main(String[] args) {System.out.println("start ...");soot.G.reset();Options.v().set_src_prec(Options.src_prec_java);Options.v().set_process_dir(Collections.singletonList(processDir));Options.v().set_whole_program(true);Options.v().set_allow_phantom_refs(true);
//        Options.v().set_verbose(true);Options.v().set_output_format(Options.output_format_none);Options.v().setPhaseOption("cg.spark", "on");Options.v().set_no_bodies_for_excluded(true);
//        Options.v().set_app(true);enableSpark();Scene.v().loadNecessaryClasses();Scene.v().loadBasicClasses();String mainClass = "Test1";loadClass("Item",false);loadClass("Container",false);SootClass c = loadClass(mainClass,true);PackManager.v().runPacks();CallGraph callGraph = Scene.v().getCallGraph();System.out.println("the call graph edge number is : "+ callGraph.size());System.out.println("done ...");}private static SootClass loadClass(String name, boolean main) {SootClass c = Scene.v().loadClassAndSupport(name);c.setApplicationClass();if (main)Scene.v().setMainClass(c);return c;}private static void enableSpark(){HashMap opt = new HashMap();opt.put("verbose","true");opt.put("propagator","worklist");opt.put("simple-edges-bidirectional","false");opt.put("on-fly-cg","true");opt.put("apponly", "true");opt.put("set-impl","double");opt.put("double-set-old","hybrid");opt.put("double-set-new","hybrid");SparkTransformer.v().transform("",opt);}
}

2.上面程序处理的对象如下。
Container.java

public class Container {private Item item;// = new Item();void setItem(Item item) {this.item = item;}Item getItem() {return this.item;}
}

Item.java

public class Item {Object data;
}

Test1.java

public class Test1 {public void go() {Container c1 = new Container();Item i1 = new Item();c1.setItem(i1);Container c2 = new Container();Item i2 = new Item();c2.setItem(i2); Container c3 = c2;}public static void main(String args[]) {new Test1().go();}}

Test2.java

public class Test1 {public void go() {Container c1 = new Container();Item i1 = new Item();c1.setItem(i1);Container c2 = new Container();Item i2 = new Item();c2.setItem(i2);Container c3 = c2;}public static void main(String args[]) {new Test1().go();}}

官方全面的配置信息: 文档
关于处理阶段的说明: 处理阶段

soot基础 -- 常用参数配置相关推荐

  1. [Hive_add_8] Hive 常用参数配置

    0. 说明 记录 Hive 常用参数的配置 1. 设置本地模式 让 Hive 自动使用 Hadoop 的本地模式运行作业,提升处理性能 适合小文件,一般用于测试 set hive.exec.mode. ...

  2. 深入Nginx之《常用参数配置技巧》

    常见参配置实战技巧 下面会讲解实战中应该怎么配置更为合理. 1.user 默认是nobody,如果使用nobody,Nginx在运行过程中会出现很多操作没有权限,比如写硬盘.一般都是用低于root级别 ...

  3. HIVE常用参数配置

    HIVE参数配置 --查看参数使用:set  或者set -v; --设置参数使用:set  key=value; --设置reduce个数(默认-1) mapreduce.job.reduces=- ...

  4. CMS常用参数配置指令

    参数配置 说明 -XX:+UseConcMarkSweepGC 启用CMS -XX:ConcGCThreads 配置并发的GC线程数 -XX:+UseCMSCompactAtFullCollectio ...

  5. Mysql性能调优常用参数配置

    全文中一共有常用的(事实上你如果花1-2周阅读.理解.自己动手设一下后是需要这么多参数的)76个参数 可能你从未看到过这样的一篇集中火力式的把mysql参数列了这么全的文章.因此这一篇是汇集了最精华和 ...

  6. ansible playbook play常用参数配置

    我们知道ansible playbook可由多个play组成,而每个play又可以由多个task组成,如果不熟悉playbook play概念的可参考ansible playbook基本概念 下面是一 ...

  7. hive常用参数配置设置

    hive.exec.mode.local.auto  决定 Hive 是否应该自动地根据输入文件大小,在本地运行(在GateWay运行)  true hive.exec.mode.local.auto ...

  8. JVM调优常用参数配置

    2019独角兽企业重金招聘Python工程师标准>>> 堆配置 -Xms:初始堆大小 -Xms:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n: ...

  9. vsftpd 配置文件超详细讲解(常用参数配置)

    前言: 配置文件内容很多,这里我把配置文件里面英文注释删除,并加上了中文注释,这里只针对常用配置进行解析.(在各种坑中总结出来的,很有用!) 环境: centos 7 先查看下 vsftpd 的版本: ...

最新文章

  1. 单片机代码怎么读懂_单片机程序员的面试经验
  2. 一天搞定CSS:初识css--01
  3. mysql5.5更改端口后初始化_centos7 修改mysql5.7默认端口后启动异常
  4. Java 中的并发工具类
  5. Fedora9-ATI显卡Gnome环境下Amarok和EVA花屏现象理会及其处理责罚方法。
  6. ListMapString,Object之按照某个字段排序
  7. NMEA-0183通信协议
  8. shadowgun_SHADOWGUN在Unite上的演讲
  9. 微信读书笔记-《采购与供应链管理》
  10. 2022爱分析· 隐私计算厂商全景报告 | 爱分析报告
  11. 用计算机桁架各杆内力,运用AUTO CAD求解桁架内力(转载)
  12. 计算机毕设选题推荐基于SSM咨询交流网
  13. 洋葱集团携手OceanBase实现分布式升级,全球数据首次实现跨云融合
  14. 数据库事务特征、数据库隔离级别,各级别数据库加锁情况(含实操)--read committed MVCC...
  15. UE4-游戏框架——GameMode、GameState、PlayerState、Controller、Pawn
  16. 客厅服务器装什么系统,客厅云电脑服务器
  17. 车载系列:如何卸载车机Android系统上的软件
  18. 用matlab的lbp算子,Matlab学习: LBP(局部二进制模式)用于人脸识别
  19. 百度地图的全景地图实现的过程
  20. 苹果手机蓝牙与苹果电脑蓝牙怎么连接不上?

热门文章

  1. 移动互联网十年内难以盈利 莫盲目跟风
  2. python学了真的很有用吗-你还在盲目跟风学Python?你真的了解吗?某华大学教授有话要说...
  3. 《面向对象程序设计(Java)》第四周学习总结
  4. staruml 免费版
  5. kermit的安装、配置、使用
  6. mysql 实现日期格式化(date_format)
  7. vs6 中没有集成vss的问题
  8. delphi控件切图界面闪烁_8、控件系列之_加载占位图+页面指示器
  9. 【HDU 1512】Monkey King
  10. Chrome浏览器更新