Soot获取Android应用控制流图

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

猜你喜欢

转载自blog.csdn.net/u010889616/article/details/80878224
今日推荐