PackerInfo.Type type = PackerInfo.find(lpparam);
if (type == null) {
return;
}
final String packageName = lpparam.packageName;
//这里主要是各个app只管解析各个app自己的进程的程序
if (lpparam.packageName.equals(packageName)) {
//首先在当前app的指定目录,创建好目录,以便于一会儿脱壳存放dex文件
String path = “/data/data/” + packageName + “/dump”;
File parent = new File(path);
if (!parent.exists() || !parent.isDirectory()) {
parent.mkdirs();
}
log(“sdk version:” + Build.VERSION.SDK_INT);
if (DeviceUtils.isOreo()) {
//api为27或27版本的执行下面一行,进行脱壳
OreoDump.init(lpparam);
} else {
//低版本api执行下面一行进行脱壳
LowSdkDump.init(lpparam,type);
}
}
}
}
已经加好注释,值得注意的就是,此处程序有分叉了,分别是 OreoDump.init()和LowSdkDump.init() 我们先看OreoDump.init方法
public class OreoDump {
//--------略---------
public static void init(final XC_LoadPackage.LoadPackageParam lpparam) {
Native.dump(lpparam.packageName);
}
}
跟着进入Native.dump(),
- 注:不会android ndk也没关系,可以继续往下看
Native hook
以下可以先粗略的说一下,主要就是进入了ndk层进行hook,然后进行dump 进入native.cpp
文件里面找到JNICALL Java_com_wrbug_dumpdex_Native_dump
方法。
由于切换到了c语言,所以我会帮大家删除一些代码的细枝末节,只看主干。
再次声明下,以下方法实在当android版本为26或27的时候,会默认进行Native层脱壳
JNIEXPORT void JNICALL Java_com_wrbug_dumpdex_Native_dump
(JNIEnv *env