首页
社区
课程
招聘
[原创]Android 逆向与安全分析:从入门到专家的完全指南(应用篇 + 游戏篇)
发表于: 12小时前 371

[原创]Android 逆向与安全分析:从入门到专家的完全指南(应用篇 + 游戏篇)

12小时前
371

Windows逆向与安全分析:从入门到专家的体系化学习指南
Android 与 Windows 安全技术体系对照:开发、逆向、保护

摘要:Android 安全分析的对象已从“Java + DEX + ARM64”的线性模型,演变为一个由托管代码、声明式 UI 编译产物、跨平台运行时、端侧 AI 资产、硬件缓解机制和商业化反作弊栈共同构成的异构体系。本文以“信息丢弃链”为方法论主轴,沿开发侧的安全架构决策、逆向侧的逐层穿透、保护侧的运行时反制三条线索展开,在每一条线索上同时覆盖应用线与游戏线,并在第十部分将 Android 与 Windows 置于同一分析框架下逐层对照。核心论证围绕四个结构性事实:Kotlin 协程将控制流重构为 label 驱动的状态机,Compose 将 UI 逻辑编译为 $composer 参数化的字节码,传统的“找方法 → 下断点”路径在语义层面已经失效;Binder 的调用方身份由内核在 binder_transaction 中权威写入,Binder.execTransact 是入站 Java 调用的唯一汇聚点,但内核级 Hook 正在绕过整个用户态检测面;游戏数值的运行时可见性使内存修改在原理上不可根除,保护的重心必须从“不可被找到”转向“可被检测的后果”与服务端权威;AI 辅助逆向正在将保护技术的成本函数从“人类知识积累”重新定价为“token 预算与工具编排精度”。全文附代码示例、AOSP 源码阅读路径、工具官方地址与可引用的技术文献。

第一部分:完整学习路径规划
1.1 应用线学习路径
 1.1.1 入门层:语言、DEX/Smali、ELF、组件模型与基础工具
 1.1.2 核心层:ART 三种状态、协程状态机、Compose 编译模型、Binder、Flutter AOT
 1.1.3 高级层:加固分层、RASP、端侧 AI 模型、PAC/BTI
 1.1.4 研究层:协程还原自动化、Compose 补丁生效点、Flutter 工具链质量、MCP 可重复性
1.2 游戏线学习路径
 1.2.1 入门层:IL2CPP/Mono、内存可见性、Il2CppDumper、GameGuardian
 1.2.2 核心层:元数据内存定位、协议还原、变速/改时间攻击面
 1.2.3 高级层:SO+metadata 协同、数值反作弊工程、服务端权威、内核级对抗
 1.2.4 研究层:服务端权威迁移经济学、内核威胁模型、AI 外挂攻防

第二部分:完整工具生态大全
2.1 应用开发工具
2.2 应用逆向工具
2.3 应用保护工具
2.4 游戏开发工具
2.5 游戏逆向工具
2.6 游戏保护工具

第三部分:编程技能完全发展路径
3.1 应用开发技能
3.2 应用逆向技能
3.3 应用保护技能
3.4 游戏开发技能
3.5 游戏逆向技能
3.6 游戏保护技能

第四部分:完整实战项目路线图
4.1 应用项目
4.2 游戏项目

第五部分:主要厂商安全攻防技术详解
5.1 腾讯 ACE
5.2 网易易盾
5.3 FairGuard
5.4 内核级对抗与跨端威胁

第六部分:Android 源码阅读指南
6.1 源码树结构与阅读环境
6.2 系统服务调用链追踪
6.3 跨 JNI 层追踪
6.4 Native 层源码阅读策略
6.5 Binder 全链路
6.6 检索工具与代码导航方法论

第七部分:社区资源与学习平台

第八部分:AI 对应用与游戏安全的影响
8.1 对应用开发的影响
8.2 对应用逆向的影响
8.3 对应用保护的影响
8.4 对游戏开发、逆向与保护的影响

第九部分:近十年逆向技术演变与未来展望
9.1 执行模型:Dalvik → ART → 混合执行
9.2 加固壳:从 DEX 落地到虚机源码保护
9.3 脱壳技术的结构性失效
9.4 VMP 去虚拟化的方法论迁移
9.5 Native 缓解机制的代际升级
9.6 AI 带来的范式断裂
9.7 未来展望:三条主线

