Android四大组件

Android有四大基本组件:ActivityService服务、BroadcastReceiver广播接收器、Content Provider内容提供者

App如何获取权限

在manifest中申请

高版本安卓需要再次手动请求

从哪里读取指纹

prop读取 从android.os

抓包

路由 http直接拿

https去apk获取sslpining证书 或者frida hook提取证书

frida抓包ssl_read/write获取信息

证书通信指纹

防止中间人攻击

binder通信

Binder是安卓系统中与系统服务通信的方式,Binder通过一种称为Parcel的二进制数据包传递数据,比如KeyStore服务中的证书句柄就是序列化为Pracel后传递的

App启动流程

Launcher(桌面)发送启动请求

System Server 处理启动 Activity 的请求

AMS(ActivityManagerService)决定是否需要创建新进程

Zygote fork 进程 → 应用进程诞生

应用进程启动 ActivityThread

ActivityThread 与 AMS 通讯,完成 Activity 生命周期分发

Activity 创建并显示界面

点击图标 → Launcher 发 Intent → AMS 管理 → Zygote fork 新进程 → ActivityThread 启动 → Activity 生命周期 → 显示界面。

frida如何实现js客户端和native层状态切换

Frida 借助 Gum(Frida 的底层框架)、V8/QuickJS 引擎、消息循环和线程桥接机制,实现 JS 与 Native 的双向状态切换。

Native 层执行 hook,进入 JS 逻辑时,会通过 Bridge → JS runtime → 回调执行

Xposed框架原理

Xposed 是通过修改 Zygote,使所有 app 进程加载一个自己的框架代码,从而实现系统级的 Hook 能力。

Zygote 是 Android APP 进程的“母体进程”,负责预加载系统类和资源,并通过 fork() 快速生出所有新的应用进程,是 Android 启动机制的核心。

so加载流程

Zygote 启动 app → 创建进程

Runtime 加载 libart.so

调用 linker(动态链接器)

Linker 解析 so:

  • 解析 ELF header
  • 加载 segment 到内存
  • 解析依赖库
  • 重定位(relocation)
  • 解析 GOT/PLT
  • 调用 .init_array

最终 JNI_OnLoad → 注册 native 方法

so注入/防止注入/注入检测

常见 SO 注入方式:

  1. ptrace 注入 → 调用 remote process 的 dlopen
  2. LD_PRELOAD 注入(仅限可控进程)
  3. 修改 /proc/pid/mem
  4. zygisk / xposed 模块注入
  5. 内存 patch + 强行执行 shellcode

如何检测?

  • 检查 maps 是否出现可疑 so
  • 检查 linker namespace 是否被修改
  • 检查 Frida/Xposed 特征(symbol、hook 函数等)
  • 校验内存(如代码段 hash)
  • 检查 ptrace attach 状态(TracerPid)
  • 检测 jemalloc/malloc hook 被替换

如何防御?

  • 自校验函数、inline hook 检测
  • 对 native 关键函数做 inline 加固
  • 检测 GOT/PLT 是否被修改
  • 随机化函数位置(插入伪代码、控制流平坦化)
  • 重要逻辑放入 SGX/TEE(大厂在用)

ptrace注入

ptrace 注入(ptrace injection) 本质上是利用 ptrace 的“可修改进程内存”能力,在目标进程中 注入并执行你的代码

它是一类技术总称,不是单一动作。

常规流程(简化、非可操作步骤说明):

  • 让自己成为目标进程的 ptrace 调试者
  • 将一段内容写入目标进程内存
  • 修改目标寄存器,让它跳到指定位置执行

由于 ptrace 允许修改寄存器和内存,因此理论上可以让目标执行任意代码。

什么是 ptrace 注入(ptrace injection)
——适用于 Linux 的进程调试机制及其滥用方式的安全分析说明

ptrace 是 Linux 内核提供的一个系统调用,设计原意是为了:

