自动反编译apk文件后,通过以下正则匹配以下特征,并生成result.txt文件
安全配置类:(((debuggable|allowBackup|exported)=\"true\")
WEBVIEW类:|(addJavascriptInterface|searchBoxJavaBridge)
SSL通信安全类:|(ALLOW_ALL_HOSTNAME_VERIFIER|AllowAllHostnameVerifier|X509Certificate)
外部存储类:|(getExternalStorageDirectory()
暴露的URL地址:|http[s]?://|
全局可读写的内部文件:SharedPreferences|
Intent scheme类:parseUri
在源代码44行,可根据android测试用例进一步完善。
P.s 附件生成jar和apktool.jar放同一文件夹即可。
import java.io.BufferedReader;
import java.io.BufferedWriter;import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class droidappauditter {
public static void main(String[] args) throws Exception {
if(args.length==0){
System.out.print("Usage:java -jar package.jar xxxxx.apk");
System.exit(0);
}
else{
Decompile(args[0]);
}
}
private static void Decompile(String apkname) throws Exception {
Process p=Runtime.getRuntime().exec("java -jar apktool.jar d "+apkname);
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
String s;
while((s=br.readLine())!=null){
System.out.println(s);
}
p.waitFor();
System.out.println("~~~~~~~~~~~~ STEP-2 Auditing~~~~~~~~~~~~");
String fn=apkname.replaceAll(".apk", "");
File file=new File(fn);
File file1=new File("result.txt");
if(file.exists() && file.isDirectory() && !file1.exists()){
Audit(fn);
file1.createNewFile();
}
}
private static void Audit(String fn) throws Exception {
File file=new File(fn);
if(file.isFile()){
BufferedReader br=new BufferedReader(new FileReader(file));
BufferedWriter bw=new BufferedWriter(new FileWriter("result.txt",true));
Pattern p=Pattern.compile("(((debuggable|allowBackup|exported)=\"true\")|(addJavascriptInterface|searchBoxJavaBridge)|(ALLOW_ALL_HOSTNAME_VERIFIER|AllowAllHostnameVerifier|X509Certificate)|(getExternalStorageDirectory()|http[s]?://|SharedPreferences|parseUri))");
String s;
while((s=br.readLine())!=null){
Matcher m=p.matcher(s);
if(m.find()){
bw.write(file.getAbsolutePath()+"\r\n"+s+"\r\n");
bw.flush();
}
}
br.close();bw.close();
}
else if(file.isDirectory()){
File[] file1=file.listFiles();
for(int i=0;i<file1.length;i++){
Audit(file1[i].toString());
}
}
}
}