function hook_dlopen() {
const funcName = "android_dlopen_ext";
const libc = Module.findBaseAddress("libc.so");
var funcPtr = Module.findExportByName(null, funcName);
if (funcPtr !== null && funcPtr !== undefined) {
console.log(`[*] Hooking ${funcName} at libc.so!0x${(funcPtr - libc.base).toString(16)}`);
Interceptor.attach(funcPtr, {
onEnter: function (args) {
this.pathPtr = args[0];
if (this.pathPtr !== null && this.pathPtr !== undefined) {
try {
var path = this.pathPtr.readCString();
console.log("\x1b[36m[dlopen] \x1b[0m" + path);
if (path.indexOf("libmsaoaidsec.so") !== -1) {
this.isTarget = true;
hook_system_property_get();
}
} catch (e) {
console.log("[!] Error reading path string in " + this.funcName);
}
}
}, onLeave: function (retval) {
}
});
} else {
console.log("[-] Warning: " + funcName + " not found in exports.");
}
}
function hook_JNI_OnLoad() {
let module = Process.findModuleByName("libmsaoaidsec.so")
Interceptor.attach(module.base.add(0x13A4C), {
onEnter(args) {
console.log("JNI_OnLoad")
}
})
}
function hook_pthread_create() {
var pthread_create_addr = Module.findExportByName("libc.so", "pthread_create");
console.log("pthread_create addr: ", pthread_create_addr);
Interceptor.attach(pthread_create_addr, {
onEnter: function (args) {
var thread_func_addr = args[2];
var module = Process.findModuleByAddress(thread_func_addr);
console.log(`pthread_create thread func: ${module.name}+0x${(thread_func_addr - module.base).toString(16)}`);
}, onLeave: function (retval) {
}
});
}
function nopFunc(addr) {
Memory.protect(addr, 4, 'rwx');
var writer = new Arm64Writer(addr);
writer.putRet();
writer.flush();
writer.dispose();
console.log("nop " + addr + " success");
}
function bypass_detect_func() {
var base = Module.findBaseAddress("libmsaoaidsec.so")
nopFunc(base.add(0x1c544));
nopFunc(base.add(0x1b8d4));
nopFunc(base.add(0x26e5c));
}
function hook_system_property_get() {
var system_property_get_addr = Module.findExportByName(null, "__system_property_get");
if (system_property_get_addr !== null && system_property_get_addr !== undefined) {
Interceptor.attach(system_property_get_addr, {
onEnter: function (args) {
var nameptr = args[0];
if (nameptr) {
var name = ptr(nameptr).readCString();
if (name.indexOf("ro.build.version.sdk") >= 0) {
console.log("Found ro.build.version.sdk, need to patch");
bypass_detect_func();
}
}
}
})
}
}
function main() {
hook_dlopen();
}
setImmediate(main);