首页 > 其他分享 >学习笔记-libc框架层的Hook利用

学习笔记-libc框架层的Hook利用

时间:2022-11-11 09:22:05浏览次数:41  
标签:console addr libc create 笔记 Hook pthread var log

系统框架层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

标签:console,addr,libc,create,笔记,Hook,pthread,var,log
From: https://www.cnblogs.com/haidragon/p/16879538.html

相关文章

  • Vue3学习笔记(五)——路由,Router
    一、前端路由的概念与原理1.1.什么是路由路由(英文:router)就是对应关系。1.2.SPA与前端路由SPA指的是一个web网站只有唯一的一个HTML页面,所有组件的展示与切换都......
  • 方滨兴院士讲座笔记
    安全和技术是伴生,没有技术,就没有安全问题人工智能在安全领域的四种表现形态深度伪造:利用人工智能仿生,通过像人脸识别那样的检测,或者AI换脸智能防御:人工智能预测攻击后......
  • Head First Java 读书笔记
    第11章:异常处理如果你把有风险的程序代码包含在try/catch块中,那么编译器会放心很多。try/catch块会告诉编译器你确实知道所调用的方法会有风险,并且也已经准备好要处理......
  • 学习笔记 之 简单了解有关 CSS 那点事儿
    LZ-Says:调整心态,多读书,丰富内心,提升个人文化底蕴。前言前几天,初步了解了下HTML相关的知识点,在学习回顾时,还好,大部分都在,只是新增了一些其他内容,例如自适应等等。上手......
  • C语言学习笔记---sizeof关键字和strlen函数
    sizeof和strlen在C语言中常用来计算字符大小和长度,在应用中却有着本质的区别。 sizeof是C语言中的关键字,其作用是返回一个对象或类型所占的内存字节数。使用方式为:int......
  • MIT6.S081笔记:Lab Xv6 And Unix Utilities
    关于MIT6.S081这门课的前身是MIT著名的课程6.828,MIT的几位教授为了这门课曾专门开发了一个基于x86的教学用操作系统JOS,被众多名校作为自己的操统课程实验。但随......
  • 【学习笔记】AC自动机
    AC自动机其实我将近三个月前就准备写这个并且随笔都建好了,但是一直咕咕到现在才写。其实记忆力好的同学应该意识到这篇其实8月份已经发过了,这次只是更新了一下发布日期而......
  • 模块化笔记软件 Anytype 综合评测
    随着Notion在笔记软件赛道的快速崛起,获得了很多用户的喜欢。然而,Notion也存在部分缺点。对于中国大陆用户而言,使用Notion需要特殊网络。否则,有时候会登录很慢,或者分享/......
  • 模板和泛型编程 C++ primer笔记
    16.1定义模板重载多个相似的函数是麻烦的:比如重载能接受多个类型的compare。使用函数模板之后可以定义成这样:template<typenameT>intcompare(constT&v1,constT......
  • unix+编程艺术学习笔记13+复杂度:尽可能简单,但别简单过了头
    ==============================复杂度尽可能简单,但别简单过了头==============================触发了unix十几年混乱内战的几个核心东西,将......