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

frida 通过 loadLibrary0 跟踪 System.loadLibrary

static {System.loadLibrary("libxxx.so");
}

在 ndk 开发中,常见的实践是在 static 代码块里调用 loadLibrary 加载动态库。由于 apk 从 java 层开始启动,过早地 hook 原生代码会找不到函数。所以一种常见做法是在 loadLibrary 的 hook 回调里附加 Interceptor。

然而,System.loadLibrary 是一个 callerSensitive 的方法,其内部利用反射机制,从 JVM 的调用栈 callStack 获取 caller 的类。如果直接用 frida hook loadLibrary 会使用 system 的 classLoader,只查找 /system/lib/system/vendor/lib 的依赖。

需要再往里跟踪一层函数调用。AOSP 实现 loadLibrary 的代码在 libcore/ojluni/src/main/java/java/lang/System.java,该实现调用了 Runtime 的 loadLibrary0 函数,后者不是 callerSensitive 的,frida 可以 hook。

    @CallerSensitivepublic static void loadLibrary(String libname) {Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname);}// Runtime.javavoid loadLibrary0(Class<?> fromClass, String libname) {...

loadLibrary0 是一个泛型函数,这个 Class 不知道为啥会擦除成 ClassLoader。所以实际上是不需要 overload 规定重载的。我试了下能用,网上见过继续跟踪两次调用,hook nativeLoad 函数的做法(jamie793)。

但是我是真搞不懂为啥泛型擦除成 classLoader……不管是 java 还是 android,static 代码块的调用栈都没有 classloader。安卓的调用栈如下

dalvik.system.VMStack
java.lang.Thread
com.example.illintentions.MainActivity <----
java.lang.Class
android.app.AppComponentFactory
androidx.core.app.CoreComponentFactory
android.app.Instrumentation
android.app.ActivityThread
android.app.ActivityThread
android.app.servertransaction.LaunchActivityItem
android.app.servertransaction.TransactionExecutor
android.app.servertransaction.TransactionExecutor
android.app.ActivityThread$H
android.os.Handler
android.os.Looper
android.app.ActivityThread
java.lang.reflect.Method
com.android.internal.os.RuntimeInit$MethodAndArgsCaller
com.android.internal.os.ZygoteInit
http://www.lryc.cn/news/532315.html

相关文章:

  • 【2025最新计算机毕业设计】基于SSM的智能停车场管理系统【提供源码+答辩PPT+文档+项目部署】(高质量源码,可定制,提供文档,免费部署到本地)
  • 【含文档+PPT+源码】Python爬虫人口老龄化大数据分析平台的设计与实现
  • 文本生图的提示词prompt和参数如何设置(基于Animagine XL V3.1)
  • 快速提取Excel工作簿中所有工作表的名称?
  • 【紫光同创PG2L100H开发板】盘古676系列,盘古100Pro+开发板,MES2L676-100HP
  • Node.JS 版本管理工具 Fnm 安装及配置(Windows)
  • labview通过时间计数器来设定采集频率
  • 汇编JCC条件跳转指令记忆
  • HTML排版标签、语义化标签、块级和行内元素详解
  • 【回溯+剪枝】单词搜索,你能用递归解决吗?
  • 《深度揭秘LDA:开启人工智能降维与分类优化的大门》
  • Linux(CentOS)安装 MySQL
  • C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输
  • 面试题-SpringCloud的启动流程
  • MySQL基础知识
  • nas-群晖docker查询注册表失败解决办法(平替:使用SSH命令拉取ddns-go)
  • GSMA SGP.31 eSIM IoT 架构与需求笔记
  • sql版本序列号
  • vue2-nextTick
  • 【其他专题】如何在线将PNG转ICO图标
  • 2019_AutoInt
  • HAL库 Systick定时器 基于STM32F103EZT6 野火霸道,可做参考
  • 使用 Postman 进行 API 测试:从入门到精通
  • K8s 分布式存储后端(K8s Distributed Storage Backend)
  • 基于docker搭建Kafka集群,使用KRaft方式搭建,摒弃Zookeeper
  • Centos7 安装 RabbitMQ与Erlang
  • mybatis-plus的分页查询简单使用
  • 剑指 Offer II 014. 字符串中的变位词
  • 富唯智能复合机器人拓展工业新维度
  • 【大数据技术】搭建完全分布式高可用大数据集群(Scala+Spark)