soot基础 -- soot 中的处理阶段
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 中的处理阶段相关推荐
- soot基础 -- soot中基本的对象
soot有着庞大的类层次结构.这篇文章将给读者介绍扩展soot时候一些非常重要的类. 这里我们主要介绍Body,Unit,Local,Value,UnitBox以及ValueBox的概念. 关 ...
- soot基础 -- 常用参数配置
在soot的学习过程中会遇到大量的和配置相关的一些内容,这些内容设置的不正确会很让人感到苦恼,为此做出以下总结. 使用soot进行编程的流程 基本的流程图如下: [类加载]在类加载阶段,可以设置加载哪 ...
- 我国中职计算机基础课程停留在什么阶段,微课在中职计算机基础课程中的应用...
摘 要:微课已成为当前我国教育信息化发展的重点和热点.在如今的数字化"微"时代,微课将成为一种新的教学模式和学习方式.微课,用化整为零.重点突破的方式解决了教学的重.难点,为我们的 ...
- 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化
js基础知识中的作用域和闭包 一.作用域 1.作用域.自由变量简介 (1)作用域定义 (2)作用域实例演示 (3)自由变量定义 (4)自由变量实例演示 2.作用域链简介 (1)作用域链定义 (2)作用 ...
- 微信在计算机基础中的辅助作用,基于微信课后辅导在计算机基础教学中应用.doc...
基于微信课后辅导在计算机基础教学中应用 基于微信课后辅导在计算机基础教学中应用 摘 要: 如今,计算机技术更新快与计算机教育资源少的矛盾,促使课后学习成为大学生获取知识的重要途径.课后辅导是大学生课后 ...
- SQL Server 查询处理中的各个阶段
SQL Server 查询处理中的各个阶段 SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管 ...
- 计算机任务驱动法教学应用,_任务驱动法_在计算机基础教学中的应用
"任务驱动法"在计算机基础教学中的应用 义乌工商职业技术学院计算机工程系 吕 君 [摘 要]"任务驱动法"是一种建立在建构主义教学理论基础上的教学方法,将任务驱 ...
- 计算机思维能力培养的核心是什么,【计算机基础论文】计算机基础教学中计算思维能力培养(共6714字)...
计算机基础教学中计算思维能力培养 摘要:自C9明确提出大学计算机基础教学的核心任务是培养学生计算思维能力后,计算思维能力培养日益受到重视.但从培养目标.培养方式.培养过程.培养效果来看,还存在诸多问题 ...
- 计算机基础知识在教学的应用,计算机基础知识中项目教学法的应用
摘要: 目前正处于信息爆炸的时代,计算机技术的普及范围在不断扩大,它对人们的生活.工作以及学习都产生较大的影响.在新课程改革的大背景下,计算机基础知识的传授十分重要,特别是在职高的计算机专业课上,能让 ...
最新文章
- 使用bitblt提高GDI+绘图的效率(转)
- ZOJ 1610 Count the Colors (线段树区间更新)
- 统计概率分布_概率统计中的重要分布
- 英特尔 620 显卡 驱动 七代cpu_英特尔的智能“整体厨房”
- java处理unicode_C# JavaScript Java 与 中文 unicode 处理
- Java集合之LinkedHashMap源码分析
- 剑指offer 面试题5—从尾到头打印链表
- 什么是mysql事物定义_MySQL中事务概念的简洁学习教程
- 从目标文件结构,加载、执行阶段,汇编角度来理解C程序内存分区
- RMAN数据库完全备份和恢复
- 淘宝618超级喵运会怎么玩?超级喵运会整体活动攻略来了
- 爱心的数学函数方程_求心形函数表达式~~~
- React | 受控组件(Controlled Component)与不受控组件(Uncontrolled Component)的区别
- TESLA M40折腾笔记
- 模仿“选择游戏角色的页面”
- 抽样技术--简单随机抽样
- SELinux策略语言--类型强制(编写TE规则)
- 白乔原创:图数据在线交互框架InteractiveGraph
- 如何看待 30 岁转行做程序员这件事
- SQL Server 发展简史
热门文章
- matlab中solve解方程,怎么用Matlab解方程?
- 钕铁硼产品磁性能相对检测原理与技术
- 育润多维发力慈善领域,勇抗企业公益大旗
- js编写计算圆周长和面积
- STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(1):Cortex-M3指令集概要
- Ubuntu下,grep的用法
- Hadoop数据完整性与CheckSum校验原理
- flutter 九宫格菜单_Flutter 仿微信/微博九宫格
- 中职学校计算机基础的重要性,自学能力论文,关于浅淡培养中职学生计算机自学能力的重要性和方法相关参考文献资料-免费论文范文...
- 【大数据存储技术】实验2:MongoDB数据库的部署和操作