欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Soot检测Android应用中Email地址

程序员文章站 2024-03-20 13:04:16
...

Soot简介

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

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

代码实现

工程依赖的jar包,依赖包下载地址:https://github.com/secure-software-engineering/FlowDroid/releases

Soot检测Android应用中Email地址

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-.]aaa@qq.com[\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-.]aaa@qq.com[\\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,会把当前的类名、包路径和方法显示出来

Soot检测Android应用中Email地址

源码地址

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