抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

对于混淆后的Android应用调试技巧

背景

以前读书时候还没怎么学 Android,就总是耗时间在搞什么软件破解,图标替换,汉化以及去广告(那时候有个网站叫乐讯,刚刚看居然还活着)。但那年的我知识不成体系,主要靠工具,就像买的 mt文件管理器,之前终身会员只要十几块还是二十几块来着,现在都成了一百多一年的订阅服务了。

而现在工作中有时候需要定位问题,或者拆解别家处理方案,这些倒是成了必备基础手段。(仅基础)

关于高级安全/渗透/破解,我不会,不过网上倒是有不少手册,比如:https://github.com/r0ysue/AndroidSecurityStudy

工具

主要工具:

其他集成工具:

流程

简单说以下大概流程:

  • 将需要了解的 apk 拖入 Jadx,使用 Jadx 功能导出为 gradle 项目。
  • 使用 Android Studio 打开导出的项目,修正 gradle 脚本,使项目能正常索引(index)

目的是为了更方便的读懂应用逻辑,因为索引后就能正常进行类跳转以及查找、重命名等。

查找文件用 【双 Shift】搜索

查找变量用【Ctrl + Shift + F】搜索

  • 使用 Apktool 反编译 apk,得出 smail 文件,放入第一步导出的 gradle 项目根目录。

因为反编译后的项目没有 R 文件,所以这里需要反编译后的资源 id,可能存在进制转换,但可以用一些优化过的工具,比如:淡蓝斯宇安卓逆手(APKDB) 可惜只是 Windows 的工具。

  • 使用 Android Studio 查看被混淆后的项目。

例子

这里用我自己的软件AdbTool简单举例一下,因为简单,也不担心什么会破坏了谁的软件。

类文件查看

先下载 Jadx 的 release 包解压,对于 Windows 直接运行jadx-gui.bat,对于 mac

sh /Path/to/jadx-1.2.0/bin/jadx-gu

将 apk 拖进去,可以看到都是一些混淆的代码。这样直接看也不是不能看,但还是不太好看,而且看不到资源,也不知道一些字符串。

打开菜单栏,另存为 gradle 项目。

导出后文件就比较简单,直接用 Android Studio 打开肯定是没法直接编译成功,但我们还是先打开。

可以看到报错的,但这种一般也不用担心,先修正 gradle 插件版本,这个版本1.5也确实太低了,找个平时项目【项目 A】用的gradle版本,同时将【项目 A】的 gradle 文件夹拷贝过来(非隐藏,里面一个wrapper文件夹),然后同步下。无法同步的情况下,还得给仓库加上一个 google 源:(其实只用加框选的第一个,用于编译)

然后还是无法编译通过,这时候就得用歪门邪道了。关闭项目,删除掉项目目录下的.gradle .idea,重新使用 Android Studio open 项目,记得是 open,而不是从历史记录,重新初始化项目。

大概率可解80%的无法 索引 问题。

这样的话,就可以找到类/方法/变量的大多数调用位置,同时,对于系统控件都是不会混淆的,这样的话可以自行推断出用处(配合逻辑食用),同时自行更改变量名。看情况修正错误,大多数时候没有必要。

资源文件的查找

对于普通混淆项目,一般经过上述处理,可以直接通过跳转功能找到资源文件,但对于 AndRes 等经过多种手段乱七八糟搞过的(混淆过资源的),或者很复杂的项目都不会完美的匹配到。需要先找符号表。

符号表哪里找?反编译 apk,会得出一堆 smail。Windows 可以使用 APKDB,右键一下就结束了,我这里 mac,本质也一样。PS:需要 java 环境。

下载最新的apktool jar 后 对 apk 进行反编译:

java -jar /Path/to/apktool_2.4.1.jar d /Path/to/adbtool.apk 

生成的位置在终端当前所在目录,可使用 pwd 命令查看。

将生成的文件夹直接拖入之前导出的 gradle 项目中。然后窗口切回Android Studio,不出意外会自动 index。

然后使用Find in Path 可得到混淆后的布局文件对应的 id(有趣的是,一般 R.layout.xxxLayout 中的这个 xxxLayout 都不会被混淆,这时这个 xml 的命名也是一个很好的推理信息)

记录下这个 id。将原本的 apk 扔到项目中来,在 Android Studio 左侧切换到 Project 标签双击。

接下来就是找文件了,a2.xml,但在我这个 demo 中,我发现已经被重命名好了,大概是我处理得比较粗糙的原因。但双击会发现,无法正常显示布局预览,因为没有被 Android Studio识别为资源目录。

这里有两个办法,一是将反编译后的 res 文件夹与项目 res 文件夹合并,这样 Android Studio 就可以识别到依赖的那些资源了。第二个是改 gradle 脚本,在android 代码块里定义下新资源位置。

android{
....
  sourceSets {
      main {
          res.srcDirs = ['new_path_to/res']
      }
  }
}

不出意外,就可以看到大概的布局了,包括基本的设计。有问题的话 修一修 也就可以看到了,有 Android 基础的解决这点事不是什么大问题。

关于一些反编译失败的代码

对于一些三方库之类的总是会有一些无法编译成功地方,但仔细看那个位置的一些注释,也能找到一些蛛丝马迹,还可以尝试使用其他工具继续反编,PS:手机端的 MT 文件管理器确实是一个不错的选择。

结尾

至此,代码与资源都可以读了,混淆的地方,其实多看看,一点点的重命名问题也就不大了。

这里推荐一篇更范一点的文章:

因一纸设计稿,我把竞品APP扒得裤衩不剩(中)

里面的反混淆我试了下,意义不大,至于脱壳这种,倒不如多找找渠道包和版本,有些渠道可能没加壳


0条评论

发表评论