当前位置:   article > 正文

Android逆向之反编译APK_apk反编译

apk反编译

前言

日常开发中,我们可能需要反编译 apk 去查看或分析一些问题,如:

1、这个 app 效果挺酷的啊,怎么实现的呢?此时你就可以反编译看下它的布局和代码实现

2、这个 app 里面的资源挺多的啊,我想拿过来用,此时你就可以反编译去拿这个 app 里面的资源

3、使用 aop 在一个类里面插入了一些代码,想验证一下,此时你就可以反编译查看是否按照你的预期插入了代码

4、我想改吧改吧这个 app ,例如替换它的 app icon,替换里面的翻译,app 汉化等等,此时你就可以反编译修改,然后打成一个新的 apk 发布(这种大家知道就好,千万别去做啥坏事)

上面列举的 4 种场景基本可以覆盖我们日常开发中遇到的问题了,接下来我们就正式进入 APK 反编译技术的讲解

注意:下面演示均是在 mac 下进行

一、反编译工具介绍

如果我们只是需要 app 中的图片资源,可以直接修改 xxx.apk的后缀为 xxx.zip,解压后的文件目录如下:

image-20221022210917119.png

所有的代码处于 classes.dex 中,图片布局等资源处于 res 目录下。此时你可以直接去 res 目录下复制图片资源使用,但是你去打开 AndroidManifest.xml 文件和 activity_main.xml 文件,会发现看不懂

AndroidManifest.xml 文件:

image-20221022175713114.png

activity_main.xml 文件:

image-20221022175816393.png

就是一推整齐排列的 16 进制数,那如果我想看懂要怎么办呢?

答:使用 apktool

1.1、apktool

作用:反编译 APK 中的资源

下载链接:ibotpeaches.github.io/Apktool/ins…

打开下载链接会出现如下界面:

image-20221021173948270.png

mac 建议使用红框中的 Homebrew 去安装,执行 brew install apktool 命令一键安装,它会自动给你配置好环境变量以及增加文件的操作权限

安装完成后,输入apktool命令 ,如果展示了 apktool 相关信息证明你配置成功了,如下图:

image-20221021174740419.png

1.1.1、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 解码成具体的资源文件)

常用的用法就这么多,上述命令的执行结果如下图所示:

image-20221022172954424.png

这就说明反编译资源成功了

需要注意的是

1、上述 app-debug.apk,mac 的 terminal 会自动添加 .zip 后缀,大家别给误导了哈

2、另外生成的文件夹会在 apk-debug.apk.zip 的基础上在增加 .out 后缀:

image-20221022173342679.png

这种现象和 windows 系统表现不太一样,大家注意一下,如果看着不爽,可以使用上述讲的附加参数-o ,来对输出的文件夹进行重命名

3、建议大家新建一个文件夹来进行反编译的操作,例如上面我新建了一个 apktool_reverse 的文件夹,然后将 apk 资源放到下面,通过 terminal cd 到这个目录,最后执行解码的命令

4、如果我们执行解码命令 apktool d xxx.apk 成功后,想添加附加参数继续执行,如:apktool d -s -r xxx.apk,此时会报错:

image-20221022174758839.png

报错提示我们该文件夹已经存在了,因此在这种文件夹已经存在的情况下,大家应该加上附加参数-f强制删除现有文件夹

ok,看一下 apktool 反编译后生成的一些具体文件:

image-20221022180713615.png

1、AndroidManifest.xml:经过反编译还原后的 manifest 文件

2、original 文件夹:存放了未经反编译过、原始的 AndroidManifest.xml 文件

3、res 文件夹:存放了反编译出来的所有资源

4、smali 文件夹:存放了反编译出来的所有代码,只不过格式都是.smali类型的

看一眼反编译后的 AndroidManifest.xml 文件和 activity_main.xml 文件

AndroidManifest.xml 文件:

image-20221022180343979.png

activity_main.xml 文件:

image-20221022180428331.png

已经还原成我们看得懂的文件了,格式差点意思,你可以将内容复制出来放到 AndroidStudio 里面格式化一下就完美了,这样我们就把反编译资源的方法给掌握了

另外使用 apktool 反编译后的代码处于 smali 文件夹下,且都是.smali格式的,我们简单截取一段 MainActivity.smali 文件的代码:

image-20221022205951161.png

嗯,看不懂声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】

推荐阅读
相关标签