结语

参考文献

知识准备

工具掌握

核心技能

阅读 Smali 并定位校验分支;Frida 打印关键方法入参和返回值;手工完成 Smali 级补丁:修改 if-eqz/if-nez,重打包并签名;提取 APK 的包名、权限、组件、签名信息、可疑 API 列表。

实战产出

10–15 个 CrackMe APK,覆盖 Java 层校验、简单 Native 校验、资源加密校验;APK 基础信息分析脚本;个人分析笔记模板。

知识准备

ART 执行模型是这一层最重要的结构性知识。一份 classes.dex 安装到 ART 系统后,其中的每个方法在任意时刻处于三种状态之一——直译执行、JIT 编译后的机器码、AOT 编译后的机器码。ART 中每个 Java 方法对应一个 ArtMethod,其 entry_point_from_quick_compiled_code_ 指向当前生效的执行入口。这个指针不是静态常量:ClassLinker::LinkCode、Instrumentation::InitializeMethodsCode、JIT 完成和 deoptimize 都可能修改它。entrypoint 的取值编码了方法的状态:

art_quick_resolution_trampoline 状态解释了为什么方法的首次调用与后续调用行为不同:首次调用解析并重写 entrypoint,之后才分发。这也解释了 frida -f(spawn)和 frida -n(attach)对同一应用可能产生不同结果的原因。LSPlant/LSPosed 的 Hook 机制是备份原始 ArtMethod,将入口指针改写为代理方法,并执行 inline deoptimization,迫使已编译的调用方放弃缓存的绝对地址,重新经过 ArtMethod 入口。如果方法已被 AOT 编译且调用方直接跳转到机器码,仅修改入口可能不生效;deoptimization 的作用就是将调用重新拉回 ArtMethod 的分发路径。ART hook 的本质就是拿到目标方法的 ArtMethod,把它的 entry_point_from_quick_compiled_code_ 改指向自己的代码,或者改 access_flags 让它走直译再拦截。

Kotlin 协程状态机:suspend 函数编译后生成 ContinuationImpl 子类,invokeSuspend 以 label 字段上的 packed-switch 或 sparse-switch 组织原始函数体。挂起点通过 COROUTINE_SUSPENDED 分支识别。label 字段的每个取值对应一个挂起点之后的分支,0 表示首次执行,1 表示第一个挂起点恢复。符号位被设置的取值(Integer.MIN_VALUE)表示协程正在恢复执行,而非首次进入——这个“奇怪的”取值是协程恢复的标志。局部变量被提升为 Continuation 的字段,L$0、L$1 等保存的是挂起时刻需要跨恢复点存活的引用。还原方法是按 label 取值排序分支,每个分支的末尾是下一个挂起点的调用,据此重建原始执行顺序。

Jetpack Compose 编译模型:@Composable 函数被注入 $composer: Composer 和 $changed: Int。$composer 负责遍历 slot table、记录 UI 组边界、读取记忆化值并排队重组;$changed 是一个 3-bit 分块的位掩码,标记每个输入参数是否“脏”,使 Compose 在重组时可以跳过未变化的 composable 体。方法体包裹在 startRestartGroup(I)/endRestartGroup() 之间。UI 逻辑门控表现为基于状态读取的条件分支,而非可单独定位的监听器方法。

Binder IPC:IPCThreadState::executeCommand → BBinder::transact → JavaBBinder::onTransact → Binder.execTransact → AIDL Stub.onTransact。2026 年 2 月 LKML 的 Binder 身份补丁揭示了一个重要的实现细节:Binder 此前使用 task_euid(proc->tsk) 作为事务发送方 EUID,其中 proc->tsk 是打开 /dev/binder 的进程主线程。该补丁提议改用 current_euid()——即当前发起事务的任务的主观 EUID,而非打开 Binder 时主线程的客观 EUID。这意味着调用方身份在用户态不可伪造,但内核侧的语义选择会影响多线程进程中身份绑定的精确性。sender_euid 在 binder_open() 时与 struct cred 绑定,事务传递时从该保存的 cred 读取,而不是从当前 task 查找。

Flutter/Dart AOT:libapp.so 包含 ARM64 机器码和 Dart 对象池。Java 层通常只是启动壳,传统 jadx 路径失效。

