首页
社区
课程
招聘
[原创]Frida hook 系统点位原理分析 --Native
发表于: 2025-6-6 14:01 191

[原创]Frida hook 系统点位原理分析 --Native

2025-6-6 14:01
191

Native层 是Android 系统架构中直接运行在操作系统上的本地代码层,主要由C/C++ 编写的底层库和组件组成。它是Android 应用框架和硬件之间的桥梁,负责处理高性能任务,硬件交互以及系统级操作。

  1. Native 层的定义
    1. Native 层包含系统核心库,硬件抽象层(HAL), 驱动,以及部分系统服务, 通常以 .so 文件(共享库)
    2. 指直接编译为机器码的代码,不依赖虚拟机 (如 Java的Dalvik/ART 虚拟机),而是直接在CPU上运行
    3. Native (原生):

    4. 在Android 中:

    1. Native 层的核心作用
      1. 反逆向技术:通过Native 代码实现加密,反调试(如检测frida , ptrace)
      2. 示例:

      3. 加壳App 的解密逻辑常放在Native层 (如 libxloader.so)
      4. 检测调试器: 通过ptrace(PTRACE_TRACEME) 防止附加调试
      5. 核心系统功能:Android 的关键服务(如 SurfaceFlinger, Zygote)均基于Native层实现
      6. 示例:

      7. SurfaceFlinger:负责图形合成与显示 (C++实现)
      8. Zygote: 进程孵化器,通过app_process启动应用进程
      1. 访问硬件资源: 通过系统调用直接操作硬件 (如摄像头,传感器,蓝牙模块)
      2. 示例:

      3. 相机预览: 通过libcamera_client.so 调用摄像头驱动
      4. 音频播放: 通过libaudioclient.so 与音频硬件通信
      1. 适合场景: 需要直接操作内存或CPU 的高性能任务(如游戏引擎,图像处理,音视频编解码)
      2. 优势:

      3. 接近硬件: 绕过Java虚拟机的中间层,减少性能损耗
      4. 内存控制: 直接管理内存分配和释放
      1. 高性能计算

      2. 硬件交互

      3. 系统服务实现

      4. 安全与反调试

      1. Native 层技术组成
        1.   Android 系统 Native 库

          库名作用
          libandroid_runtime.soAndroid Framework 核心库(如 ActivityThread)
          libui.so图形系统基础(如 Surface、WindowManager)
          libEGL.so / libGLESv2.soOpenGL ES 接口(图形渲染)
          libmedia.so音视频框架(如 MediaPlayer、Camera)
        2. 日志输出

        3. 日志级别

        4. 函数功能典型用途
          __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
        1.   liblog android 日志系统接口

        2. 函数功能典型用途
          dlsym(handle, "func")查找函数地址Hook 函数或调用库方法
          dlsym(handle, "var")查找全局变量地址修改库内部状态
          函数功能典型用途
          dlopen()打开共享库(.so 文件)插件化架构、动态扩展功能
          dlsym()获取符号(函数/变量地址)调用库中的函数
          dlclose()关闭共享库释放资源
          dlerror()获取错误信息调试动态加载失败问题
        1. 动态加载

        2. 符号解析

        1.   libdl 动态加载共享库 实现插件化和热修复

        2. 函数功能典型用途
          ceil() / floor()向上/向下取整数据格式化
          fabs()绝对值数值比较
          fmod()浮点数取余周期性计算
          函数功能典型用途
          sin() / cos() / tan()三角函数图形渲染、物理模拟
          sqrt()平方根距离计算
          pow()幂运算指数计算
          log() / exp()对数/指数函数科学计算
        1. 基础数学运算

        2. 浮点数处理

        1.   libm 数学运算库

        2. 函数功能典型用途
          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 系统调用(直接操作文件描述符)低层文件操作
        1. 文件操作

        2. 内存管理

        3. 线程与进程

        4. 字符串操作

        5. 系统调用封装

        6.   libc 基础调用和C标准函数

        1.   核心Native库组成

          库名作用
          libc(Bionic)Android 的 C 标准库实现(基于 BSD 的 Bionic)
          libm数学运算库(如 sin()、cos())
          libdl动态链接库加载(dlopen()、dlsym())
          liblogAndroid 日志系统接口(__android_log_print())
        1. Native层与Java层交互
          1. 作用:

          2. 示例:

          3. Binder 是 Android 系统中实现进程通信(IPC)的核心机制,负责在不同进程之间高效,安全地传递数据和调用方法。 是Android 系统架构中链接应用层,框架层和系统服务的关键桥梁,广泛应用系统服务与应用程序之间的交互
          4. Java 层通过IBinder 调用SurfaceFlinger 服务
          5. Native 层通过BpBinder 直接与系统服务交互
          6. 作用:链接Java和Native 代码,实现双向调用
          7. 实现方式:

            // C++ 示例
            extern "C" JNIEXPORT jstring JNICALL
            Java_com_example_NativeUtils_getStringFromNative(JNIEnv* env, jclass /* clazz */) {
                return env->NewStringUTF("Hello from C++");
            }
          1. 通过 System.loadLibrary() 加载 .so 文件

          2. 通过 System.load() 加载 .so 文件

          3. 二者区别

          1. 加载流程图
          2. 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 方法
          1. 加载流程图

          2. 特性System.load()System.loadLibrary()
            路径绝对路径自动查找(lib/<abi>/lib<name>.so)
            架构适配需手动处理自动匹配设备 ABI
            安全性更灵活但风险高更安全,推荐使用
            适用场景动态加载、加密库、网络下载等标准 Native 库加载
          1. Native 库加载

          2. Java 调用 Native :通过System.loadLibrary() 加载 .so ,并声明 native 方法
          3. // Java 示例
            public class NativeUtils {
                static {
                    System.loadLibrary("native-lib"); // 加载 libnative-lib.so
                }
                public native static String getStringFromNative(); // 声明 Native 方法
            }
          4. Native 调用Java : 通过JNI 提供的函数(如 CallStaticVoidMethod())调用Java 方法。

          5. JNI (Java Native Interface)

          6. Binder 机制



          [培训]科锐逆向工程师培训第53期2025年7月8日开班!

          收藏
          免费 0
          支持
          分享
          最新回复 (0)
          游客
          登录 | 注册 方可回帖
          返回