66、Android逆向(二):JEB/GDAX/Android Killer使用、静态分析
上一讲我们聊了Android逆向的基础环境搭建。今天,咱们直接上真家伙——三款主流静态分析工具:JEB、GDAX和Android Killer。
说实话,这三款工具我用了好多年。各有各的脾气,也各有各的绝活。你想想看,一个合格的逆向工程师,手里至少得有两三把趁手的兵器。今天我就把它们的用法和心得,一股脑儿倒给你。
JEB:反编译界的瑞士军刀
JEB这玩意儿,我个人认为是目前Android逆向里最全面的工具。它不仅能反编译DEX,还能直接解析APK里的Native代码,甚至能调试。
核心功能一览:
| 功能 | 说明 | 我的评价 |
|---|---|---|
| DEX反编译 | 将DEX转为可读的Java伪代码 | 准确率极高,基本能还原逻辑 |
| Native分析 | 支持ARM/Thumb指令反汇编 | 配合IDA使用效果更佳 |
| 动态调试 | 可附加进程或启动调试 | 比Android Studio的调试器灵活 |
| 脚本扩展 | 支持Python/JavaScript脚本 | 批量分析时能救命 |
实战操作:
打开JEB,直接把APK拖进去。它会自动解析,这个过程大概十几秒。解析完成后,左侧是包结构树,右侧是反编译代码。
我一般会先看AndroidManifest.xml。为什么?因为入口Activity、权限声明、组件暴露情况,全在这里。有一次我分析一个恶意软件,它把主Activity藏在了com.system.update包下,伪装成系统更新。要不是先看了Manifest,差点被它骗过去。
然后,我会搜索关键字符串。比如"password"、"secret"、"key"、"encrypt"这些。JEB的搜索功能很快,支持正则表达式。
// 在JEB中搜索字符串的示例
// 按Ctrl+F,输入 "password"
// 或者用Python脚本批量搜索
from com.pnfsoftware.jeb.client.api import IScript
class SearchStrings(IScript):
def run(self, ctx):
prj = ctx.getMainProject()
dex = prj.findUnit("classes.dex")
# 搜索所有字符串常量
for s in dex.getStrings():
if "password" in s.lower():
print(s)
嗯,这里要注意:JEB的免费版功能有限,但做静态分析完全够用。如果你只是偶尔逆向,免费版足够了。
GDAX:轻量级但五脏俱全
GDAX是我最近两年才开始用的。说实话,一开始我瞧不上它——界面太朴素了。但用了一段时间后,我发现它有几个JEB没有的优点。
GDAX的独特之处:
- 启动快:打开一个APK,基本秒开。JEB要等十几秒,GDAX两三秒就搞定。
- 内存占用低:我那个8GB内存的老笔记本,跑JEB有点吃力,但GDAX很流畅。
- 反混淆能力强:有些APK用了ProGuard混淆,JEB反编译出来的代码可读性差,但GDAX能自动还原一部分。
- 支持直接修改:你可以直接在GDAX里修改smali代码,然后重新打包。这个功能在分析小样本时特别方便。
操作流程:
打开GDAX,点击"打开APK",选择文件。它会自动解析并展示所有类和方法。双击一个方法,就能看到它的smali代码。
我曾经分析过一个金融类APP,它把加密密钥硬编码在了Native层。用JEB看Native代码,全是汇编,头大。但GDAX的Native分析视图更清晰,能直接看到函数调用关系。我顺着调用链,很快就找到了那个密钥。
Android Killer:老牌工具,情怀满满
Android Killer,简称AK。这工具现在用的人少了,但我还是要提一嘴。为什么?因为它在smali修改和重打包方面,至今无人能敌。
AK的核心能力:
- 一键反编译:把APK反编译成smali代码,自动生成项目结构。
- 代码编辑:直接在smali代码上修改,语法高亮,自动补全。
- 资源查看:可以查看和替换图片、布局文件、字符串资源。
- 重打包签名:修改完后,一键重打包并签名。
实战场景:
假设你要破解一个APP的VIP功能。用JEB分析出VIP校验逻辑在UserManager.isVip()方法里。这个方法返回一个boolean值。
在AK里,找到这个方法的smali代码:
.method public isVip()Z
.registers 2
.prologue
.line 42
const/4 v0, 0x0
return v0
.end method
看到没?const/4 v0, 0x0表示返回false。改成const/4 v0, 0x1,保存,重打包。搞定。
静态分析的核心思路
工具只是手段,思路才是关键。静态分析说白了,就是"不动手,先动眼"。在代码层面把逻辑理清楚,再去动态调试验证。
我的分析流程:
- 看Manifest:了解APP的组件结构、权限、入口。
- 找关键类:搜索敏感字符串,定位核心逻辑所在的类。
- 理清调用链:从入口方法开始,顺着调用关系往下走。
- 分析算法:遇到加密、校验逻辑,仔细看代码实现。
- 记录关键点:把关键方法、变量、字符串记录下来,方便后续动态调试。
我曾经分析过一个加固过的APP。它把核心逻辑全部放在了Native层,Java层只有一个空壳。用JEB看Java代码,啥也没有。但我不慌,先看Manifest,发现它注册了一个ProxyService。然后搜索"ProxyService",找到它的Java实现,发现它调用了Native方法nativeStart()。顺着这个线索,我分析了它的so文件,最终找到了真正的业务逻辑。
三款工具对比总结
| 工具 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| JEB | 功能全面,反编译质量高 | 启动慢,收费 | 深度分析、复杂样本 |
| GDAX | 轻量快速,反混淆强 | 界面简陋,功能不如JEB多 | 快速分析、日常使用 |
| Android Killer | smali修改方便,重打包一键完成 | 更新慢,对新版Android支持差 | 破解修改、简单逆向 |
我个人建议:日常分析用GDAX,遇到复杂样本上JEB,需要修改smali时用AK。三把刀轮着用,基本能应对90%的场景。
好了,这一讲的内容就到这里。工具这东西,光看没用,得动手。建议你找个APK,用这三款工具分别分析一遍,感受一下它们的差异。遇到问题,随时翻回来看。