工具掌握

核心技能与产出

识别方法执行状态并选择正确的 Hook 锚点;还原协程状态机(Smali 前后对照,正确处理 Integer.MIN_VALUE 恢复标志);定位 Compose 字节码中的逻辑门控分支并翻转;Hook Binder.execTransact 记录入站调用及调用方 UID/PID;完成一个完整 App 的协议逆向。产出包括协程状态机还原报告、Compose 补丁样本与生效点分析、Binder 服务监控脚本、轻量加固样本的脱壳与 jadx 验证。

知识准备

商业加固技术分层:一代壳(整体 DEX 加密)、二代壳(函数抽取)、VMP(自定义字节码虚拟化)、DEX2C(Java 方法编译为 Native 机器码)、自实现 Linker(壳自行解析 ELF、处理 .dynamic、执行重定位,不依赖系统 linker)。2026 年的高级壳采用“自实现 Linker”,传统的“Hook dlopen/android_dlopen_ext 捕获 SO 加载”的脱壳思路对这些壳可能失效。

DEX-VMP 的工程细节:网易易盾的 DEX-VMP 将 Java/Kotlin 方法字节码转换为自定义字节码,原方法标记为 native,由 libsecsdk.so 中的解释器执行。解释器核心是一个 256 项的 opcode 表,指令流以 unsigned char opcode = *vip++ 逐字节读取。运行时抽取加密使关键代码指令在存储态被抽取并加密,仅在方法执行前短暂解密,执行后立即清除。逆向分析点包括 rL 桥(Native 与 Java 的转换接口)、256 项 opcode 表的 dump、SepData(分离存储的加密数据段)的定位,以及 ClassLoader 链的还原。字符串加密使用形如 ((K-c)^K) 的公式,K 和 c 是每个字符串或每个类的参数。实测表明,易盾的 VMP 会把指令切得非常碎,一条指令展开成七八条自定义字节码,主要保护 Java 层;如果核心算法在 SO 里,易盾的 VMP 效果有限。

RASP 架构:检测锚点(Inline Hook 检测、非预期可执行映射、调用序列偏离、Frida/Xposed 特征)、响应策略(崩溃/静默退出/服务端分级上报)、与 Play Integrity 的协同。

端侧 AI 模型保护:模型窃取路径(文件提取、Bin-to-DNN 重建)、THEMIS 部署后水印(利用端侧模型的不可训练性)、ModelVirtualizer 语义域虚拟化、TEE 执行。

ARM64 PAC/BTI:PACIASP/AUTIASP 作为函数边界强特征。控制流劫持成本从“找到 gadget + 构造 ROP 链”上升为“找到 gadget + 构造 ROP 链 + 获得签名 oracle 或绕过认证”。绕过路径包括 signing gadget / oracle,或从内存中泄露已签名的指针后复用。实际利用趋势向数据导向和签名 oracle 链迁移。

工具掌握

核心技能与产出

判断加固壳的层级顺序并选择对应脱壳策略;识别自实现 Linker 并绕过失效的 dlopen Hook 路径;编写 RASP 绕过脚本并处理分层检测;在 PAC/BTI 约束下评估 Native 利用的可行路径。产出包括加固壳能力矩阵、RASP 绕过脚本与检测锚点对照表、PAC/BTI 对利用成本影响的量化分析。

Kotlin 协程状态机还原的自动化方法与覆盖率评估;Jetpack Compose 字节码补丁的生效点分析与重组交互;Flutter Dart AOT 逆向工具链的版本兼容性与语义恢复质量;PAC/BTI 对 Android Native 漏洞利用成本函数的量化影响;端侧 AI 模型窃取路径与 THEMIS 水印的鲁棒性评估;MCP 编排下逆向工程的可重复性与证据链规范。

知识准备

Unity 的 Android 构建有两种脚本后端。Mono 将 C# 编译为 IL,打包在 Assembly-CSharp.dll 中,dnSpy/ILSpy 可以直接反编译。IL2CPP 将 C# 先转换为 C++,再编译为原生机器码,同时生成 global-metadata.dat 保存类型、方法、字段和字符串的元数据。IL2CPP 的防护效果常被高估:libil2cpp.so 和 global-metadata.dat 的组合仍然可以被 Il2CppDumper 等工具解析。

