1.概述

soot的执行被划分成了很多阶段,这些阶段的名字叫做packs.

  • soot的设计值得学习,通过划分阶段,将每个阶段处理的职责分清楚。
  • 同时,也正确的处理了各个阶段的依赖关系。

2.soot阶段图

(1)大致的框架

先来看一张总体的框架图:

- 输入的起点是Jimple . 因此,必须将要处理的 源代码 转化为 Jimple,才能进行后续的其他的处理
- Jimple在Soot中起到了基础核心的作用。
- 用户可以在转化阶段加入一些分析相关的信息。这个可以在jtp(Jimple Transformation pack)阶段,以及stp(Shimple transformation pack)阶段添加处理来实现。
-


摘自:soot生存手册
关于以上符号的说明
第1个字母:【表示中间代码】

* s 代表 Shimple
* j 代表 Jimple.
* b 代表 Baf.
* g 代表 Grimp.

第2个字母:【该阶段处理的角色,责任】

* b 代表 方法体(body)创建阶段。
* t 代表 用户定义的转换阶段。
* o 代表 优化(optimizations)。
* a 代表 属性生成。(annoation)

最后的P:

* p 表示“pack",是处理阶段的意思。

(2) 大阶段与小阶段

下面是几乎所有的soot自带的处理阶段的介绍。
* 【主要建立在Jimple的基础之上】从中可以看出,大部分的处理阶段都是针对Jimple的,可以看出Jimple在soot中发挥出来的基础性的作用。
* 这些阶段以及子阶段,有些可以同时使用,有些是选择使用(比如,call graph)。
* 【不同的大阶段有不同的用处】每个大的阶段的子阶段处理的内容也是不同的。(选对中间代码)
* 更具体的阶段介绍: 帮助文档

    jb                            Creates a JimpleBody for each method   jb.ls                        Local splitter: one local per DU-UD web   jb.a                         Aggregator: removes some unnecessary copies   jb.ule                       Unused local eliminator   jb.tr                        Assigns types to locals   jb.ulp                       Local packer: minimizes number of locals   jb.lns                       Local name standardizer   jb.cp                        Copy propagator   jb.dae                       Dead assignment eliminator   jb.cp-ule                    Post-copy propagation unused local eliminator   jb.lp                        Local packer: minimizes number of locals   jb.ne                        Nop eliminator   jb.uce                       Unreachable code eliminator   jb.tt                        Trap Tightener   jj                            Creates a JimpleBody for each method directly   from source   jj.ls                        Local splitter: one local per DU-UD web   jj.a                         Aggregator: removes some unnecessary copies   jj.ule                       Unused local eliminator   jj.tr                        Assigns types to locals   jj.ulp                       Local packer: minimizes number of locals   jj.lns                       Local name standardizer   jj.cp                        Copy propagator   jj.dae                       Dead assignment eliminator   jj.cp-ule                    Post-copy propagation unused local eliminator   jj.lp                        Local packer: minimizes number of locals   jj.ne                        Nop eliminator   jj.uce                       Unreachable code eliminator   wjpp                          Whole Jimple Pre-processing Pack   wspp                          Whole Shimple Pre-processing Pack   cg                            Call graph constructor   cg.cha                       Builds call graph using Class Hierarchy   Analysis   cg.spark                     Spark points-to analysis framework   cg.paddle                    Paddle points-to analysis framework   wstp                          Whole-shimple transformation pack   wsop                          Whole-shimple optimization pack   wjtp                          Whole-jimple transformation pack   wjtp.mhp                     Determines what statements may be run   concurrently   wjtp.tn                      Finds critical sections, allocates locks   wjtp.rdc                     Rename duplicated classes when the file   system is not case sensitive   wjop                          Whole-jimple optimization pack   wjop.smb                     Static method binder: Devirtualizes   monomorphic calls   wjop.si                      Static inliner: inlines monomorphic calls   wjap                          Whole-jimple annotation pack: adds   interprocedural tags   wjap.ra                      Rectangular array finder   wjap.umt                     Tags all unreachable methods   wjap.uft                     Tags all unreachable fields   wjap.tqt                     Tags all qualifiers that could be tighter   wjap.cgg                     Creates graphical call graph.   wjap.purity                  Emit purity attributes   shimple                       Sets parameters for Shimple SSA form   stp                           Shimple transformation pack   sop                           Shimple optimization pack   sop.cpf                      Shimple constant propagator and folder   jtp                           Jimple transformation pack: intraprocedural   analyses added to Soot   jop                           Jimple optimization pack (intraprocedural)   jop.cse                      Common subexpression eliminator   jop.bcm                      Busy code motion: unaggressive partial   redundancy elimination   jop.lcm                      Lazy code motion: aggressive partial   redundancy elimination   jop.cp                       Copy propagator   jop.cpf                      Constant propagator and folder   jop.cbf                      Conditional branch folder   jop.dae                      Dead assignment eliminator   jop.nce                      Null Check Eliminator   jop.uce1                     Unreachable code eliminator, pass 1   jop.ubf1                     Unconditional branch folder, pass 1   jop.uce2                     Unreachable code eliminator, pass 2   jop.ubf2                     Unconditional branch folder, pass 2   jop.ule                      Unused local eliminator   jap                           Jimple annotation pack: adds intraprocedural   tags   jap.npc                      Null pointer checker   jap.npcolorer                Null pointer colourer: tags references for   eclipse   jap.abc                      Array bound checker   jap.profiling                Instruments null pointer and array checks   jap.sea                      Side effect tagger   jap.fieldrw                  Field read/write tagger   jap.cgtagger                 Call graph tagger   jap.parity                   Parity tagger   jap.pat                      Colour-codes method parameters that may be   aliased   jap.lvtagger                 Creates color tags for live variables   jap.rdtagger                 Creates link tags for reaching defs   jap.che                      Indicates whether cast checks can be   eliminated   jap.umt                      Inserts assertions into unreachable methods   jap.lit                      Tags loop invariants   jap.aet                      Tags statements with sets of available   expressions   jap.dmt                      Tags dominators of statement   gb                            Creates a GrimpBody for each method   gb.a1                        Aggregator: removes some copies, pre-folding   gb.cf                        Constructor folder   gb.a2                        Aggregator: removes some copies, post-folding   gb.ule                       Unused local eliminator   gop                           Grimp optimization pack   bb                            Creates Baf bodies   bb.lso                       Load store optimizer   bb.pho                       Peephole optimizer   bb.ule                       Unused local eliminator   bb.lp                        Local packer: minimizes number of locals   bop                           Baf optimization pack   tag                           Tag aggregator: turns tags into attributes   tag.ln                       Line number aggregator   tag.an                       Array bounds and null pointer check   aggregator   tag.dep                      Dependence aggregator   tag.fieldrw                  Field read/write aggregator   db                            Dummy phase to store options for Dava   db.transformations           The Dava back-end with all its   transformations   db.renamer                   Apply heuristics based naming of local   variables   db.deobfuscate               Apply de-obfuscation analyses   db.force-recompile           Try to get recompilable code.   

