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
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,会把当前的类名、包路径和方法显示出来源码地址
https://github.com/HelloKittyNII/soot-android-static-analysis