游戏数值(HP、金币、伤害)在运行时必须以可读写的形式存在于进程内存中,这是 GameGuardian 精确搜索和模糊搜索的利用基础。数值混淆(乘法、XOR、偏移)只能增加一次搜索的成本。GameGuardian 对 XOR 加密数值的对抗方式是:将搜索类型切换为 QWORD,对搜索值做同样的 XOR,定位到密文地址后再做逆变换写入。

工具掌握

核心技能与产出

从 APK 提取 libil2cpp.so 和 global-metadata.dat,用 Il2CppDumper 恢复符号;GameGuardian 精确/模糊搜索,对简单混淆数值逆混淆后搜索;Frida 通过 Module.findBaseAddress("libil2cpp.so") + 偏移 Hook 游戏函数。完成 5–10 个单机游戏的数值修改,记录逆混淆搜索过程。

知识准备

IL2CPP 运行时结构:Il2CppCodeRegistration、Il2CppMetadataRegistration 在内存中的定位,绕过文件层元数据加密。当 global-metadata.dat 被加密时,最有效的路径不是静态解密,而是在运行时 dump 解密后的元数据:使用 Zygisk-Il2CppDumper 同时 dump libil2cpp.so 和 metadata,或直接在内存中搜索 metadata 的已知结构特征,绕过文件层加密。

协议层攻击面:脱机外挂不运行客户端,直接按抓包格式向服务器发送请求,绕过客户端所有本地检测。时间/速度攻击面:变速工具修改调度节拍;修改系统时间对体力/登录奖励类机制有效。

工具掌握

核心技能与产出

元数据加密样本的运行时 dump;协议还原与请求构造;变速/改时间攻击面分析文档。

知识准备

游戏加固的协同性:手游代码保护的对象是 libil2cpp.so 与 global-metadata.dat 的对应关系。只加密 SO 而 metadata 明文,Il2CppDumper 仍可恢复符号;只加密 metadata 而 SO 未加固,机器码层面分析仍可行。网易易盾的 Unity 加固同时保护引擎 SO、metadata 和 DLL 整体加密,加固后 IDA 导出函数消失,Il2CppDumper 静态解析失效。

数值反作弊工程:冗余存储、派生值校验(存储值与校验和的组合)、Native Secure Value(将读写路径下沉到 Native 层)、服务端抽样验证。服务端权威:伤害计算、掉落、经济系统由服务端裁决。内核级对抗:KernelPatch KPM 利用 ARM64 硬件调试寄存器(DBGBVR/DBGBCR)在内核态注册断点,目标函数执行时 CPU 自动 trap 到内核 handler,直接操作寄存器后返回用户态。hook 点不在用户态留下任何可检测的修改痕迹,已知用户态检测手段对这种内核级 hook 均无效。

工具掌握

核心技能与产出

评估 SO+metadata 协同保护的实际强度;设计数值冗余存储与派生值校验方案;分析客户端加固在服务端权威缺失时的实际防护上限;识别内核级攻击对用户态反作弊的突破路径。

游戏反作弊从客户端加固向服务端权威迁移的经济学分析;数值混淆与反混淆的对抗演化;内核级内存读取对移动游戏反作弊的威胁模型;IL2CPP 元数据保护与运行时 dump 的攻防成本量化。

Kotlin 协程(suspend、Continuation、结构化并发);Compose($composer/$changed、重组与记忆化、状态提升);密码学(Keystore/StrongBox、Play Integrity、Credential Manager);R8 配置与签名方案;组件导出收敛、Deep Link 校验、FLAG_SECURE、Network Security Config。

DEX/Smali 读写与补丁;ArtMethod 布局、entrypoint 七种取值、inline deoptimization;协程 invokeSuspend 的 label/packed-switch 结构、Integer.MIN_VALUE 恢复标志;Compose $composer 调用链、startRestartGroup/endRestartGroup、条件分支补丁;ARM64 汇编、JNI RegisterNatives 恢复、Inline Hook、PAC/BTI;Flutter Dart AOT 工具链(flutterdec 的 IR/asm 验证、Blutter 的版本匹配);Binder execTransact/transact Hook、sender_euid 的内核语义;OLLVM 反混淆的分层策略(先去 bcf,再 fla,最后 MBA);MCP 工具编排与证据链记录。