(3)一个小的阶段分析

Grimple与Jimple相比的不同之处:
1. 表达式树不再是线性的形式,允许复杂表达式的存在。
2. 对象的初始化以及构造 改为了new 关键表示。
3.【复杂表达式中的例外】 复杂的表达式虽然不再借助于临时中间变量(局部变量用$开头),但是一旦与while,if等条件语句进行了关联,那么临时的中间变量就会产生。

关于Grimple阶段相关的一些说明
- 【方法体处理】gb是用来创建一个Grimp格式的方法体的阶段。
- 【gb依赖于Jimple处理】通过前面的大的阶段图,可以而看出gb是建立在已经对于方法体进行Jimple处理的基础上进行的。
- 【gb的特点】更容易让人看懂,更接近于java代码的表述形式,相对于Jimple而言,也是更加高级的。而Jimple是基于3地址的,也就是说一个语句,表达式,会被分解成很多细小的片段,这对于阅读而言是有些吃力的。而Grimp相对于Jimple而言,将一些无用的中间变量去除掉。这就是合并folder】.将一些中间变量进行合并。
- 【合并阶段】gb.a1 , gb.cf , gb.a2都是用来合并的。
- 【清理变量阶段】经过合并处理,会有一些不使用的变量(垃圾变量)产生,然后我们通过 gb.ule对于垃圾变量进行清除。
- 【优化阶段】在此语言格式基础上,进行有针对性的优化。

gb                            Creates a GrimpBody for each method   gb.a1                        Aggregator: removes some copies, pre-folding   gb.cf                        Constructor folder   gb.a2                        Aggregator: removes some copies, post-folding   gb.ule                       Unused local eliminator   gop                           Grimp optimization pack   

关于上面的阶段的一些补充说明:

主要是针对gb.ule阶段的说明:
我们想解析下面一段java代码(只取出了部分):
示例1
java代码

public void add(){int i =5;int j = 7;int all  = 3 * i + 5*j + 8;}

转化之后的Grimple代码
- 【变量消失】你会发现的变量信息都没有了。(因为被当作垃圾变量给优化掉了)
- 【原因】这种优化的产生,可能是来自gb.ule,更可能的是来自是来自之前的Jimple处理的阶段,就已经对于这些东西进行了优化。

public void add(){AddTest this;this := @this: AddTest;return;}

实例2
java代码

