美文网首页Android开发Android开发经验谈
【实用杂记】Android apk反编译查看源码、反编译资源文件

【实用杂记】Android apk反编译查看源码、反编译资源文件

作者: Android高级架构 | 来源:发表于2021-03-27 21:36 被阅读0次

    反编译代码

    要想将APK文件中的代码反编译出来,我们需要用到以下两款工具:dex2jar 和 jd-gui,可以在网上自行下载,这里分享下网盘下载链接:dex2jar-2.0.zipjd-gui-windows-1.4.0.zip

    dex2jar这个工具用于将dex文件转换成jar文件
    jd-gui这个工具用于将jar文件转换成java代码

    1、解压工具包

    将这两个工具都下载好并解压,然后我们就开始对Demo程序进行反编译。解压dex2jar压缩包后,你会发现有很多个文件,如下图所示:

    其中我们要用到的是d2j-dex2jar.bat这个文件,当然如果你是linux或mac系统的话就要用d2j-dex2jar.sh这个文件。

    2、解压Demo.apk

    然后我们将Demo.apk文件也进行解压,如果不知道怎么直接解压的可以先将文件重命名成Demo.zip,然后用解压软件打开。解压之后你会发现里面有一个classes.dex文件,如下图所示:

    这个classes.dex文件就是存放所有java代码的地方了,

    3、将classes.dex文件转换为jar

    我们将classes.dex文件拷贝到dex2jar解压后的目录下,打开cmd命令窗口,切换到解压后的dex2jar下,输入命令:d2j-dex2jar classes.dex 执行结果如下图所示:

    没有报任何错误,这就说明我们已经转换成功了。现在观察dex2jar目录,你会发现多了一个文件,如下图所示:

    可以看到,classes-dex2jar.jar这个文件就是我们借助工具之后成功转换出来的jar文件了。但是对于我们而言,jar文件也不是可读的,因此这里还需要再借助一下jd-gui这个工具来将jar文件转换成java代码。

    4、打开解压后的jd-gui-windows-1.4.0文件

    双击打开jd-gui.exe程序,如图

    5、把刚才生成的classes-dex2jar.jar这个文件直接拖过来

    结果如下图所示:

    OK,由此可见,我们的代码反编译工作已经成功了,MainActivity中的代码非常清晰,基本已经做到了90%以上的还原工作。但是如果想要做到100%的代码还原还是非常有难度的,因为像setContentView()方法传入的参数,其实就是一个资源的id值而已,那么这里反编译也就只能将相应的id值进行还原,而无法变成像R.layout.activity_main这样直观的代码展示。 另外,除了MainActivity之外,还有很多其它的代码也被反编译出来了,因为当前项目有引用support-v4和support-v7的包,这些引用的library也会作为代码的一部分被打包到classes.dex文件当中,因此反编译的时候这些代码也会一起被还原。 好的,学完了反编译代码,接下来我们看一下如何反编译资源。


    反编译资源

    其实细心的朋友可能已经观察到了,刚才Demo.apk的解压目录当中不是已经有资源文件了吗,有AndroidManifest.xml文件,也有res目录。进入res目录当中,内容如下图所示:

    这不是所有资源文件都在这里了么?其实这些资源文件都是在打包的时候被编译过了,我们直接打开的话是看不到明文的,不信的话我们打开AndroidManifest.xml文件来瞧一瞧,内容如下图所示:

    可以看到,这代码是完全没法阅读的。当然如果你去打开activity_main.xml看看,结果也不会好到哪儿去:

    由此可见,直接对APK包进行解压是无法得到它的原始资源文件的,因此我们还需要对资源进行反编译才行。 要想将APK文件中的资源反编译出来,又要用到另外一个工具了: apktool 这个工具用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。

    1、工具下载

    下载地址:ibotpeaches.github.io/Apktool/ins…
    网盘地址:pan.baidu.com/s/13_YUDVXx…

    关于这个工具的下载我还要再补充几句,我们需要的就是apktool.bat和apktool.jar这两个文件。目前apktool.jar的最新版本是2.3.1,这里我就下载最新的了,然后将apktool_2.3.1.jar重命名成apktool.jar,并将它们放到同一个文件夹下就可以了,如下图所示:

    2、解码

    接下来的工作就很简单了,我们将Demo.apk拷贝到和这两个文件同样的目录当中,然后cmd也进入到这个目录下,并在cmd中执行如下命令:apktool d Demo.apk 其中d是decode的意思,表示我们要对Demo.apk这个文件进行解码。那除了这个基本用法之外,我们还可以再加上一些附加参数来控制decode的更多行为:

    • -f如果目标文件夹已存在,则强制删除现有文件夹(默认如果目标文件夹已存在,则解码失败)。
    • -o指定解码目标文件夹的名称(默认使用APK文件的名字来命名目标文件夹)。
    • -s不反编译dex文件,也就是说classes.dex文件会被保留(默认会将dex文件解码成smali文件)。
    • -r不反编译资源文件,也就是说resources.arsc文件会被保留(默认会将resources.arsc解码成具体的资源文件)。

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

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

    3、错误分析

    当然即使你在和我执行一模一样的操作,也有可能会在这里反编译失败,比如说会报如下错误:

    出现这个错误的原因很有可能是你之前使用过apktool的老版本进行过反编译操作,然后apktool就会在你系统的C:\Users\Administrator\apktool\framework这个目录下生成一个名字为1.apk的缓存文件,将这个缓存文件删除掉,然后再重新执行反编译命令应该就可以成功了。 现在你会发现在当前目录下多了一个Demo文件夹,这个文件夹中存放的就是反编译的结果了。我们可以打开AndroidManifest.xml来瞧一瞧,如下图所示:

    怎么样?这样就完全能看得懂了吧,然后可以再到res/layout中看一下activity_main.xml文件,如下图所示:

    可以看到,activity_main.xml中的内容基本和源代码中的内容是一致的,外层是一个RelativeLayout,里面则是一个Button。你可以再到其它目录中去看一看别的资源,基本上都是可以正常还原的,这样我们就把反编译资源的方法也已经掌握了。

    作者

    小鱼儿211211

    文末

    感谢大家关注,分享Android干货,交流Android技术。
    对文章有何见解,或者有何技术问题,都可以在评论区一起留言讨论,我会虔诚为你解答。
    Android架构师系统进阶学习路线、58万字学习笔记、教学视频免费分享地址:我的GitHub
    也欢迎大家来我的B站找我玩,有各类Android架构师进阶技术难点的视频讲解,助你早日升职加薪。
    B站直通车:https://space.bilibili.com/544650554

    相关文章

      网友评论

        本文标题:【实用杂记】Android apk反编译查看源码、反编译资源文件

        本文链接:https://www.haomeiwen.com/subject/zetuhltx.html