DEX 加密、VMP(256 opcode、SepData、rL 桥)、DEX2C、SO 加密、字符串加密(((K-c)^K))、资源加密;反调试、防 Hook、防内存 dump、防二次打包、防注入、防模拟器;RASP 检测锚点与分层响应;模型水印、虚拟化、TEE 执行;自实现 Linker(ELF 解析、重定位、mprotect 执行)。

Unity IL2CPP/Mono 选择与安全相关 Player Settings;Unreal Engine 的 libUE4.so 符号暴露面;服务端权威、冗余存储、派生值校验、Native Secure Value;Relay/DGS 网络模型、协议加密、时间戳服务端校验;AssetBundle/PAK 加密与热更新完整性。

global-metadata.dat 解析与 Il2CppCodeRegistration 内存定位;Zygisk-Il2CppDumper 运行时绕过;UE4Dumper 的符号恢复与 SDK 生成;精确/模糊/联合搜索、XOR 加密数值的逆变换搜索;协议抓包与请求构造;libil2cpp.so / libUE4.so 函数 Hook;变速/改时间攻击面。

SO+metadata 协同保护、自实现 Linker、OLLVM;数值冗余、派生校验、Native Secure Value、服务端抽样;CRC、ptrace 检测、/proc/self/maps 扫描、mprotect 监控;腾讯 ACE、网易易盾、FairGuard 的架构定位;KernelPatch KPM 的威胁模型与用户态检测的上限。

入门:CrackMe 通关(10–15 个 APK);APK 信息分析工具;MobSF + Frida triage。
进阶:协议逆向(抓包 → pinning 绕过 → Java/Native 定位 → 算法还原);加固样本脱壳(Hook DexClassLoader/InMemoryDexClassLoader);Binder 服务监控。
高级:协程状态机还原工具(Smali → 状态转移图,正确处理 Integer.MIN_VALUE 恢复标志);Compose 补丁框架(定位 $composer 条件分支并翻转);Flutter 逆向流水线(flutterdec + Blutter + Frida);OLLVM 分层反混淆流程(d810-ng 去 bcf → 去 fla → MBA 化简);RASP 分层绕过。
研究:PAC/BTI 利用成本量化(signing oracle 的可行性边界);端侧模型窃取与 THEMIS 鲁棒性;MCP 编排的可重复性。

入门:单机游戏数值修改(GameGuardian,含 XOR 逆变换搜索);Il2CppDumper 符号恢复流程。
进阶:协议逆向与请求构造;元数据加密样本的运行时 dump(Zygisk-Il2CppDumper 或内存搜索);UE4Dumper 的 libUE4.so 符号恢复;变速/改时间攻击面。
高级:游戏保护能力矩阵评估(SO+metadata × 资源 × 数值 × 运行时检测);数值反作弊方案设计与绕过评估;服务端权威迁移的成本-收益分析。
研究:服务端权威迁移经济学;内核级内存读取的威胁模型。

全栈架构。移动端分为应用加固(SO、Mono DLL、AssetBundle、Global-Metadata 加密)与反作弊引擎(拦截修改器/加速器、识别 VirtualApp/模拟器/云手机、防御 GPU 资源分析)。PC 端以真实内核驱动(ACE-BASE.sys)为底层锚点,行为侧覆盖录像审查(Replay Review)与 DMA 作弊硬件检测。移动端 libtprt.so 涉及控制流平坦化、101 组加密字符串、检测点表、自退出码 0x2603c、协议魔数 0x87920101。

Tencent VM 的结构与去虚拟化。TVM 将原生函数替换为一个跳转到 VM dispatcher 的 trampoline;dispatcher 执行 native x86 handler,被保护函数的架构状态保存在 VM context 中。部分操作在 VM 外部执行:boxed instruction 执行原始 x86 编码后将效果写回 guest context;guest call 调用 native 目标后以返回值恢复 guest 状态。条件控制流通过 dispatch arithmetic 实现:handler 提取 guest flag 或 predicate,用它选择下一个 virtual program counter。Aftermath Labs 的静态去虚拟化管线将虚拟化代码提升到 SSA IR,内联 dispatcher 调用、将字节码读取提升为常量、折叠混合布尔算术恒等式、将虚拟分支重写回原生 JCC,在四个 ACE 内核驱动上恢复了 815/865 个虚拟化函数(94.2%),ACE-GAME.sys 达到 99.3%。