public int add(int k, int q){int d = 3 * k + 5 * q + 8;int p = 2*d;return p;}

生成Grimp代码

-【变量保留】 相对于之前的代码而言,这次是有一些变量保留了的。
- 【保留原因】当这个变量被使用的时候,变量就会被保留了。(依据变量依赖图来决定保留哪些)
- 与输入输出进行关联,从而形成一种保留链。(如果变量A与输出关系,那么A所依赖的变量也将被保留)【更进一步的信息,可以参考UnitGraph的生成规则】

public int add(int, int){AddTest this;int k, q, d, temp$0, temp$2, temp$3, temp$4;this := @this: AddTest;k := @parameter0: int;q := @parameter1: int;temp$0 = 3 * k;temp$2 = 5 * q;temp$3 = temp$0 + temp$2;d = temp$3 + 8;temp$4 = 2 * d;return temp$4;}

3.例:得到程序相关的call graph.

假如我们想得到程序的函数调用图(call graph),我们需要对于soot在分析前进行一系列参数上的设置。

- 这里参数设置的目的,在于进行阶段的组装。(就像组装玩具一样,只不过在这里我们是通过参数来使其进行一定的组装)
- soot会按照一定的规则来生成call graph ,包含3个处理的办法。(CHA,SPARK,Paddle,其中默认生成call graph使用的是CHA,CHA生成速度快,但是是最不准确的)

开启全局模式之后的实例

设置全局模式的方式:

Options.v().set_whole_program(true);

当我们告诉soot需要开启全局模式的时候,它就会进行如下的阶段组装

关于下图的一些说明
(1)图中2部分是新加的阶段。也就是说,如果你不开启全部模式是不会有这些阶段的。(比如说,你想生成call graph,但是你没有开启全局模式,也就是说你是得不到call graph的,也就是说下面的代码会出错)

(2)jb(负责jimple body的创建),soot将jb阶段应用于每个方法体,也就是每个有body的方法。Native方法(如,System.currentTimeMills())是没有body的。jb处理是固定的,不能被改动的。

(3)whole-program阶段
- cg. 生成call graph阶段。
- wjtp.全局jimple转换阶段。
- wjop.全局jimple优化阶段。
- wjap.全局jimple注解阶段。
(可以在各个大的阶段中添加小的阶段)

(4)jimple的阶段jtb,jop,jap.
soot对于每个方法体(body),应用下面3个阶段:
- jtp.jimple转化阶段。
- jop.jimple优化阶段。
- jap.jimple注解阶段。

(5)bb, tag阶段
soot将bb,tag应用每个方法体(body) . bb 阶段将(优化,打上标签)的jimple方法体变为Baf方法体(也是一种中间代码)。 tag阶段,用来打标签。(比如很多语句有相同的编号,那么soot只会保留第一个命令的的tag.)

 Scene.v().getCallGraph();

更详细的生成call graph的代码
下面代码用来获得一个apk的call graph.

 SetupApplication app = new SetupApplication("D:/Tools/adt-bundle-windows-x86_64-20140321/sdk/platforms","D:/Temp/com.tweakersoft.aroundme-1.apk");app.calculateSourcesSinksEntrypoints("D:/Arbeit/Android Analyse/soot-infoflow-android/SourcesAndSinks.txt");soot.G.reset();
//1.进行相关的配置,告诉Soot将用什么方式流程来运行。Options.v().set_src_prec(Options.src_prec_apk);Options.v().set_process_dir(Collections.singletonList("D:/Temp/com.tweakersoft.aroundme-1.apk"));Options.v().set_android_jars("D:/Tools/adt-bundle-windows-x86_64-20140321/sdk/platforms");Options.v().set_whole_program(true);//开启全局模式Options.v().set_allow_phantom_refs(true);Options.v().set_output_format(Options.output_format_class);Options.v().setPhaseOption("cg.spark", "on");//SPARK生成的call graph更准确
//2.加载相关的类。Scene.v().loadNecessaryClasses();
//3.设置call graph的入口结点。【这是由call graph的定义决定的,必须有入口】SootMethod entryPoint = app.getEntryPointCreator().createDummyMain();Options.v().set_main_class(entryPoint.getSignature());Scene.v().setEntryPoints(Collections.singletonList(entryPoint));System.out.println(entryPoint.getActiveBody());
//4.配置就绪后开始运行PackManager.v().runPacks();
//5.获得运行之后的结果。(call graph相关的信息)System.out.println(Scene.v().getCallGraph().size()); 

参考:
Packs and phases in Soot
Soot API文档
Soot command-line options(命令行使用)

