安卓逆向圈子里流传着一句话:不会反编译,安卓都不好意思说自己搞过安卓。助手这话有点夸张,编译但理儿不糙。安卓我见过太多人,助手装个APK就想改图标、编译去广告、安卓看别人代码里的助手秘密,结果连dex文件长什么样都不知道。编译说白了,安卓反编译就是助手把APK这层"壳"剥开,把编译好的编译二进制代码翻译回人能读懂的Java或Smali。
拿《安卓逆向助手》这类工具举例。安卓它本质是助手个图形化封装,底层调用的编译还是那几板斧:apktool解包资源、dex2jar把dex转成jar、jd-gui看Java源码。你双击打开它,界面简陋得像十年前写的,但功能一点不含糊。我上次帮人分析一个恶意软件,就是用这工具三下五除二扒出了它的C2服务器地址。整个过程不到五分钟,比在命令行里敲代码快多了。
具体怎么操作?第一步,把APK拖进窗口,选"反编译资源"。这步走完,你会得到一个文件夹,里面全是smali文件和资源XML。注意,这时候看到的代码还不是Java,是smali——一种类似汇编的中间语言。看不懂?正常。第二步,用"dex转jar"功能,把classes.dex转成jar包。第三步,用jd-gui打开jar,这时候代码就接近原始Java了。但别高兴太早,混淆过的代码会变成a.b.c这种鬼名字,逻辑还是得靠猜。
有个坑必须提。现在很多APK做了加固,比如360加固、腾讯乐固。你拿《安卓逆向助手》直接反编译,得到的只是个壳子,真正的代码藏在so文件里,运行时才解密。碰到这种,得先脱壳。手动脱壳是个技术活,要会调试、会hook,甚至得懂一点汇编。但有个取巧的办法:用模拟器跑起来,在内存里dump出解密后的dex,再拿回工具里反编译。这招虽然土,但对付大多数加固够用了。
工具本身没什么高深莫测的,关键是思路。反编译不是为了偷代码,很多时候是为了排查问题。比如你发现某个APP疯狂上传流量,反编译看看它到底传了什么,比抓包直观多了。又或者你想做个插件,得知道目标APP的接口签名,反编译就是最快的捷径。我认识一个做外挂的哥们,天天抱着这工具研究游戏协议,后来被厂商告了,赔了二十万——工具无罪,用的人得想清楚边界。
最后说点实在的。别指望反编译出来的代码能直接编译回去。资源文件改了签名就失效,代码改了逻辑就崩,这是常态。想真正玩转逆向,光靠这个工具不够,还得补Java、Smali、JNI、ARM汇编。但作为入门,它够用了。下载一个,找个简单的APK试试手,你会发现新世界的大门就这么打开了——当然,也可能是一扇通往法院的门,看你拿它干什么了。