Android 逆向工程 - 不确定 App 是否有混淆,所以反组译看看 ( 4步骤 )

免责声明

我花了大量的私人时间替专案研究 App 是否混淆成功,混淆结果是否达到需求。虽然我只会做简单的反组译跟实际上能达到商业需求的程度相比根本不值得一提,不过我还是想将笔记与大家分享,因此看完此篇而做任何事情与我本人无关,不过还是希望不要做违法的事情。

前情提要

根据Shrink, obfuscate, and optimize your app文章,启用 minifyEnabled 可以缩小、优化 App 顺便混淆程序码。

如何验证成功启用 minifyEnabled

要检验 minifyEnabled 启用,就得反组译 App。

启用与未启用对照图

未启用(未混淆) 启用(混淆)

根据上图可以发现未启用的程序码一览无遗,而启用後的程序码、Package、Path、Class、Method、Field 都被英文字母取代

反组译 4 步骤

第一步 - 取得 Apk

取得 Apk 有3种方式

  • 手机端系统 取得
  • 把 App 在 Google Play 商店的网址丢给第三方解析。ex.apkpure
  • 开发者端打包取得
    而开发者端打包格式有两种:
    • Apk
    • AAB(不讨论)

第二步 - 取得 classes.dex

把 Apk 副档名改成 Zip 副档名,并解压缩取 classes.dex


第三步 - 打包成 Jar 档

为什麽需要再次打包成 Jar 档? 为了阅读 smali 代码
根据 Android App 反组译流程(上) 文章表示

关於 Smali ,在 Android 官网中并无相关介绍,它应该出自 JesusFreke 的开源项目 smali。smali/baksmali 是针对 dalvik 使用的 dex 格式的汇编/反汇编器。它的语法基於 Jasmin's/dedexer,支持 dex 格式的所有功能(注释,调试信息,行信息等等)。因此我们可以认为 smali 和 Dalvik 字节码文件是等价的。事实上,Apktool 也正是调用这个工程生成的 jar 包来进行反编译生成 smali 代码的。对生成的 smali 代码进行修改之後再重打包,就可以修改 apk 中的逻辑了。因此,能阅读 smali 代码对我们进行 android 逆向十分重要。

使用 dex-tools-2.1-SNAPSHOT 工具打包

  • 3-1 将 classes.dex 放入 dex-tools-2.1-SNAPSHOT 工具所在位置的资料夹当中
  • 3-2 开启 cmd,在 dex-tools-2.1-SNAPSHOT 工具所在路径打入 cmd 按下 Enter
  • 3-3 下指令打包
    d2j-dex2jar classes.dex
  • 3-4 获取到 Jar 档

网路上看到的资源都是使用 dex2jar-2.0 而不是 dex-tools-2.1-SNAPSHOT耶?
这两个是一样的东西,都是 pxb1988 的开源,我会使用 dex-tools-2.1-SNAPSHOT 是因为在使用 dex2jar-2.0 时发生错误。


第四步 - 使用 JD-GUI 观赏 Jar 里面的程序码

为什麽不能直接解压缩 Jar 看呢? 因为有加密

使用 JD-GUI 观赏 Jar

特别感谢

Arxing Lin
Xindian Wu
Chih Lung Chen

文献参考

tags: Blog Android 逆向工程

<<:  Apple Music vs Spotify 优缺点比较:哪个更好?

>>:  第39天~~又是JSON+动态增加按钮不是用XML

Day13 Lab 2 - Object storage API层

接下来我们就要进入Lab2的环节了,我们不会只像Lab只实作了简单的单机储存系统,我们会有API层、...

DAY 27:Chain of Responsibility,将实作透过串串乐串起来

什麽是 Chain of Responsibility? 将 if...else 的行为抽象成物件,...

Day 06 - Design System — 为什麽前端工程师也该知道它?

新章 突入! 终於进入到期待已久的第二章 Design System 啦! 那在讲 Design ...

[Day20] Scrum失败经验谈 – 只想得太大太远

Scrum是大家想要导入的文化与工具,在分享了很多工具、体会和方法後,感觉是个好时机要来讲如何导入s...

001-基本介绍

嗨,大家好。参加这个竞赛,很单纯的事因为朋友的邀请。 在参赛之前,有大概浏览了十来页的自我挑战文章...