很多人学 Android Native 逆向时会把三个概念混在一起:JNI、NDK、交叉编译。它们不在同一个层面上—— JNI 是「两个国家之间的外交协议」:规定 Java 和 C/C++ 怎么互相调用。 NDK 是「外交部」:装着编译器、头文件、构建脚本的工具箱。 交叉编译 是「外交部里专门做翻译的人」:让 x86 电脑产出 ARM 手机能跑的代码。 协议不依赖外交部存在,但没有外交部,你很难按协议高效生产出可用的东西。搞清这三层之后,再回头看 Frida 为什么必须 Hook RegisterNatives,逻辑就是自然的了。
这篇按「Java 层 → SO 层 → JNI 内核 → 主动调用与 RPC → 自动化 → 对抗实战」六层递进整理 Frida 用法。目标不是罗列 API,而是让你清楚每一层能做什么、边界在哪、什么时候必须往下一层走。
这篇把 ARM 汇编从「指令长什么样」到「函数怎么调用」串成一条线。目标不是背指令表,而是建立两个和 x86 完全不同的直觉:ARM 是 Load/Store 架构,以及返回地址在 LR 里而不是栈上。这两点决定了 ARM 逆向和 Pwn 的所有后续推演。
上一篇把汇编、寄存器、函数调用和保护机制串了一遍。这一篇补上两块地基——进程地址空间和栈帧的动态变化——然后用两个最小实验(数组越界、字符串栈溢出)把「覆盖返回地址劫持 rip」从原理推到实操,最后用 pwntools 写出第一个能跑的 exploit。
这篇笔记想做的事,是把「汇编基础」和「保护机制」两条线接起来。目标不是背指令表,而是让你看到一段 read(0, buf, 256) 时,脑子里能自动浮现出栈的布局、返回地址的位置,以及这道题可能开了哪些保护、该从哪里下手。
这件事如果只看标题,很容易被理解成"AI 全自动破解游戏"。完全不是。 真实过程是我和它坐在同一台机器前面,我给方向,它去验证;它的验证结果反过来修正我的判断。两关都是这样一点点磨出来的。这篇记的是那个协作过程本身 —— 包括我判断错的地方,和它推不动的时刻。
单会话聊到第 50 轮之后,你会发现一个问题:它开始忘事,而你开始替它记。 上下文压缩不是免费的。每压缩一次,模型就要重新理解一遍"我们到底在干什么",反应变慢、判断变钝。 这篇记录我目前跑通的四条做法:把 AI 当团队管理,而不是当聊天对象。