Interprocedural distributive environment problem (IDE) & EPICC

Report
Interprocedural distributive
environment problem (IDE) &
EPICC &SOOT
Soot相关网址
Soot 文档
http://www.sable.mcgill.ca/soot/tutorial/index.html
Soot 命令行示例
http://www.bodden.de/2008/08/21/soot-command-line/
Soot eclipse插件
http://www.bodden.de/2008/08/30/soot-eclipse-plugin-tutorial/
Soot 中间过程数据流分析
http://www.bodden.de/2008/09/22/soot-intra/
Soot 自定义分析程序入口点
http://www.bodden.de/2012/07/26/soot-custom-entry-points/
使用Soot分析Android APP
http://www.bodden.de/2013/01/08/soot-android-instrumentation/
Soot


一个开源的、不断扩展的java分析工具,可
以分析(class;java;jimple)
实现了向前、向后、向前分支流分析
SOOT Android






支持对Android 中dex文件分析
Dex   Jimple
-android-jar [android platform path]
-process-dir [ apk path]
-outputformat […..]
其他参数见 Soot options 类


Options.v().set_src_prec(Options.src_prec_a
pk); 预处理加载apk中dex代码
Soot 需处理main函数,构造伪main函数
(Android)
设置soot参数
解析问题
利用问题结果进行
分析(难点)
加载必要的类
定义IFDS/IDE问题
难点
构造伪main
设置入口点
实现数据流分析要解决的问题






初始化流
数据流函数问题
DefaultIDETabulationProblem
getNormalEdgeFunction
getCallEdgeFunction
getReturnEdgeFunction
getCallToReturnEdgeFunction
Interprocedural distributive
environment problem (IDE)
程序表示
点:由一个环境environment表示(符号到值
的映射)
操作:有一个环境转换器来表示(distributive
environment transfer)
Data fact:D  L
Data fact 属于 Env( D, L)
G*=(N*, E*)
G*: G1,G2,……, Gx表示函数x的有向图,
Gmain表示main函数的有向图
每个图有唯一Sp,Ep
一个函数调用用两个节点表示Cs, Er
一个环境转换器 t:Env(D,L)  Env(D,L) ,作用
在边上面
一个IDE数据流问题,需要对有向超图中所有
的边都分配一个环境转换器,由环境转换器
对边进行解释,以期获得从开始点(source)
到目标点(target)的结果





IDE Problem = (G*,D,L,M)
G* 有向超图
D 变量(符号)集合
L 格(值域)
E*(Env(D,L)  Env(D,L) ), 对超图中所有
的边分配一个环境转换器
Epicc
基本参数设置
见options类
对apk中所有的类都构造一
个伪main函数
将所有类都作为入口点加入soot,自动
构造CFG
寻找真的有
Intent类选为
入口点
只有有Intent对象的类
才是要分析的类,选
为入口点
重新设置入口点类
Soot执行分析
构造tranformer,
IDEProblem,解
析器,问题求解
定义
IDE问题流函数(环境转换器)




getNormalFlowFunction
getCallFlowFunction
getReturnFlowFunction
getCallToReturnFlowFunction
只做了
componentName,
Intentfilter,Intent,
Boudle的转换模型
Contentprovide 预留,
但未做
想法
可否根据EPICC结果,在startactivity,
startService等函数地方进行代码替换,这样
可以在一个main函数中把Android的所有组件
都连接起来,可以很直接的获得全局的数据
流路径为静态分析提供帮助。
如:if() activity1()
else() activity2()
InvokeExpr invokeExpr = stmt.getInvokeExpr();
if(invokeExpr.getMethod().getName().equals("onDraw"))
{ Local tmpRef = addTmpRef(b); Local tmpString =
addTmpString(b); // insert "tmpRef =
java.lang.System.out;"
units.insertBefore(Jimple.v().newAssignStmt( tmpRef,
Jimple.v().newStaticFieldRef( Scene.v().getField("").mak
eRef())), u); // insert "tmpLong = 'HELLO';"
units.insertBefore(Jimple.v().newAssignStmt(tmpString,
StringConstant.v("HELLO")), u); // insert
"tmpRef.println(tmpString);" SootMethod toCall =
Scene.v().getSootClass("java.io.PrintStream").getMetho
d("void println(java.lang.String)");
units.insertBefore(Jimple.v().newInvokeStmt( Jimple.v().
newVirtualInvokeExpr(tmpRef, toCall.makeRef(),
tmpString)), u); //check that we did not mess up the
Jimple b.validate(); }

similar documents