Android改造者之路 03 · 寻找称手的神兵利器
第 03 章 寻找称手的神兵利器
续写章节|沿用「原木」系列的武侠讲解体,非原作者(dayeve)作品
前情提要
终于学会了一招半式,总算可以下山闯荡江湖了。
幻想中(山珍海味,美女如云。。。hohoho)
出发咯~~~
(走着。。。走着。。。)
咦~ 好像少了些什么。。。
对了,剑呢?
居然忘了拿剑,差点白学了。
ermmm。。。记得师傅说过藏兵阁收藏着不少神兵利器。
哟,那去藏兵阁走一回吧。。。
前情提要
藏兵阁立于 android 世界的中心地段,是六大门派公认的中立之地。不管是开发者、改造者还是保卫者,进了这扇门都得守同一条规矩:只借器,不问用途。
阁门上挂着一副褪了色的对联。
上联:器不在多,趁手则灵
下联:术不在玄,管用则行
横批:别光收藏
守阁的老头儿眯着眼打量了我一番:“第一次来?”
我点点头。
“那我先给你讲讲规矩。这里的兵器不按锋利程度排,按用途分成四区——拆器区、观器区、炼器区、活器区。新手最容易犯的错,就是直奔最锋利的那一把,结果扛不动,还闪了腰。”
“兵器这东西,不是越强越好,是越趁手越好。”
我挠挠头:“那我先去哪区?”
老头儿指了指一楼最里面那间不起眼的屋子:“先去见见万能君。它不锋利,但你八成的活儿,它一把就能干完。”
一、藏兵阁四区
为了不让你在阁里迷路,先把四区的定位说清楚:
| 区域 | 作用 | 对应阶段 | 代表兵器 |
|---|---|---|---|
| 拆器区 | 把 apk 拆开、把 dex 翻译成可读形式 | 拿到东西先拆 | ApkTool、baksmali/smali |
| 观器区 | 看清程序长什么样、逻辑怎么走 | 拆完看 | jadx、dex2jar+JD-GUI、JEB、IDA |
| 炼器区 | 改完之后重新封装、盖章 | 改完装回去 | zipalign、apksigner、keytool、MT管理器 |
| 活器区 | 不拆程序,直接观察它跑起来在干什么 | 静态看不懂时 | Frida、Xposed/LSPosed、抓包工具 |
记住这个顺序:先拆 → 再看 → 后改 → 重新封装盖章。很多人一上来就想改,结果连门都找不到在哪。
二、小剧场模式:藏兵阁点兵
小剧场模式
导演: 各部门注意,这一场是点兵戏,所有兵器挨个亮相,别抢词。
助理: 3 2 1。。。action
万能君: 大家好,我是万能君,洋名叫 MT管理器。别看我待在一楼最角落,我可是能在一个小小的铁盒里,把「拆、看、改、装、签」这一整套流程一口气干完的百宝囊。别人要开电脑、敲命令、配环境,我掏出手机点几下就完事。我的看家本事有:直接点开 apk 看内部结构、把 dex 反编译成 smali 并直接编辑保存、编辑 Arsc 资源、编辑 XML、合并 dex、一键签名安装。新手想练手,从我开始准没错——当然,我有些深的本事是要收点香火钱(会员)的,但入门那几招,白给。
拆解君: 大家好,我叫拆解君,洋名 ApkTool。我是这阁里资历最老的一位。我能把 apk 完整拆开:把 resources.arsc 和那些被编译过的 XML 还原成人能读的样子,把 classes.dex 变成一目录的 smali 文件;你改完,我还能原样装回一个能跑的 apk。可以说,没有我,改造者就得手工去啃二进制。我的弱点是回编译偶尔会闹脾气(尤其遇到新版 aapt 或加固的 apk),这时候就得升级我或者换工具。
翻译君: 咳咳,我是翻译君,其实我是两个人——baksmali 和 smali。baksmali 负责把 dex 反汇编成 smali,smali 负责把 smali 汇编回 dex。听起来耳熟?对,拆解君体内那个翻译 dex 的器官,就是我。你可以单独使唤我,也可以让拆解君代劳。
还原君: 到我了到我了,我是还原君,江湖上一般连着两个名字一起叫:dex2jar + JD-GUI。dex2jar 把 dex 转成 jar,JD-GUI 再把 jar 显示成 Java 源码。这套组合在十年前可是标配。不过说实话,现在有点老了——遇到混淆严重的、或者新版指令的 dex,我容易看走眼,甚至直接罢工。
透视君: 该我了,我是透视君,jadx。我的本事是把 dex/apk 直接反编译成 Java 源码,还带图形界面:全局搜索字符串、搜索类名方法名、点击跳转、看调用关系,样样都有。跟还原君比,我更现代、更抗混淆,也不需要你先转一道 jar。现在的改造者,十个有八个的桌面上都开着我和拆解君。想读逻辑,先开我。
玄铁君: 嗯。(沉重的脚步声)我是玄铁君,我其实是两位——JEB 和 IDA Pro。我们是重器,价格不菲,上手也慢。JEB 擅长 Dalvik/ART 层,还能反混淆、看交叉引用;IDA 主要啃 so 文件(native 层),配上 Hex-Rays 能把汇编翻成 C 伪代码。当你发现要改的东西不在 dex 里、而藏在 lib 的 .so 里时——那就是该请我们出山的时候了。平常没事别碰我们,杀鸡焉用牛刀。
钤印君: 诸位,我是钤印君,我管的可不是一把兵器,是三件小东西:keytool、zipalign、apksigner。还记得第一章那位拦路君(META-INF)吗?他说过——没有签名印章的 apk,进不了 android 世界。你改完的 apk 原签名就失效了,必须由我重新盖一个。规矩是:先用 zipalign 对齐,再用 apksigner 盖章,顺序反了就白忙。我这活儿看着不起眼,但少了这一步,你改得再漂亮也装不上去。
摄魂君: (飘忽的声音)我是摄魂君,Frida。我不拆你的程序,也不改你的代码。我只是在它跑起来的时候,悄悄附上去,让你看清每个方法什么时候被调用、传了什么参数、返回了什么值,甚至当场把返回值改成你想要的。我用的是 JavaScript 写脚本,跨平台,Android、iOS、Windows 通吃。想搞清楚「这个按钮到底调用了哪个函数」,找我比翻两天代码快。
借法君: 我是借法君,Xposed / LSPosed。我跟摄魂君干的活儿有点像,但路子不同——我是常驻在系统里的框架,你写一个模块,我帮你把模块里的代码挂到目标 app 的方法上。我适合做长期、稳定的改造(比如常驻去广告),摄魂君适合临时试探。代价是我需要 root(Magisk) 环境,且版本适配常让人头疼。
听风君: 最后是我,听风君,抓包界的老江湖:HttpCanary、Charles、Fiddler、mitmproxy。app 跟服务器说了什么悄悄话,全在我耳朵里。不过现在的小年轻都学了证书绑定(SSL Pinning),不肯信我递的假证书;好在摄魂君和借法君能帮我摆平这件事。另外 android 7.0 以后默认不信任用户装的证书,要么想办法装进系统证书区,要么就去改 app 的 networkSecurityConfig。
导演: cut!! 好,点兵完毕,收工!
助理: 导演,万能君说它还想加一句。
万能君: 我就想说——兵器是拿来用的,不是拿来供的。 谢谢。
小剧场模式
三、兵器谱(实用篇)
光听自我介绍不过瘾,下面是真刀真枪的用法。每一项都按「什么时候用 → 怎么用」记。
3.1 拆器区
① ApkTool —— 拆解与回装的主力
# 反编译(d = decode)
apktool d app.apk -o app_dir
# 回编译(b = build),产物在 app_dir/dist/ 下
apktool b app_dir -o app_new.apk
拆出来的目录里,smali/(或 smali_classes2/ 等多 dex 目录)就是你要动刀的地方,res/ 是资源,AndroidManifest.xml 此时已经是可读的明文了。
小提醒:回编译出来的 apk 是未签名的,必须走一遍炼器区才能安装。
② baksmali / smali —— 只想动 dex 时用
# dex -> smali
baksmali d classes.dex -o smali_out
# smali -> dex
smali a smali_out -o classes.dex
当你只需要改一个 dex、不想惊动资源时,这对组合比 ApkTool 更轻快。
3.2 观器区
③ jadx —— 读逻辑的第一选择
jadx-gui app.apk # 图形界面,推荐
jadx app.apk -d out # 命令行导出源码
常用操作:搜索字符串(找提示语、找 URL)、搜索方法名、右键查调用处。先在这儿定位到关键方法,再回到 smali 里动手——这是最省力的工作流。
④ dex2jar + JD-GUI —— 老牌备选
d2j-dex2jar.sh classes.dex # 得到 classes-dex2jar.jar
再用 JD-GUI 打开 jar。jadx 啃不动的时候可以回来试试它。
⑤ JEB / IDA Pro —— 重器,啃 so 与深度分析
- 逻辑在 dex 里、要反混淆、看交叉引用 → JEB
- 逻辑在 lib/xxx.so 里(native 层)→ IDA Pro(+ Hex-Rays)
第一章里知识君(lib)说过他只认 .so,.so 是 C/C++ 编译的——那玩意儿不是 smali,得用 IDA 看汇编。
3.3 炼器区
⑥ 签名三件套 —— 少了它一切白搭
# 1. 先生成自己的印章(keystore),只需做一次
keytool -genkeypair -keystore my.keystore -alias mykey \
-keyalg RSA -validity 36500
# 2. 对齐(注意:必须先对齐)
zipalign -v 4 app_unsigned.apk app_aligned.apk
# 3. 再签名
apksigner sign --ks my.keystore --ks-key-alias mykey app_aligned.apk
# 4. 验证
apksigner verify -v app_aligned.apk
顺序千万记住:zipalign → apksigner。反过来签名会被破坏。
呼应第一章的拦路君:正因为你盖的章跟原作者的不一样,所以 META-INF 里的签名能证明 apk 被动过。这也是为什么有些 app 会做签名校验——你改完还得顺手把校验逻辑也处理掉,那是后话了。
⑦ MT管理器 —— 手机上的一站式
MT管理器把这些步骤都做成了点按操作:点开 apk → 查看 → 编辑 dex/XML/Arsc → 保存 → 自动重新签名 → 安装。新手强烈建议从这里起步。
3.4 活器区
⑧ Frida —— 运行时观测与劫持
frida-ps -U # 列出手机上的进程
frida -U -f com.example.app -l hook.js # 注入脚本启动
hook.js 示例——把某个方法的返回值强行改成 true:
Java.perform(function () {
var Target = Java.use("com.example.app.MainActivity");
Target.checkLicense.implementation = function () {
var ret = this.checkLicense(); // 先看看原本返回什么
console.log("原返回值: " + ret);
return true; // 再改成我们想要的
};
});
想知道「哪个方法被调用了、参数是什么」→ 用 Frida,比静态翻代码快十倍。
⑨ Xposed / LSPosed —— 常驻改造
public class HookMain implements IXposedHookLoadPackage {
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) {
if (!lpparam.packageName.equals("com.example.app")) return;
XposedHelpers.findAndHookMethod(
"com.example.app.MainActivity", lpparam.classLoader,
"checkLicense",
new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam param) {
return true;
}
});
}
}
需要 root(Magisk + LSPosed)。适合做长期、可复用的改造模块。
⑩ 抓包工具 —— 听它跟服务器说什么
- HttpCanary:手机上直接抓,用 VPN 方式,免 root 可用
- Charles / Fiddler:电脑上开代理,手机连过去,适合细致分析
- mitmproxy:命令行 + Python 脚本,适合自动化
两个绕不过去的坎:
- Android 7.0+ 默认不信任用户证书 → 装到系统证书区(需 root),或改 app 的
networkSecurityConfig - SSL Pinning(证书绑定) → app 只认自带证书 → 用 Frida 脚本或 JustTrustMe 之类的模块绕过
四、新手配装建议
兵器介绍完了,问题来了:先拿哪把?
守阁老头儿给我画了张路线图,我原样抄给你:
第一阶 · 手机起步(零门槛)
MT管理器 一把就够。在手机上直接打开 apk、看结构、改 smali、保存、签名、安装。这个阶段的目标是把流程跑通,找到"我真的能改"的手感。
第二阶 · 电脑深挖(主力工作台)
ApkTool + jadx 双开。jadx 负责"看"(读 Java 逻辑、搜索定位),ApkTool 负责"改"(出 smali 给你动刀)、再负责"装"回 apk。这俩组合覆盖了 90% 的日常改造。
第三阶 · 按需取用
- 逻辑藏进 so 里了 → 上 IDA Pro
- 静态看不懂、想知道运行时行为 → 上 Frida
- 要做长期常驻的改造 → 上 Xposed/LSPosed
- 想看网络请求 → 上 抓包工具
- 改完装不上 → 回 炼器区 检查 zipalign / apksigner 顺序
一条最重要的忠告:
兵器是拿来用的,不是拿来供的。很多人收藏了十几个工具、存了几百 G 教程,却连一个 apk 都没动手拆过。
挑一把,今天就用它拆一个 apk。
那比什么都强。
我抱着万能君从藏兵阁出来,天已经黑了。
老头儿在后面喊:“小子,记住——兵器再利,也替你想不了问题。 真正让你走远的,是第二章那七个字。”
我愣了一下:“哪七个字?”
老头儿笑了:“洞察、推算、分析、辨别……剩下的,自己想去。”
(我掰着手指头数,怎么数都只有六个字啊。。。)
不管了。剑已在手,先找个 apk 练练手再说。
嗯,就先从那个满屏广告的天气 app 开始吧。
(磨刀霍霍ing。。。)
剧情片段
导演: 这一章就到这儿,收工收工。
助理: 导演,观众问下一章讲啥?
导演: 兵器到手了,自然是——开打。
剧情片段
未完待续。。。


