Soot检测Android应用中Email地址

Soot简介

Soot是一个Java静态分析框架,它提供了四种中间(representation)表现用于分析与转换Java字节码.Soot既可以作为优化和检查class文件的工具也可以作为一个开发与优化Java字节码的框架。

使用Soot可以对Android应用进行静态分析,Android静态分析指APK不在运行的情况下,根据某些代码特征来分析应用具有哪些行为。

代码实现

工程依赖的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'
}

定义检查接口ICheck

/**
 * 应用检查接口
 * @author wzj
 * @create 2018-07-01 16:52
 **/
public interface IChecker
{
    void checker();
}

定义基础抽象类,封装公共方法,注意以下两点

  • initSootConfig方法是初始化Soot配置,主要有apk路径和Android SDK的platform文件夹路径
  • 因为有很多Android源码影响分析,定义了excludePackagesList列表,分析的时候,把这些包名过滤掉
import soot.PackManager;
import soot.Scene;
import soot.SootClass;
import soot.options.Options;

import java.util.ArrayList;
import java.util.List;

/**
 * 应用检查的基础类
 * @author wzj
 * @create 2018-07-01 16:35
 **/
public abstract class BasicChecker implements IChecker
{
    /**
     * 检查的时候,要排除的包名
     */
    protected static List<String> excludePackagesList = new ArrayList<String>();

    /**
     * apk路径
     */
    protected String apkPath = "H:\\JAVA\\Soot\\apk\\app-debug.apk";

    /**
     * android jar路径
     */
    protected String jarsPath = "D:\\AndroidSDK\\platforms";

    static
    {
        excludePackagesList.add("java.");
        excludePackagesList.add("android.");
        excludePackagesList.add("javax.");
        excludePackagesList.add("android.support.");
        excludePackagesList.add("sun.");
        excludePackagesList.add("com.google.");
    }

    /**
     * 初始化soot配置
     */
    private void initSootConfig()
    {
        Options.v().set_src_prec(Options.src_prec_apk);
        Options.v().set_output_format(Options.output_format_jimple);
        String androidJarPath = Scene.v().getAndroidJarPath(jarsPath, apkPath);

        List<String> pathList = new ArrayList<String>();
        pathList.add(apkPath);
        pathList.add(androidJarPath);

        Options.v().set_process_dir(pathList);
        Options.v().set_force_android_jar(androidJarPath);
        Options.v().set_keep_line_number(true);
        Options.v().set_process_multiple_dex(true);

        Options.v().set_wrong_staticness(Options.wrong_staticness_ignore);
        Options.v().set_exclude(excludePackagesList);

        Scene.v().loadNecessaryClasses();
        PackManager.v().runPacks();
    }

    /**
     * 是否是例外的包名
     * @param sootClass 当前的类
     * @return 检查结果
     */
    protected boolean isExcludeClass(SootClass sootClass)
    {
        if (sootClass.isPhantom())
        {
            return true;
        }

        String packageName = sootClass.getPackageName();
        for (String exclude : excludePackagesList)
        {
            if (packageName.startsWith(exclude))
            {
                return true;
            }
        }

        return false;
    }

    /**
     * 分析
     */
    public void analyze()
    {
        initSootConfig();
        checker();
    }
}

主要的分析类EmailSootChecker通过正则表达式进行匹配Email,正则表达式为:[\w-.]+@[\w-]+(.[\w_-]+)+

import com.nii.soot.core.BasicChecker;
import soot.Scene;
import soot.SootClass;
import soot.SootMethod;
import soot.ValueBox;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * @author wzj
 * @create 2018-07-01 16:02
 **/
public class EmailSootChecker extends BasicChecker
{
    /**
     * 匹配email正则表达式
     */
    private String emailReg = "[\\w-.]+@[\\w-]+(.[\\w_-]+)+";

    /**
     * 正则表达式
     */
    private Pattern emailPattern = Pattern.compile(emailReg);

    /**
     * 检查APK应用中的url
     */
    public void checker()
    {
        //遍历应用中的每一个类
        for (SootClass sootClass : Scene.v().getApplicationClasses())
        {
            if (isExcludeClass(sootClass))
            {
                continue;
            }

            //遍历类中的每一个方法
            for (SootMethod sootMethod : sootClass.getMethods())
            {
                if (!sootMethod.hasActiveBody())
                {
                    continue;
                }

                //遍历方法中的每一行,检查email
                List<ValueBox> useBoxes = sootMethod.getActiveBody().getUseBoxes();
                for (ValueBox valueBox : useBoxes)
                {
                    String content = valueBox.toString();
                    Matcher matcher = emailPattern.matcher(content);
                    if (!matcher.find())
                    {
                        continue;
                    }

                    System.out.println("*********************************************");
                    System.out.println(matcher.group());
                    System.out.println(sootClass.getName());
                    System.out.println(sootMethod.getSubSignature());
                }
            }
        }
    }

    public static void main(String[] args)
    {
        new EmailSootChecker().analyze();
    }
}

测试结果

自己写了个apk测试类,里面写入几个email,分析结果如下,当检测出包含url,会把当前的类名、包路径和方法显示出来


源码地址

https://github.com/HelloKittyNII/soot-android-static-analysis

猜你喜欢

转载自blog.csdn.net/u010889616/article/details/80876486