Soot简介
Soot是一个Java静态分析框架,它提供了四种中间(representation)表现用于分析与转换Java字节码.Soot既可以作为优化和检查class文件的工具也可以作为一个开发与优化Java字节码的框架。
使用Soot可以对Android应用进行静态分析,Android静态分析指APK不在运行的情况下,根据某些代码特征来分析应用具有哪些行为。
Soot的升级版FlowDroid可以生成Android应用的控制流图,获取函数之间的调用关系,进行污点分析。这个后续文章再进行讲解。
代码实现
工程依赖的jar包,依赖包下载地址:https://github.com/secure-software-engineering/FlowDroid/releases
gradle依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5'
testCompile group: 'junit', name: 'junit', version: '4.11'
该示例代码,只是获取Android应用的控制流图,没有进行处理。
import soot.Scene;
import soot.jimple.infoflow.InfoflowConfiguration;
import soot.jimple.infoflow.android.InfoflowAndroidConfiguration;
import soot.jimple.infoflow.android.SetupApplication;
import soot.jimple.toolkits.callgraph.CallGraph;
/**
* 获取android应用控制流图
* @author wzj
* @create 2018-07-01 21:20
**/
public class AndroidFlowDroidGraph
{
/**
* apk路径
*/
private String apkPath = "H:\\JAVA\\Soot\\apk\\app-debug.apk";
/**
* android jar路径
*/
private String jarsPath = "D:\\AndroidSDK\\platforms";
/**
* 文件一定要有,可以为空
*/
private String androidCallbackPath = "H:\\JAVA\\Soot\\conf\\AndroidCallbacks.txt";
public static void main(String[] args)
{
//初始化soot配置
new AndroidFlowDroidGraph().initSootConfig();
CallGraph callGraph = Scene.v().getCallGraph();
System.out.println(callGraph);
}
private SetupApplication initSootConfig()
{
String androidJarPath = Scene.v().getAndroidJarPath(jarsPath, apkPath);
SetupApplication setupApplication = new SetupApplication(androidJarPath, apkPath);
InfoflowAndroidConfiguration config = setupApplication.getConfig();
config.setCallgraphAlgorithm(InfoflowConfiguration.CallgraphAlgorithm.SPARK);
setupApplication.setCallbackFile(androidCallbackPath);
//构建控制流图,比较耗时
setupApplication.constructCallgraph();
return setupApplication;
}
}
测试结果
会发现输出窗口打印了很多函数调用路径,以一个为例进行分析
$r1 = interfaceinvoke $r2.<java.util.List: java.lang.Object get(int)>($i0) in <com.wzj.fuzzer.adapter.AppInfoAdapter: java.lang.Object getItem(int)> ==> <java.util.ArrayList: java.lang.Object get(int)>
实际源代码为
@Override
public Object getItem(int position)
{
return appInfoList.get(position);
}
源码地址
https://github.com/HelloKittyNII/soot-android-static-analysis