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分析视图更清晰,能直接看到函数调用关系。我顺着调用链,很快就找到了那个密钥。

小技巧:GDAX支持批量导出smali代码。如果你需要做代码审计,可以一次性导出所有smali文件,然后用文本工具搜索关键词。比在工具里一个一个翻快多了。

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,保存,重打包。搞定。

注意:修改smali代码时,一定要保持寄存器数量一致。比如原来用了v0和v1两个寄存器,你修改后也只能用这两个。多一个或少一个,都会导致运行时崩溃。我曾经因为这个bug,调试了整整一个下午。

静态分析的核心思路

工具只是手段,思路才是关键。静态分析说白了,就是"不动手,先动眼"。在代码层面把逻辑理清楚,再去动态调试验证。

我的分析流程:

  1. 看Manifest:了解APP的组件结构、权限、入口。
  2. 找关键类:搜索敏感字符串,定位核心逻辑所在的类。
  3. 理清调用链:从入口方法开始,顺着调用关系往下走。
  4. 分析算法:遇到加密、校验逻辑,仔细看代码实现。
  5. 记录关键点:把关键方法、变量、字符串记录下来,方便后续动态调试。

我曾经分析过一个加固过的APP。它把核心逻辑全部放在了Native层,Java层只有一个空壳。用JEB看Java代码,啥也没有。但我不慌,先看Manifest,发现它注册了一个ProxyService。然后搜索"ProxyService",找到它的Java实现,发现它调用了Native方法nativeStart()。顺着这个线索,我分析了它的so文件,最终找到了真正的业务逻辑。

三款工具对比总结

工具 优势 劣势 适用场景
JEB 功能全面,反编译质量高 启动慢,收费 深度分析、复杂样本
GDAX 轻量快速,反混淆强 界面简陋,功能不如JEB多 快速分析、日常使用
Android Killer smali修改方便,重打包一键完成 更新慢,对新版Android支持差 破解修改、简单逆向

我个人建议:日常分析用GDAX,遇到复杂样本上JEB,需要修改smali时用AK。三把刀轮着用,基本能应对90%的场景。

核心要点:静态分析不是看代码,而是"读"代码。你要像读小说一样,理解作者的思路。工具只是帮你把"小说"从乱码翻译成你能看懂的文字。真正重要的,是你自己的分析能力。
Android静态分析工具知识体系 Android APK JEB 深度分析 GDAX 快速分析 Android Killer 修改 DEX反编译 / Native分析 动态调试 / 脚本扩展 启动快 / 内存占用低 反混淆强 / 直接修改 一键反编译 / 代码编辑 资源查看 / 重打包签名 核心思路:看Manifest → 找关键类 → 理清调用链 → 分析算法

好了,这一讲的内容就到这里。工具这东西,光看没用,得动手。建议你找个APK,用这三款工具分别分析一遍,感受一下它们的差异。遇到问题,随时翻回来看。

公众号:蓝海资料掘金营,微信deep3321