背景
以前读书时候还没怎么学 Android,就总是耗时间在搞什么软件破解,图标替换,汉化以及去广告(那时候有个网站叫乐讯,刚刚看居然还活着)。但那年的我知识不成体系,主要靠工具,就像买的 mt文件管理器,之前终身会员只要十几块还是二十几块来着,现在都成了一百多一年的订阅服务了。
而现在工作中有时候需要定位问题,或者拆解别家处理方案,这些倒是成了必备基础手段。(仅基础)
关于高级安全/渗透/破解,我不会,不过网上倒是有不少手册,比如:https://github.com/r0ysue/AndroidSecurityStudy
工具
主要工具:
- Android Studio https://developer.android.com/studio
- Jadx https://github.com/skylot/jadx
- Apktool https://ibotpeaches.github.io/Apktool/
其他集成工具:
- 安卓逆手(APKDB) https://idoog.me/?p=2933
- APKIDE改之理 https://www.52pojie.cn/thread-399571-1-1.html
流程
简单说以下大概流程:
- 将需要了解的 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 拖进去,可以看到都是一些混淆的代码。这样直接看也不是不能看,但还是不太好看,而且看不到资源,也不知道一些字符串。
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112105181277-1024x666.png)
打开菜单栏,另存为 gradle 项目。
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112104513614.png)
导出后文件就比较简单,直接用 Android Studio 打开肯定是没法直接编译成功,但我们还是先打开。
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112105204189.png)
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112207475569.png)
可以看到报错的,但这种一般也不用担心,先修正 gradle 插件版本,这个版本1.5也确实太低了,找个平时项目【项目 A】用的gradle版本,同时将【项目 A】的 gradle 文件夹拷贝过来(非隐藏,里面一个wrapper文件夹),然后同步下。无法同步的情况下,还得给仓库加上一个 google 源:(其实只用加框选的第一个,用于编译)
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112207484568.png)
然后还是无法编译通过,这时候就得用歪门邪道了。关闭项目,删除掉项目目录下的.gradle
.idea
,重新使用 Android Studio open 项目,记得是 open,而不是从历史记录,重新初始化项目。
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112105341679-1024x460.png)
大概率可解无法 索引 问题。
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112207491312.png)
这样的话,就可以找到类/方法/变量的大多数调用位置,同时,对于系统控件都是不会混淆的,这样的话可以自行推断出用处(配合逻辑食用),同时自行更改变量名。看情况修正错误,大多数时候没有必要。
资源文件的查找
对于普通混淆项目,一般经过上述处理,可以直接通过跳转功能找到资源文件,但对于 AndRes 等经过多种手段乱七八糟搞过的(混淆过资源的),或者很复杂的项目都不会完美的匹配到。需要先找符号表。
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112105411161-1024x613.png)
符号表哪里找?反编译 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 的命名也是一个很好的推理信息)
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112106235160-1024x816.png)
记录下这个 id。将原本的 apk 扔到项目中来,在 Android Studio 左侧切换到 Project 标签双击。
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112106265018.png)
接下来就是找文件了,a2.xml
,但在我这个 demo 中,我发现已经被重命名好了,大概是我处理得比较粗糙的原因。但双击会发现,无法正常显示布局预览,因为没有被 Android Studio识别为资源目录。
![](https://i.lckiss.com/wp-content/uploads/2020/11/2020112106305783-1024x459.png)
这里有两个办法,一是将反编译后的 res 文件夹与项目 res 文件夹合并,这样 Android Studio 就可以识别到依赖的那些资源了。第二个是改 gradle 脚本,在android 代码块里定义下新资源位置。
android{ .... sourceSets { main { res.srcDirs = ['new_path_to/res'] } } }
不出意外,就可以看到大概的布局了,包括基本的设计。有问题的话 修一修 也就可以看到了,有 Android 基础的解决这点事不是什么大问题。
关于一些反编译失败的代码
对于一些三方库之类的总是会有一些无法编译成功地方,但仔细看那个位置的一些注释,也能找到一些蛛丝马迹,还可以尝试使用其他工具继续反编,PS:手机端的 MT 文件管理器确实是一个不错的选择。
结尾
至此,代码与资源都可以读了,混淆的地方,其实多看看,一点点的重命名问题也就不大了。
这里推荐一篇更范一点的文章:
里面的反混淆我试了下,意义不大,至于脱壳这种,倒不如多找找渠道包和版本,有些渠道可能没加壳。
关于脱加壳可看:
本站由以下主机服务商提供服务支持:
0条评论