hook so层实例流程
在so层去hook这个MD5函数的参数和响应值
按tab键跳转到图表界面,再按u键跳转到汇编代码页面,获取函数的偏移地址。
使用下面hook代码验证所so文件方法是否存在(文件不存在时换种hook方式,比如包名换成进程id)
function hook_method4() {
console.log('进入');
var so = Process.findModuleByName('libsscronet.so');
if (so !== null) {
console.log('so_base', so.base);
var methods = so.enumerateExports();
for (var i = 0; i < methods.length; i++) {
console.log(methods[i].name);
}
} else {
console.log('未找到名为 libsscronet.so 的模块');
}
}
// so_base 0x752e400000打印所有so文件
function hook_native() {
var modules = Process.enumerateModules();
for (var i in modules) {
var module = modules[i];
console.log(module.name);
if (module.name.indexOf("target.so") > -1) {
console.log(module.base);
}
}
}
hook_method4();
hook_native()
编写hook代码
function hook_fun() {
let soBaseAddr = Module.findBaseAddress('libwtf.so');
console.log(soBaseAddr)
console.log('进入')
//之前获取的偏移地址
let funcPtr = soBaseAddr.add(0x43834)
console.log(funcPtr)
Interceptor.attach(funcPtr, {
onEnter: function (args) {
console.log("进入函数1")
//打印第二个参数
console.log('onEnter value is ====>', args[1].readCString())
},//hook流程onEnter-原函数-onLeave
onLeave: function (retval) {
console.log("响应值为"+retval)
//修改值为0
// retval.replace(0);
},})
}
hook_fun()
通用hook hook so中NewStringUTF函数
NewStringUTF函数是在so层通过c或者c++代码进行运算后的结果,返回给java层,在c里面是一个char*也就是一个指针返回给java层调用,需要转换一下类型,就需要用到jni函数里的newStringutf
frida版本为frida16.6.8
模拟器:雷神
frida-server版本:frida-server-16.6.6-android-x86_64
hook条件很苛刻,同样frida和代码换到真机就不行
function hook_newstrUTF() {
var symbols = Process.getModuleByName("libart.so").enumerateSymbols();
var newStringUtf = null;
for (var i = 0; i < symbols.length; i++) {
const symbol = symbols[i];
if (symbol.name.indexOf("checkJNI") == -1 && symbol.name.indexOf("NewStringUTF") != -1) {
console.log(symbol.name, symbol.address);
newStringUtf = symbol.address;
}
}
Interceptor.attach(newStringUtf, {
onEnter: function (args) {
console.log('进入')
//打印线程信息
console.log(Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n') + '\n');
//观察这个参数打印的值
console.log("newStringUtf args", args[1].readCString());
}, onLeave: function (retval) {
console.log("newStringUtf retval", retval);
}
})
}
hook_newstrUTF()