-
-
[原创]Frida hook 系统点位原理分析 --Native
-
发表于: 2025-6-6 14:01 191
-
Native层 是Android 系统架构中直接运行在操作系统上的本地代码层,主要由C/C++ 编写的底层库和组件组成。它是Android 应用框架和硬件之间的桥梁,负责处理高性能任务,硬件交互以及系统级操作。
Native 层的定义
- Native 层包含系统核心库,硬件抽象层(HAL), 驱动,以及部分系统服务, 通常以 .so 文件(共享库)
- 指直接编译为机器码的代码,不依赖虚拟机 (如 Java的Dalvik/ART 虚拟机),而是直接在CPU上运行
Native (原生):
在Android 中:
Native 层的核心作用
- 反逆向技术:通过Native 代码实现加密,反调试(如检测frida , ptrace)
示例:
- 加壳App 的解密逻辑常放在Native层 (如 libxloader.so)
- 检测调试器: 通过ptrace(PTRACE_TRACEME) 防止附加调试
- 核心系统功能:Android 的关键服务(如 SurfaceFlinger, Zygote)均基于Native层实现
示例:
- SurfaceFlinger:负责图形合成与显示 (C++实现)
- Zygote: 进程孵化器,通过app_process启动应用进程
- 访问硬件资源: 通过系统调用直接操作硬件 (如摄像头,传感器,蓝牙模块)
示例:
- 相机预览: 通过libcamera_client.so 调用摄像头驱动
- 音频播放: 通过libaudioclient.so 与音频硬件通信
- 适合场景: 需要直接操作内存或CPU 的高性能任务(如游戏引擎,图像处理,音视频编解码)
优势:
- 接近硬件: 绕过Java虚拟机的中间层,减少性能损耗
- 内存控制: 直接管理内存分配和释放
高性能计算
硬件交互
系统服务实现
安全与反调试
Native 层技术组成
Android 系统 Native 库
库名 作用 libandroid_runtime.so Android Framework 核心库(如 ActivityThread) libui.so 图形系统基础(如 Surface、WindowManager) libEGL.so / libGLESv2.so OpenGL ES 接口(图形渲染) libmedia.so 音视频框架(如 MediaPlayer、Camera) 日志输出
日志级别
liblog android 日志系统接口
动态加载
符号解析
libdl 动态加载共享库 实现插件化和热修复
基础数学运算
浮点数处理
libm 数学运算库
文件操作
内存管理
线程与进程
字符串操作
系统调用封装
libc 基础调用和C标准函数
核心Native库组成
库名 作用 libc(Bionic) Android 的 C 标准库实现(基于 BSD 的 Bionic) libm 数学运算库(如 sin()、cos()) libdl 动态链接库加载(dlopen()、dlsym()) liblog Android 日志系统接口(__android_log_print())
函数 | 功能 | 典型用途 |
__android_log_print(priority, tag, format, ...) | 按优先级输出日志 | 调试 Native 层逻辑 |
__android_log_write(priority, tag, text) | 直接写入日志字符串 | 简单日志记录 |
优先级 | 宏定义 | 用途 |
ANDROID_LOG_VERBOSE | VLOG | 详细调试信息 |
ANDROID_LOG_DEBUG | DLOG | 开发阶段调试 |
ANDROID_LOG_INFO | ILOG | 运行时状态 |
ANDROID_LOG_WARN | WLOG | 警告信息 |
ANDROID_LOG_ERROR | ELOG | 错误处理 |
ANDROID_LOG_FATAL | FLOG |
函数 | 功能 | 典型用途 |
dlsym(handle, "func") | 查找函数地址 | Hook 函数或调用库方法 |
dlsym(handle, "var") | 查找全局变量地址 | 修改库内部状态 |
函数 | 功能 | 典型用途 |
dlopen() | 打开共享库(.so 文件) | 插件化架构、动态扩展功能 |
dlsym() | 获取符号(函数/变量地址) | 调用库中的函数 |
dlclose() | 关闭共享库 | 释放资源 |
dlerror() | 获取错误信息 | 调试动态加载失败问题 |
函数 | 功能 | 典型用途 |
ceil() / floor() | 向上/向下取整 | 数据格式化 |
fabs() | 绝对值 | 数值比较 |
fmod() | 浮点数取余 | 周期性计算 |
函数 | 功能 | 典型用途 |
sin() / cos() / tan() | 三角函数 | 图形渲染、物理模拟 |
sqrt() | 平方根 | 距离计算 |
pow() | 幂运算 | 指数计算 |
log() / exp() | 对数/指数函数 | 科学计算 |
函数 | 功能 | 典型用途 |
getpid() | 获取当前进程 PID | 进程标识 |
access() | 检查文件权限 | 安全性验证 |
函数 | 功能 | 典型用途 |
strcpy() / strlen() | 字符串拷贝/长度 | 字符串处理 |
strcat() / strcmp() | 字符串拼接/比较 | 数据验证 |
函数 | 功能 | 典型用途 |
fork() / execve() | 创建子进程/替换进程映像 | 启动新进程 |
pthread_create() | 创建线程 | 多线程并发 |
pthread_mutex_lock() | 线程互斥锁 | 线程同步 |
函数 | 功能 | 典型用途 |
malloc() / free() | 动态分配/释放内存 | 管理堆内存 |
memcpy() / memset() | 内存拷贝/填充 | 数据操作 |
mmap() / munmap() | 内存映射(如共享内存) | 高效内存访问 |
函数 | 功能 | 典型用途 |
fopen() | 打开文件 | 读写文件 |
fread() / fwrite() | 读取/写入文件数据 | 文件内容处理 |
fclose() | 关闭文件 | 释放文件资源 |
open() / read() / write() | Linux 系统调用(直接操作文件描述符) | 低层文件操作 |
Native层与Java层交互
作用:
示例:
- Binder 是 Android 系统中实现进程通信(IPC)的核心机制,负责在不同进程之间高效,安全地传递数据和调用方法。 是Android 系统架构中链接应用层,框架层和系统服务的关键桥梁,广泛应用系统服务与应用程序之间的交互
- Java 层通过IBinder 调用SurfaceFlinger 服务
- Native 层通过BpBinder 直接与系统服务交互
- 作用:链接Java和Native 代码,实现双向调用
实现方式:
通过
System.loadLibrary()
加载.so
文件通过
System.load()
加载.so
文件二者区别
- 加载流程图
加载流程图
Native 库加载
- Java 调用 Native :通过System.loadLibrary() 加载 .so ,并声明 native 方法
Native 调用Java : 通过JNI 提供的函数(如 CallStaticVoidMethod())调用Java 方法。
JNI (Java Native Interface)
Binder 机制
// C++ 示例 extern "C" JNIEXPORT jstring JNICALL Java_com_example_NativeUtils_getStringFromNative(JNIEnv* env, jclass /* clazz */) { return env->NewStringUTF("Hello from C++"); }
Java/Kotlin 调用 System.loadLibrary() ↓ ClassLoader 查找 .so 文件路径 ↓调用 dlopen() 加载 .so ↓ 调用 JNI_OnLoad() ↓ 注册 Native 方法(静态或动态) ↓ Java 调用 Native 方法 ↓ 通过 JNI 调用 C/C++ 函数
Java 调用 System.load("/path/to/liblibraryname.so") ↓ JVM 调用 Runtime.load0() ↓ JNI 层调用 JniInternal.cpp::LoadLibrary() ↓Native 层调用 dlopen() 加载 .so 文件 ↓ 调用 JNI_OnLoad() 注册 Native 方法
特性 | System.load() | System.loadLibrary() |
路径 | 绝对路径 | 自动查找(lib/<abi>/lib<name>.so) |
架构适配 | 需手动处理 | 自动匹配设备 ABI |
安全性 | 更灵活但风险高 | 更安全,推荐使用 |
适用场景 | 动态加载、加密库、网络下载等 | 标准 Native 库加载 |
// Java 示例 public class NativeUtils { static { System.loadLibrary("native-lib"); // 加载 libnative-lib.so } public native static String getStringFromNative(); // 声明 Native 方法 }
赞赏
他的文章
赞赏
雪币:
留言: