//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, jclass obj, jstring packageName) {
//在这里作者考虑到了防止每次app启动的时候都会dump,因此保存了一个变量is_hook来记录,如果hook过了的话就会退出程序
static bool is_hook = false;
char *p = (char *) env->GetStringUTFChars(packageName, 0);
if (is_hook) {
__android_log_print(ANDROID_LOG_INFO, TAG, "hooked ignore");
return;
}
init_package_name(p);
env->ReleaseStringChars(packageName, (const jchar *) p);
//这里由于使用了第三方库,所以先执行第三方库的初始化操作,具体第三方库ÿ