赞
踩
日常开发中,我们可能需要反编译 apk 去查看或分析一些问题,如:
1、这个 app 效果挺酷的啊,怎么实现的呢?此时你就可以反编译看下它的布局和代码实现
2、这个 app 里面的资源挺多的啊,我想拿过来用,此时你就可以反编译去拿这个 app 里面的资源
3、使用 aop 在一个类里面插入了一些代码,想验证一下,此时你就可以反编译查看是否按照你的预期插入了代码
4、我想改吧改吧这个 app ,例如替换它的 app icon,替换里面的翻译,app 汉化等等,此时你就可以反编译修改,然后打成一个新的 apk 发布(这种大家知道就好,千万别去做啥坏事)
上面列举的 4 种场景基本可以覆盖我们日常开发中遇到的问题了,接下来我们就正式进入 APK 反编译技术的讲解
注意:下面演示均是在 mac 下进行
如果我们只是需要 app 中的图片资源,可以直接修改 xxx.apk
的后缀为 xxx.zip
,解压后的文件目录如下:
所有的代码处于 classes.dex
中,图片布局等资源处于 res 目录下。此时你可以直接去 res 目录下复制图片资源使用,但是你去打开 AndroidManifest.xml 文件和 activity_main.xml 文件,会发现看不懂
AndroidManifest.xml 文件:
activity_main.xml 文件:
就是一推整齐排列的 16 进制数,那如果我想看懂要怎么办呢?
答:使用 apktool
作用:反编译 APK 中的资源
下载链接:ibotpeaches.github.io/Apktool/ins…
打开下载链接会出现如下界面:
mac 建议使用红框中的 Homebrew 去安装,执行 brew install apktool
命令一键安装,它会自动给你配置好环境变量以及增加文件的操作权限
安装完成后,输入apktool
命令 ,如果展示了 apktool 相关信息证明你配置成功了,如下图:
接下来我们通过 apktool 来反编译 apk 中的资源
1、先准备一个 apk 文件
2、执行 apktool d xxx.apk
命令
其中 d 是 decode 的意思,表示我们要对 xxx.apk 进行解码,我们还可以再加上一些附加参数来控制 decode 的更多行为:
-f :如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)
-o :指定解码目标文件夹的名称(默认使用 APK 文件的名字来命名目标文件夹)
-s :不反编译dex文件,也就是说 classes.dex 文件会被保留(默认会将 dex 文件解码成 smali 文件)
-r :不反编译资源文件,也就是说 resources.arsc 文件会被保留(默认会将 resources.arsc 解码成具体的资源文件)
常用的用法就这么多,上述命令的执行结果如下图所示:
这就说明反编译资源成功了
需要注意的是:
1、上述 app-debug.apk
,mac 的 terminal 会自动添加 .zip
后缀,大家别给误导了哈
2、另外生成的文件夹会在 apk-debug.apk.zip
的基础上在增加 .out
后缀:
这种现象和 windows 系统表现不太一样,大家注意一下,如果看着不爽,可以使用上述讲的附加参数-o
,来对输出的文件夹进行重命名
3、建议大家新建一个文件夹来进行反编译的操作,例如上面我新建了一个 apktool_reverse 的文件夹,然后将 apk 资源放到下面,通过 terminal cd 到这个目录,最后执行解码的命令
4、如果我们执行解码命令 apktool d xxx.apk
成功后,想添加附加参数继续执行,如:apktool d -s -r xxx.apk
,此时会报错:
报错提示我们该文件夹已经存在了,因此在这种文件夹已经存在的情况下,大家应该加上附加参数-f
强制删除现有文件夹
ok,看一下 apktool 反编译后生成的一些具体文件:
1、AndroidManifest.xml:经过反编译还原后的 manifest 文件
2、original 文件夹:存放了未经反编译过、原始的 AndroidManifest.xml 文件
3、res 文件夹:存放了反编译出来的所有资源
4、smali 文件夹:存放了反编译出来的所有代码,只不过格式都是
.smali
类型的
看一眼反编译后的 AndroidManifest.xml 文件和 activity_main.xml 文件
AndroidManifest.xml 文件:
activity_main.xml 文件:
已经还原成我们看得懂的文件了,格式差点意思,你可以将内容复制出来放到 AndroidStudio 里面格式化一下就完美了,这样我们就把反编译资源的方法给掌握了
另外使用 apktool 反编译后的代码处于 smali 文件夹下,且都是.smali
格式的,我们简单截取一段 MainActivity.smali 文件的代码:
嗯,看不懂声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。