function
Wrifile(dex_path,dex_buffer){
var
fd =
new
File(dex_path,
"wb"
);
if
(fd && fd !=
null
) {
fd.write(dex_buffer);
fd.flush();
fd.close();
console.log(
"导出文件:"
, dex_path);
}
}
function
hook_art(){
var
libart = Process.findModuleByName(
"libart.so"
);
var
symbols = libart.enumerateSymbols();
var
addr_classloaer=
null
;
for
(
var
i = 0; i < symbols.length; i++) {
var
name = symbols[i].name;
if
(name.indexOf(
"ClassLinker"
) >= 0 && name.indexOf(
"DefineClass"
) >= 0 && name.indexOf(
"Thread"
) >= 0 && name.indexOf(
"DexFile"
) >= 0 ) {
console.log(
"找到了classloader,打印一下呗"
);
console.log(name, symbols[i].address);
addr_classloaer =symbols[i].address;
}
}
var
dex_maps = {};
if
(addr_classloaer) {
Interceptor.attach(addr_classloaer, {
onEnter:
function
(args) {
var
dex_file = args[5];
var
base = ptr(dex_file).add(Process.pointerSize).readPointer();
var
size = ptr(dex_file).add(Process.pointerSize + Process.pointerSize).readUInt();
if
(dex_maps[base] == undefined) {
dex_maps[base] = size;
var
magic = ptr(base).readCString();
if
(magic.indexOf(
"dex"
) == 0) {
var
path =
"/sdcard/DCIM/"
;
var
dex_path = path + base.toString(16) +
"_"
+ size.toString(16) +
".dex"
;
var
dex_buffer = ptr(base).readByteArray(size);
Wrifile(dex_path,dex_buffer)
}
}
}, onLeave:
function
(retval) {
}
});
}
}
function
hook_dlopen() {
var
hooked =
false
;
var
dlname=
"dlopen"
;
Interceptor.attach(Module.findExportByName(
null
, dlname), {
onEnter:
function
(args) {
var
pathptr = args[0];
if
(pathptr !== undefined && pathptr !=
null
) {
var
path = ptr(pathptr).readCString();
if
(path.indexOf(
"libart.so"
) >= 0) {
this
.bb =
true
;
}
}
},
onLeave:
function
(retval) {
if
(
this
.bb& !hooked){
console.log(
"开始hook art"
)
hook_art();
hooked=
true
;
}
}
})
}
setImmediate(hook_dlopen);