• 调试进程(如 gdb、strace)
• 监控子进程执行
• 检查 / 修改寄存器与内存

“ptrace 注入”(ptrace injection)通常指:

攻击者(或安全研究者)利用 ptrace 监控/控制另一个进程的能力,通过修改目标进程的内存、寄存器、指令指针等方式,使其执行非原始代码路径,包括注入动态库、替换代码、劫持函数调用等行为。

换句话说:
它本质是“利用调试接口实现代码注入”。


核心能力
使用 ptrace 的进程(父进程)可以对被跟踪的进程(子进程)做:

• PTRACE_ATTACH —— 让目标进程进入 debug 状态
• PTRACE_PEEKDATA —— 读取目标进程内存
• PTRACE_POKEDATA —— 写入目标进程内存
• PTRACE_GETREGS / SETREGS —— 获取/修改寄存器
• PTRACE_CONT —— 让目标继续执行

通过这些原语,可以实现:

• 注入一段 shellcode(PoC 中通常仅做简单打印或 whoami)
• 劫持函数调用
• 注入并触发 dlopen 加载动态库
• 对目标进程做系统调用重写

在现实攻击中它可能用于内存注入或持久化;在防御研究中,它是常见的行为检测场景。

你可以从以下行为设计检测规则:

  1. 可疑进程尝试 PTRACE_ATTACH 未关联的进程
  2. ptrace 调用链后紧跟着
    • 写入内存(POKEDATA)
    • 寄存器修改
    • 手工构造系统调用指令
  3. 未授权程序调用 dlopen 或 mmap + mprotect 改写内存段
  4. 目标进程出现异常执行流或 PC 指针跳转异常
  5. 在 /proc/[pid]/status 中出现 TracerPid ≠ 0 且 tracer 不在允许列表

frida

Frida 的核心涉及三大组件:

  1. Injector(注入器)
    用于将 Frida 的核心组件 frida-gadget 或 frida-agent 注入目标进程。
    注入方式视平台不同:
    • Linux/macOS:ptrace + dlopen 注入
    • Windows:CreateRemoteThread + LoadLibrary
    • Android/iOS:LD_PRELOAD / 动态库注入

  2. Frida Agent(驻留在目标进程中的逻辑)
    一个轻量级的运行时,负责:
    • Hook 函数
    • 管理 JS 执行环境
    • 与 Frida Server / CLI 通信

  3. Frida Script(用户编写的 JavaScript 脚本)
    用于动态修改目标程序行为,如拦截 API:

    1
    2
    3
    4
    5
    Interceptor.attach(Module.findExportByName(null, "open"), {
    onEnter: function(args) {
    console.log("open called:", args[0].readCString());
    }
    });

    Frida 的本质 = 注入 + 插桩 + RPC 框架。

以下过程是防御研究中最重要的部分。

  1. 注入阶段(Injection)
    Frida 首先通过系统允许的方式进入目标进程,例如在 Linux 上:

• ptrace 使目标进程暂停
• 在目标进程内分配可写可执行内存(mmap)
• 写入 Frida agent
• 设置程序计数器使其执行 dlopen 加载 agent

这与许多调试器/EDR 的工作方式相同,因此是可检测点。

  1. 插桩阶段(Instrumentation)

Frida 使用 Gum(Frida 的底层库)实现:

• Inline Hook(在指令前插入跳转)
• PLT/GOT Hook
• 解析符号表 / 模块导出
• 修改执行流,使其跳转到 Frida 的处理函数

这使得你能够:

• 动态观察函数调用栈
• 修改函数参数/返回值
• 构造 PoC 时观察漏洞利用的行为

  1. JavaScript Runtime

Frida 内嵌 V8 / QuickJS(版本依赖),使用户可以:

• 动态编写脚本
• 即时 hook/unhook
• 与目标进程交互

这是它比 gdb、ptrace 更强大的地方。