Android八股
Android四大组件
Android有四大基本组件:Activity、Service服务、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 注入方式:
- ptrace 注入 → 调用 remote process 的 dlopen
- LD_PRELOAD 注入(仅限可控进程)
- 修改 /proc/pid/mem
- zygisk / xposed 模块注入
- 内存 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 加载动态库
• 对目标进程做系统调用重写
在现实攻击中它可能用于内存注入或持久化;在防御研究中,它是常见的行为检测场景。
你可以从以下行为设计检测规则:
- 可疑进程尝试 PTRACE_ATTACH 未关联的进程
- ptrace 调用链后紧跟着
• 写入内存(POKEDATA)
• 寄存器修改
• 手工构造系统调用指令 - 未授权程序调用 dlopen 或 mmap + mprotect 改写内存段
- 目标进程出现异常执行流或 PC 指针跳转异常
- 在 /proc/[pid]/status 中出现 TracerPid ≠ 0 且 tracer 不在允许列表
frida
Frida 的核心涉及三大组件:
Injector(注入器)
用于将 Frida 的核心组件 frida-gadget 或 frida-agent 注入目标进程。
注入方式视平台不同:
• Linux/macOS:ptrace + dlopen 注入
• Windows:CreateRemoteThread + LoadLibrary
• Android/iOS:LD_PRELOAD / 动态库注入Frida Agent(驻留在目标进程中的逻辑)
一个轻量级的运行时,负责:
• Hook 函数
• 管理 JS 执行环境
• 与 Frida Server / CLI 通信Frida Script(用户编写的 JavaScript 脚本)
用于动态修改目标程序行为,如拦截 API:1
2
3
4
5Interceptor.attach(Module.findExportByName(null, "open"), {
onEnter: function(args) {
console.log("open called:", args[0].readCString());
}
});Frida 的本质 = 注入 + 插桩 + RPC 框架。
以下过程是防御研究中最重要的部分。
- 注入阶段(Injection)
Frida 首先通过系统允许的方式进入目标进程,例如在 Linux 上:
• ptrace 使目标进程暂停
• 在目标进程内分配可写可执行内存(mmap)
• 写入 Frida agent
• 设置程序计数器使其执行 dlopen 加载 agent
这与许多调试器/EDR 的工作方式相同,因此是可检测点。
- 插桩阶段(Instrumentation)
Frida 使用 Gum(Frida 的底层库)实现:
• Inline Hook(在指令前插入跳转)
• PLT/GOT Hook
• 解析符号表 / 模块导出
• 修改执行流,使其跳转到 Frida 的处理函数
这使得你能够:
• 动态观察函数调用栈
• 修改函数参数/返回值
• 构造 PoC 时观察漏洞利用的行为
- JavaScript Runtime
Frida 内嵌 V8 / QuickJS(版本依赖),使用户可以:
• 动态编写脚本
• 即时 hook/unhook
• 与目标进程交互
这是它比 gdb、ptrace 更强大的地方。