【茶余饭后-Frida hook 系统点位原理分析 --Native】此文章归类为:茶余饭后。
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) |
日志输出
日志级别
函数 | 功能 | 典型用途 |
__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 |
|
liblog android 日志系统接口
函数 | 功能 | 典型用途 |
dlsym(handle, "func") | 查找函数地址 | Hook 函数或调用库方法 |
dlsym(handle, "var") | 查找全局变量地址 | 修改库内部状态 |
函数 | 功能 | 典型用途 |
dlopen() | 打开共享库(.so 文件) | 插件化架构、动态扩展功能 |
dlsym() | 获取符号(函数/变量地址) | 调用库中的函数 |
dlclose() | 关闭共享库 | 释放资源 |
dlerror() | 获取错误信息 | 调试动态加载失败问题 |
动态加载
符号解析
libdl 动态加载共享库 实现插件化和热修复
函数 | 功能 | 典型用途 |
ceil() / floor() | 向上/向下取整 | 数据格式化 |
fabs() | 绝对值 | 数值比较 |
fmod() | 浮点数取余 | 周期性计算 |
函数 | 功能 | 典型用途 |
sin() / cos() / tan() | 三角函数 | 图形渲染、物理模拟 |
sqrt() | 平方根 | 距离计算 |
pow() | 幂运算 | 指数计算 |
log() / exp() | 对数/指数函数 | 科学计算 |
基础数学运算
浮点数处理
libm 数学运算库
函数 | 功能 | 典型用途 |
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 系统调用(直接操作文件描述符) | 低层文件操作 |
文件操作
内存管理
线程与进程
字符串操作
系统调用封装
libc 基础调用和C标准函数
核心Native库组成
库名 | 作用 |
libc(Bionic) | Android 的 C 标准库实现(基于 BSD 的 Bionic) |
libm | 数学运算库(如 sin()、cos()) |
libdl | 动态链接库加载(dlopen()、dlsym()) |
liblog | Android 日志系统接口(__android_log_print()) |
Native层与Java层交互
作用:
示例:
- Binder 是 Android 系统中实现进程通信(IPC)的核心机制,负责在不同进程之间高效,安全地传递数据和调用方法。 是Android 系统架构中链接应用层,框架层和系统服务的关键桥梁,广泛应用系统服务与应用程序之间的交互
- Java 层通过IBinder 调用SurfaceFlinger 服务
- Native 层通过BpBinder 直接与系统服务交互
- 作用:链接Java和Native 代码,实现双向调用
实现方式:
// C++ 示例
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_NativeUtils_getStringFromNative(JNIEnv* env, jclass /* clazz */) {
return env->NewStringUTF("Hello from C++");
}
通过 System.loadLibrary()
加载 .so
文件
通过 System.load()
加载 .so
文件
二者区别
- 加载流程图
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 库加载 |
Native 库加载
- Java 调用 Native :通过System.loadLibrary() 加载 .so ,并声明 native 方法
// Java 示例
public class NativeUtils {
static {
System.loadLibrary("native-lib"); // 加载 libnative-lib.so
}
public native static String getStringFromNative(); // 声明 Native 方法
}
Native 调用Java : 通过JNI 提供的函数(如 CallStaticVoidMethod())调用Java 方法。
JNI (Java Native Interface)
Binder 机制
更多【茶余饭后-Frida hook 系统点位原理分析 --Native】相关视频教程:www.yxfzedu.com