Frida hook 系统点位原理分析---Native
Native层 是Android 系统架构中直接运行在操作系统上的本地代码层,主要由C/C++ 编写的底层库和组件组成。它是Android 应用框架和硬件之间的桥梁,负责处理高性能任务,硬件交互以及系统级操作。[*]Native 层的定义
[*]Native (原生):
[*]指直接编译为机器码的代码,不依赖虚拟机 (如 Java的Dalvik/ART 虚拟机),而是直接在CPU上运行
[*]在Android 中:
[*]Native 层包含系统核心库,硬件抽象层(HAL), 驱动,以及部分系统服务, 通常以 .so 文件(共享库)
[*]Native 层的核心作用
[*]高性能计算
[*]适合场景: 需要直接操作内存或CPU 的高性能任务(如游戏引擎,图像处理,音视频编解码)
[*]优势:
[*]接近硬件: 绕过Java虚拟机的中间层,减少性能损耗
[*]内存控制: 直接管理内存分配和释放
[*]硬件交互
[*]访问硬件资源: 通过系统调用直接操作硬件 (如摄像头,传感器,蓝牙模块)
[*]示例:
[*]相机预览: 通过libcamera_client.so 调用摄像头驱动
[*]音频播放: 通过libaudioclient.so 与音频硬件通信
[*]系统服务实现
[*]核心系统功能:Android 的关键服务(如 SurfaceFlinger, Zygote)均基于Native层实现
[*]示例:
[*]SurfaceFlinger:负责图形合成与显示 (C++实现)
[*]Zygote: 进程孵化器,通过app_process启动应用进程
[*]安全与反调试
[*]反逆向技术:通过Native 代码实现加密,反调试(如检测frida , ptrace)
[*]示例:
[*]加壳App 的解密逻辑常放在Native层 (如 libxloader.so)
[*]检测调试器: 通过ptrace(PTRACE_TRACEME) 防止附加调试
[*]Native 层技术组成
[*]核心Native库组成
库名作用
libc(Bionic)Android 的 C 标准库实现(基于 BSD 的 Bionic)
libm数学运算库(如 sin()、cos())
libdl动态链接库加载(dlopen()、dlsym())
liblogAndroid 日志系统接口(__android_log_print())
[*]libc 基础调用和C标准函数
[*]文件操作
函数功能典型用途
fopen()打开文件读写文件
fread() / fwrite()读取/写入文件数据文件内容处理
fclose()关闭文件释放文件资源
open() / read() / write()Linux 系统调用(直接操作文件描述符)低层文件操作
[*]内存管理
函数功能典型用途
malloc() / free()动态分配/释放内存管理堆内存
memcpy() / memset()内存拷贝/填充数据操作
mmap() / munmap()内存映射(如共享内存)高效内存访问
[*]线程与进程
函数功能典型用途
fork() / execve()创建子进程/替换进程映像启动新进程
pthread_create()创建线程多线程并发
pthread_mutex_lock()线程互斥锁线程同步
[*]字符串操作
函数功能典型用途
strcpy() / strlen()字符串拷贝/长度字符串处理
strcat() / strcmp()字符串拼接/比较数据验证
[*]系统调用封装
函数功能典型用途
getpid()获取当前进程 PID进程标识
access()检查文件权限安全性验证
[*]libm 数学运算库
[*]基础数学运算
函数功能典型用途
sin() / cos() / tan()三角函数图形渲染、物理模拟
sqrt()平方根距离计算
pow()幂运算指数计算
log() / exp()对数/指数函数科学计算
[*]浮点数处理
函数功能典型用途
ceil() / floor()向上/向下取整数据格式化
fabs()绝对值数值比较
fmod()浮点数取余周期性计算
[*]libdl 动态加载共享库 实现插件化和热修复
[*]动态加载
函数功能典型用途
dlopen()打开共享库(.so 文件)插件化架构、动态扩展功能
dlsym()获取符号(函数/变量地址)调用库中的函数
dlclose()关闭共享库释放资源
dlerror()获取错误信息调试动态加载失败问题
[*]符号解析
函数功能典型用途
dlsym(handle, "func")查找函数地址Hook 函数或调用库方法
dlsym(handle, "var")查找全局变量地址修改库内部状态
[*]liblog android 日志系统接口
[*]日志输出
函数功能典型用途
__android_log_print(priority, tag, format, ...)按优先级输出日志调试 Native 层逻辑
__android_log_write(priority, tag, text)直接写入日志字符串简单日志记录
[*]日志级别
优先级宏定义用途
ANDROID_LOG_VERBOSEVLOG详细调试信息
ANDROID_LOG_DEBUGDLOG开发阶段调试
ANDROID_LOG_INFOILOG运行时状态
ANDROID_LOG_WARNWLOG警告信息
ANDROID_LOG_ERRORELOG错误处理
ANDROID_LOG_FATALFLOG
[*]Android 系统 Native 库
库名作用
libandroid_runtime.soAndroid Framework 核心库(如 ActivityThread)
libui.so图形系统基础(如 Surface、WindowManager)
libEGL.so / libGLESv2.soOpenGL ES 接口(图形渲染)
libmedia.so音视频框架(如 MediaPlayer、Camera)
[*]Native层与Java层交互
[*]JNI (Java Native Interface)
[*]作用:链接Java和Native 代码,实现双向调用
[*]实现方式:
[*]Native 库加载
[*]通过 System.loadLibrary() 加载 .so 文件
[*]加载流程图
Java/Kotlin 调用 System.loadLibrary() ↓ClassLoader 查找 .so 文件路径 ↓调用 dlopen() 加载 .so ↓调用 JNI_OnLoad() ↓注册 Native 方法(静态或动态) ↓Java 调用 Native 方法 ↓通过 JNI 调用 C/C++ 函数
[*]通过 System.load() 加载 .so 文件
[*]加载流程图
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.so"},{"type":"text","style":{"font":"9pt/1.5 MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, \"Helvetica Neue\", Tahoma, \"PingFang SC\", \"Microsoft Yahei\", Arial, \"Hiragino Sans GB\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"","foreColor":"#1f2329"},"text":")"}]" style="white-space-collapse: preserve; border-width: 0.5pt; border-color: rgb(222, 224, 227) rgb(229, 231, 235) rgb(229, 231, 235); font-size: 9pt; vertical-align: middle; word-break: break-word; background-color: rgb(255, 242, 88); color: rgb(31, 35, 41);">自动查找(lib/<abi>/lib<name>.so)
架构适配需手动处理自动匹配设备 ABI
安全性更灵活但风险高更安全,推荐使用
适用场景动态加载、加密库、网络下载等标准 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 方法。
// C++ 示例extern "C" JNIEXPORT jstring JNICALLJava_com_example_NativeUtils_getStringFromNative(JNIEnv* env, jclass /* clazz */) { return env->NewStringUTF("Hello from C++");}
[*]Binder 机制
[*]作用:
[*]Binder 是 Android 系统中实现进程通信(IPC)的核心机制,负责在不同进程之间高效,安全地传递数据和调用方法。 是Android 系统架构中链接应用层,框架层和系统服务的关键桥梁,广泛应用系统服务与应用程序之间的交互
[*]示例:
[*]Java 层通过IBinder 调用SurfaceFlinger 服务
[*]Native 层通过BpBinder 直接与系统服务交互
感谢分享 好吧,这个很基础 基础,很详细
页:
[1]