AI Replay 将检测重心从客户端内存特征扫描迁移到大规模回放分析。Replay 系统对移动轨迹、视角变化、开火时机乃至微秒级交互动作进行全息记录,再与 AI 模型融合。驱动因素在于作弊动机从“社交认可”转向直接经济利益——“搜打撤”品类的高价值虚拟物资可第三方变现,催生“雷达挂带队”等协同作弊模式。AI Replay 的检测逻辑是:不再只检查“客户端是否被篡改”,而是检查“行为序列在统计上是否像一个正常玩家”。

云+端架构由客户端加固、反外挂 SDK、云端智能分析平台三部分组成。

DEX-VMP 的工程实现是易盾在应用加固侧的核心技术。Java/Kotlin 方法字节码被转换为自定义字节码,原方法标记为 native,由 libsecsdk.so 中的解释器执行。解释器核心是 256 项 opcode 表,指令流以 unsigned char opcode = *vip++ 逐字节读取。运行时抽取加密使关键代码指令在存储态被抽取并加密,仅在方法执行前短暂解密,执行后立即清除。逆向分析点包括 rL 桥(Utils.rL 是 libsecsdk.so 支撑的静态 native 方法,读取 Object[] 的最后两个 slot:methodId 和 magic)、256 项 opcode 表的 dump、SepData(分离存储的加密数据段)的定位、ClassLoader 链还原。字符串加密使用 ((K-c)^K) 公式。实测表明,易盾的 VMP 会把指令切得非常碎,一条指令展开成七八条自定义字节码,主要保护 Java 层;如果核心算法在 SO 里,易盾的 VMP 效果有限。

Unity 加固明确保护三样对象:引擎 SO(libil2cpp.so/libmono.so)、global-metadata.dat、DLL 整体加密。加固后 IDA 导出函数消失,metadata 被加密,Il2CppDumper 静态解析失效。协同保护的关键在于同时切断 libil2cpp.so 与 metadata 的对应关系。

无导入函数 SO 加壳是 FairGuard 的核心差异化技术。一个空白 C 工程即使不调用任何 API,编译后仍会有约 10 个导入函数。直接删除导入表会导致 SO 加载失败。FairGuard 的方案使加固后的 SO 没有导入函数,同时保持正常功能:被加固 SO 需要调用大量 API,但不能使用 dlsym(它本身也没有导入),必须在不依赖系统 API 的条件下自行解析和获取函数地址。需要处理的工程难题包括:Android 4.4–7.0 部分函数未在系统模块中导出;同名 API 可能由多个模块导出,选错会导致进程崩溃;模拟器(x86 宿主运行 ARM 模块)的兼容性需要额外处理。配合导出函数清除/加密、ELF 结构虚拟化、系统调用接管,静态分析中“导入表”这一锚点被完全消除。

时序-空间双模态 AI 检测针对纯视觉 AI 自瞄。操作指纹技术整合点击节奏、滑动惯性、反应延迟等微观行为数据,构成个体化行为特征。经头部游戏实测,对纯视觉 AI 外挂识别准确率达到 96.5%,外挂投诉率降低 70%。还部署了反 AI 逆向陷阱(逻辑诱饵)和对抗符号执行的功能。

KernelPatch KPM 的无痕 Hook 机制。KPM 利用 ARM64 硬件调试寄存器(DBGBVR/DBGBCR)在内核态注册断点。目标函数执行时,CPU 自动 trap 到内核的 do_debug_exception handler;KPM 在其中记录寄存器、读取参数内存,甚至在异常返回前直接改写目标进程数据。由于 hook 点不在用户态留下任何可检测的修改痕迹——不修改目标进程内存、不注入 SO、不创建可疑映射——已知的用户态检测手段对这种内核级 hook 均无效。xiaojianbang-stealth-hook 的 KPM 模块通过 syscall 285 与用户态通信,支持 HWBP_HOOK(对所有线程注册硬件断点)、AUTO_THREAD(新线程自动覆盖)、SET_OVERRIDE(配置改参/跳过)、QUERY(返回 hit_count + args + mem_dump)和 UNHOOK。目标函数执行时,hwbp_handler 记录 X0–X7、LR,dump 指针内存,通过 SKIP_ORIGIN 将 pc=LR、x0=ret_value 实现跳过原函数,或通过 MODIFY_ARGS 改写寄存器。已有实现在 OnePlus PJF110(Android 14,6.1.75 内核)上跑通跨进程内存读取。mkpms 进一步利用 KPM 动态切换内存分页,实现读和执行发生在不同物理页:应用读到的是原始物理页,执行的是被 hook 过的物理页。