soot基础 -- soot 中的处理阶段相关推荐

  1. soot基础 -- soot中基本的对象

      soot有着庞大的类层次结构.这篇文章将给读者介绍扩展soot时候一些非常重要的类.   这里我们主要介绍Body,Unit,Local,Value,UnitBox以及ValueBox的概念. 关 ...

  2. soot基础 -- 常用参数配置

    在soot的学习过程中会遇到大量的和配置相关的一些内容,这些内容设置的不正确会很让人感到苦恼,为此做出以下总结. 使用soot进行编程的流程 基本的流程图如下: [类加载]在类加载阶段,可以设置加载哪 ...

  3. 我国中职计算机基础课程停留在什么阶段,微课在中职计算机基础课程中的应用...

    摘 要:微课已成为当前我国教育信息化发展的重点和热点.在如今的数字化"微"时代,微课将成为一种新的教学模式和学习方式.微课,用化整为零.重点突破的方式解决了教学的重.难点,为我们的 ...

  4. 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化

    js基础知识中的作用域和闭包 一.作用域 1.作用域.自由变量简介 (1)作用域定义 (2)作用域实例演示 (3)自由变量定义 (4)自由变量实例演示 2.作用域链简介 (1)作用域链定义 (2)作用 ...

  5. 微信在计算机基础中的辅助作用,基于微信课后辅导在计算机基础教学中应用.doc...

    基于微信课后辅导在计算机基础教学中应用 基于微信课后辅导在计算机基础教学中应用 摘 要: 如今,计算机技术更新快与计算机教育资源少的矛盾,促使课后学习成为大学生获取知识的重要途径.课后辅导是大学生课后 ...

  6. SQL Server 查询处理中的各个阶段

    SQL Server 查询处理中的各个阶段 SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管 ...

  7. 计算机任务驱动法教学应用,_任务驱动法_在计算机基础教学中的应用

    "任务驱动法"在计算机基础教学中的应用 义乌工商职业技术学院计算机工程系 吕 君 [摘 要]"任务驱动法"是一种建立在建构主义教学理论基础上的教学方法,将任务驱 ...

  8. 计算机思维能力培养的核心是什么,【计算机基础论文】计算机基础教学中计算思维能力培养(共6714字)...

    计算机基础教学中计算思维能力培养 摘要:自C9明确提出大学计算机基础教学的核心任务是培养学生计算思维能力后,计算思维能力培养日益受到重视.但从培养目标.培养方式.培养过程.培养效果来看,还存在诸多问题 ...

  9. 计算机基础知识在教学的应用,计算机基础知识中项目教学法的应用

    摘要: 目前正处于信息爆炸的时代,计算机技术的普及范围在不断扩大,它对人们的生活.工作以及学习都产生较大的影响.在新课程改革的大背景下,计算机基础知识的传授十分重要,特别是在职高的计算机专业课上,能让 ...

最新文章

  1. 使用bitblt提高GDI+绘图的效率(转)
  2. ZOJ 1610 Count the Colors (线段树区间更新)
  3. 统计概率分布_概率统计中的重要分布
  4. 英特尔 620 显卡 驱动 七代cpu_英特尔的智能“整体厨房”
  5. java处理unicode_C# JavaScript Java 与 中文 unicode 处理
  6. Java集合之LinkedHashMap源码分析
  7. 剑指offer 面试题5—从尾到头打印链表
  8. 什么是mysql事物定义_MySQL中事务概念的简洁学习教程
  9. 从目标文件结构,加载、执行阶段,汇编角度来理解C程序内存分区
  10. RMAN数据库完全备份和恢复
  11. 淘宝618超级喵运会怎么玩?超级喵运会整体活动攻略来了
  12. 爱心的数学函数方程_求心形函数表达式~~~
  13. React | 受控组件(Controlled Component)与不受控组件(Uncontrolled Component)的区别
  14. TESLA M40折腾笔记
  15. 模仿“选择游戏角色的页面”
  16. 抽样技术--简单随机抽样
  17. SELinux策略语言--类型强制(编写TE规则)
  18. 白乔原创:图数据在线交互框架InteractiveGraph
  19. 如何看待 30 岁转行做程序员这件事
  20. SQL Server 发展简史

热门文章

  1. matlab中solve解方程,怎么用Matlab解方程?
  2. 钕铁硼产品磁性能相对检测原理与技术
  3. 育润多维发力慈善领域,勇抗企业公益大旗
  4. js编写计算圆周长和面积
  5. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(1):Cortex-M3指令集概要
  6. Ubuntu下,grep的用法
  7. Hadoop数据完整性与CheckSum校验原理
  8. flutter 九宫格菜单_Flutter 仿微信/微博九宫格
  9. 中职学校计算机基础的重要性,自学能力论文,关于浅淡培养中职学生计算机自学能力的重要性和方法相关参考文献资料-免费论文范文...
  10. 【大数据存储技术】实验2:MongoDB数据库的部署和操作