系统框架层native hook

  • libc函数符号hook
  • libc函数参数、返回值打印和替换
  • 主动调用libc读写文件
  • hook linker dlopen
  • frida-trace
  1. 引入例子,先hook pthread这个libc函数,流程个人理解是,先看函数是否导出,如果导出可以直接使用frida api获得函数地址,至于是否导出,objection安排上,没导出,那就直接枚举so的所有符号,枚举出名字和地址,然后直接attach,还是hook,attach使用于只改变参数和返回值,hook的话,类似重载函数。

function begin()
{
Java.perform(function(){
Java.choose(“com.example.demoso1.MainActivity”,{
onMatch:function(instance)
{
console.log(“Found instance”);
instance.init();
},onComplete:function(){
console.log(“Search complete!”);
}
})
})
}
function hook_pthread()
{

var pthread_create_addr=Module.findExportByName(“libc.so”,”pthread_create”);
console.log(“pthread_create_addr:”,pthread_create_addr);
var time_addr=Module.findExportByName(“libc.so”,”time”);
Interceptor.attach(pthread_create_addr,{
onEnter:function(args){
console.log(“args->”,args[0],args[1],args[2]);
var libnativebaseaddress=Module.findBaseAddress(“libnative-lib.so”);
if(libnativebaseaddress!=null)
{
console.log(“libnativebaseaddress->”,libnativebaseaddress);
var detect_frida_loop_addr=args[2]-libnativebaseaddress;
console.log(“detect_frida_loop offset is->”,detect_frida_loop_addr);
if(args[2]-libnativebaseaddress==64944)
{
args[2]=time_addr;
}
}
},onLeave:function(retval)
{

}
})

}
function replace_pthread()
{
var pthread_create_addr=Module.findExportByName(“libc.so”,”pthread_create”);
console.log(“pthread_create_addr->”,pthread_create_addr);
var pthread_create=new NativeFunction(pthread_create_addr,”int”,[“pointer”,”pointer”,”pointer”,”pointer”]);
Interceptor.replace(pthread_create_addr,new NativeCallback(function(parg1,parg2,parg3,parg4){
console.log(parg1,parg2,parg3,parg4);
var libnativebaseaddress=Module.findBaseAddress(“libnative-lib.so”);
if(libnativebaseaddress!=null)
{
console.log(“libnativebaseaddress->”,libnativebaseaddress);
if(parg3-libnativebaseaddress==64944)
{

return null;
}
}
return pthread_create(parg1,parg2,parg3,parg4);
},”int”,[“pointer”,”pointer”,”pointer”,”pointer”])
)
}

setImmediate(replace_pthread);

  1. 自己主动调用读写函数,并将导出函数的名字和地址,打印到内存卡中,主要是api的使用,熟悉了,问题不大的

function beginAnti(){
Java.perform(function(){
Java.choose(“com.example.demoso1.MainActivity”,{
onMatch:function(instance){
console.log(“Found instance!”);
instance.init();
},onComplete:function(){console.log(“Search complete!”)}
})
})
}

function hook_pthread(){

var pthread_create_addr = Module.findExportByName(“libc.so”, “pthread_create”);
var time_addr = Module.findExportByName(“libc.so”, “time”);
console.log(“pthread_create_addr=>”,pthread_create_addr)

Interceptor.attach(pthread_create_addr,{
onEnter:function(args){
console.log(“args=>”,args[0],args[1],args[2],args[4])
var libnativebaseaddress = Module.findBaseAddress(“libnative-lib.so”)
if(libnativebaseaddress!=null){
console.log(“libnativebaseaddress=>”,libnativebaseaddress);
//var detect_frida_loop_addr = args[2]-libnativebaseaddress;
//console.log(“detect_frida_loop offset is =>”,detect_frida_loop_addr)
if(args[2]-libnativebaseaddress == 64900){
console.log(“found anti frida loop!,excute time_addr=>”,time_addr);
args[2]=time_addr;
}
}
},onLeave:function(retval){
console.log(“retval is =>”,retval)
}
})
}

function replace_pthread(){
var pthread_create_addr = Module.findExportByName(“libc.so”, “pthread_create”);
console.log(“pthread_create_addr=>”,pthread_create_addr)
var pthread_create = new NativeFunction(pthread_create_addr,”int”,[“pointer”,”pointer”,”pointer”,”pointer”])
Interceptor.replace(pthread_create_addr,
new NativeCallback(function(parg1,parg2,parg3,parg4){
console.log(parg1,parg2,parg3,parg4)
var libnativebaseaddress = Module.findBaseAddress(“libnative-lib.so”)
if(libnativebaseaddress!=null){
console.log(“libnativebaseaddress=>”,libnativebaseaddress);
if(parg3-libnativebaseaddress == 64900){
return null;
}
}
return pthread_create(parg1,parg2,parg3,parg4)
},”int”,[“pointer”,”pointer”,”pointer”,”pointer”]))
}

function writeSomething(path,contents){
var fopen_addr = Module.findExportByName(“libc.so”, “fopen”);
var fputs_addr = Module.findExportByName(“libc.so”, “fputs”);
var fclose_addr = Module.findExportByName(“libc.so”, “fclose”);

//console.log(“fopen=>”,fopen_addr,” fputs=>”,fputs_addr,” fclose=>”,fclose_addr);

var fopen = new NativeFunction(fopen_addr,”pointer”,[“pointer”,”pointer”])
var fputs = new NativeFunction(fputs_addr,”int”,[“pointer”,”pointer”])
var fclose = new NativeFunction(fclose_addr,”int”,[“pointer”])

console.log(path,contents)

var fileName = Memory.allocUtf8String(path);
var mode = Memory.allocUtf8String(“a+”);

var fp = fopen(fileName,mode);

var contentHello = Memory.allocUtf8String(contents);
var ret = fputs(contentHello,fp)

fclose(fp);
}

function EnumerateAllExports(){
/*

var packageName = null
Java.perform(function(){
packageName = Java.use(‘android.app.ActivityThread’).currentApplication().getApplicationContext().getPackageName();
console.log(“package name is :”,packageName)
})
if(!packageName){
console.log(“can`t get package name ,quitting .”)
return null;
}
*/

var modules = Process.enumerateModules();
//console.log(“Process.enumerateModules => “,JSON.stringify(modules))
for(var i=0;i<modules.length;i++){
var module = modules[i];
var module_name = modules[i].name;
//var exports = module.enumerateExports();
var exports = module.enumerateSymbols();
console.log(“module_name=>”,module_name,” module.enumerateExports = > “,JSON.stringify(exports))
for(var m =0; m<exports.length;m++){
console.log(“m=>”,m)
//writeSomething(“/sdcard/”+packageName+”/”+module_name+”.txt”, “type:”+exports[m].type+ ” name:”+ exports[m].name+” address:”+exports[m].address+”\n”)
writeSomething(“/sdcard/settings/”+module_name+”.txt”, “type:”+exports[m].type+ ” name:”+ exports[m].name+” address:”+exports[m].address+”\n”)
}

}
}

setImmediate(EnumerateAllExports)

 

 

 

点击关注,共同学习!
[安全狗的自我修养](https://mp.weixin.qq.com/s/E6Kp0fd7_I3VY5dOGtlD4w)

[github haidragon](https://github.com/haidragon)

https://github.com/haidragon

原文地址:http://www.cnblogs.com/haidragon/p/16879538.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性