当前位置: 首页 > article >正文

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()


http://www.kler.cn/a/537452.html

相关文章:

  • Go 语言环境安装指南
  • 【DeepSeek论文精读】3. DeepSeekMoE:迈向混合专家语言模型的终极专业化
  • 采用idea中的HTTP Client插件测试
  • 力扣 239.滑动窗口最大值
  • BUU22 [护网杯 2018]easy_tornado 1
  • 瞬态分析中的时域分析与频域分析:原理、对比与应用指南
  • Linux内核数据结构之链表
  • Spring Boot 和Tomcat的关系
  • Oracle中TAF与SCANIP全面解析
  • Docker 容器 Elasticsearch 启动失败完整排查记录
  • 基于机器学习的DDoS检测系统实战
  • react-native fetch在具有http远程服务器后端的Android设备上抛出“Network request failed“错误
  • 基于Flask的医保数据可视化分析系统的设计与实现
  • day 40 复习makefile以及51单片机
  • 深度解析全钢陶瓷防静电地板在机房装修中应用较多的原因
  • vue-vite axios bug
  • 13.4 使用 LangChain Chat Model 实现专业级双语翻译
  • 大模型的主要漏洞探究
  • Netty初学五 客户端与服务端通信协议编解码
  • JUnit 5 条件测试注解详解
  • 论文阅读--LlaVA
  • python中的flask框架
  • C#中深度解析BinaryFormatter序列化生成的二进制文件
  • WebSocket connection failed 解决
  • 2024中国行政区划多边形矢量数据(含有十段线)仅供学习
  • 活动预告 |【Part 1】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