内核挂将攻击者门槛从“用户态工具使用”提升到“内核模块开发与加载” ,同时也将防御者的有效检测面上移到内核层。用户态 RASP 在这一对抗层级中的边际收益显著下降。

跨端隔离的检测边界。PC 模拟器运行 Android 游戏时,外挂程序运行在宿主系统层面,移动端反作弊 SDK 只能检测模拟器内部的进程环境。当攻击面跨越操作系统边界,单一端侧 SDK 在结构上无法覆盖全部路径,检测必须依靠跨端信号融合或服务端行为裁决。

逆向分析的上限取决于对源码的理解深度。AOSP 的开源性质意味着每一个 Hook 点、脱壳时机、检测锚点的底层逻辑都是可验证的,而不是从二进制中猜测的。

逆向最常触碰的目录:frameworks/base/(Framework 核心、系统服务 Java 源码、JNI 层)、frameworks/native/(libbinder、SurfaceFlinger、图形栈)、art/(ArtMethod、entrypoint 切换、JIT/AOT、JNI 桥接)、bionic/(libc、linker)、system/core/(init、logd)、内核仓库(Binder、ashmem、ion)。

阅读环境:source build/envsetup.sh 提供 cgrep、jgrep、mgrep、sgrep(按文件类型裁剪检索范围)、godir、afind、hmm。cs.android.com 是官方在线 Code Search,适合符号跳转和跨项目检索。

以 startActivity 为例:Activity.startActivity() → Instrumentation.execStartActivity() → ActivityTaskManager.getService()。搜 getService() 方法定位 Binder 代理获取点,这是 Framework 到系统服务的桥;记下 Stub.asInterface 的参数类型,搜对应 .aidl 文件直接找到方法声明和参数。系统服务源码在 frameworks/base/services/core/java/com/android/server/ 下(am/、wm/、pm/)。

Java 层 native 方法的实现位于 frameworks/base/core/jni/ 或 services/core/jni/。动态注册在 onload.cpp 的 JNINativeMethod 数组中,函数指针直接指向 .cpp 中的同名函数;静态注册遵循 Java_包名_类名_方法名 命名约定。不要依赖 IDE 的符号跳转,命令行检索(cgrep + 目录限定)在 AOSP 体量上更可靠。

关注数据流而非控制流:先找到核心数据结构(如 sp<Surface>、BufferQueue、GraphicBuffer),理解生命周期和所有权关系,再沿数据传递路径阅读。ART 入口是 art/runtime/:art_method.h(ArtMethod 字段布局与 Hook 基础)、entrypoint_utils.h(JIT/AOT 路径切换)、jni_internal.cc(JNI 桥接)。ArtMethod::GetEntryPointFromQuickCompiledCode() 的返回值取决于 ptr_sized_fields_ 中的对应项,它可能是 AOT/JIT 机器码、art_quick_to_interpreter_bridge、Nterp 入口、Generic JNI stub、Resolution trampoline 或 Instrumentation stub。优先用 symbol,不要硬编 offset:libart.so 导出的 GetEntryPointFromQuickCompiledCode 等成员函数(如果没被 strip)能让 runtime 自己算 offset,跨版本比硬编稳。


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 11小时前 被starscc编辑 ,原因:
收藏
点赞 ・14
打赏
分享
最新回复 (8)
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2 楼
666
11小时前
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3 楼
1
11小时前
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4 楼
66
11小时前
0
雪    币: 34
活跃值: (582)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5 楼
666
9小时前
0
雪    币: 1901
活跃值: (6158)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6 楼
66
5小时前
0
雪    币: 95
活跃值: (3887)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7 楼
666666666666666666666
5小时前
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8 楼
666
4小时前
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9 楼
6666
3小时前
0
游客
登录 | 注册 方可回帖
返回