Android Apk 文件反编译和重新打包的过程分析
GeoT25
8年前
<p>学习的方式有很多种,Read the fucking source code 绝对不失为最佳的方式。除了阅读 Android SDK 的源码,还能通过反编译 APK 的方式,阅读他人开发的应用源码。本文就来聊聊在 Mac 环境下如何借助第三方工具反编译 APK 压缩文件(通过爱加密、360加固等手段处理的 APK 文件除外),阅读源码、修改源码并重新打包成一个新的 APK 安装文件。</p> <h2><strong>准备工具</strong></h2> <p>本文描述的反编译手段需要借助三个工具,分别是:apktool、dex2jar 和 jd-gui,下面我一一介绍下他们的下载及配置过程。</p> <p><strong>apktool</strong></p> <ol> <li> <p>打开 apktool 脚本链接网页 ,右键存储为一个命名为 apktool 的文件,记得不要添加任何格式后缀;</p> </li> <li> <p>打开 apktool.jar 下载链接,下载最新版本,下载完成之后重命名为 apktool.jar;</p> </li> <li> <p>打开命令行工具,使用 cp 命令将前面两步下载的 apktool 脚本文件和 apktool.jar 文件复制到 PC 的 /usr/local/bin 目录下 (复制前的文件至此可以删除),如:</p> <pre> sudo cp apktool apktool.jar /usr/local/bin </pre> </li> <li> <p>使用 chmod 命令为上一步复制过去的两个文件添加可执行权限,如:</p> <pre> chmod +x apktool apktool.jar </pre> </li> <li> <p>操作至此,便可以在任一路径下使用 apktool 命令了。现在,你就可以使用 apktool -version 命令检查以上过程是否配置正确。</p> </li> </ol> <p><strong>dex2jar</strong></p> <ol> <li> <p>你可以从 softpedia 或者 sourceforge 网站找到 dex2jar 的 Mac 版下载链接,并解压缩;</p> </li> <li> <p>同样使用 chmod 命令修改 sh 文件的用户权限,如:</p> <pre> chmod a+x *.sh </pre> </li> </ol> <p><strong>jd-gui</strong></p> <p>从 softpedia 或者 http://jd.benow.ca/ 网站下载并解压缩即可,里面的 JD-GUI 文件便是阅读 jar 包的应用程序。</p> <h2><strong>反编译 apk 资源文件</strong></h2> <p>apk 文件就是一个压缩文件,通过解压缩工具便可以打开并解压缩。但是里面的资源文件,除了 drawable 图片资源,其他都是经过编译处理的二进制文件,什么也看不出来。</p> <p>而使用 apktool 工具可以直接从 apk 文件中反编译出诸如 AndroidManifest.xml 、layout、strings 等资源文件,可以直接修改,供再次打包。如:</p> <pre> apktool d example.apk </pre> <h2><strong>反编译 java 源码文件</strong></h2> <p>解压缩 apk 文件,可以看到 classes.dex 源码文件,可能不止一个。通过 dex2jar 工具可以将其转化为 jar 文件,并使用 jd-gui 工具打开并阅读应用源码。</p> <p>第一步,dex2jar 操作,得到 classes-dex2jar.jar 文件。注意 d2j-dex2jar.sh 和 classes.dex 文件的路径,按需修改:</p> <pre> sh d2j-dex2jar.sh classes.dex </pre> <p>第二步,使用 jd-gui 打开 classes-dex2jar.jar 文件,便可以看到目标应用所用到的第三方 library 和 开发源码,如:</p> <p style="text-align: center;"><img src="https://simg.open-open.com/show/bd6425857332555952a022674cb07ec5.png"></p> <p>如果对方开发人员在工程中开启了混淆功能,将会增加你的阅读难度,不过仔细分析,也能找到一些蛛丝马迹,给予你一些“灵感”。</p> <p>当然,也可以直接针对 apk 文件使用 dex2jar 命令获取 jar 文件,减少上述 apk 文件解压缩的这一步骤,如:</p> <pre> sh d2j-dex2jar.sh example.apk </pre> <h2><strong>重新打包 apk 安装文件</strong></h2> <p>学会如何反编译 apk 文件后,我们还可以修改 apk 文件中的内容,比如应用名称、桌面图标,甚至是 Java 源码等,然后使用 apktool 工具重新打包,产生一个新的 apk 安装文件。</p> <p>这里以修改应用名称和桌面图标为例,看看如何重新打包 apk 文件并安装至手机上。(此处仅供学习参考,勿作恶!)</p> <p>第一步,使用前文介绍的反编译 apk 资源文件的方式得到反编译后的文件夹,打开 AndroidManifest.xml 文件,找到 application 标签的 label 和 icon 属性。这样,我们就知道在哪里修改对应的资源文件了;</p> <p>第二步,找到对应的 drawable 图标文件和 strings 字符串资源,比如 ic_launcher.png 和 app_name,替换图标并修改字符串内容;</p> <p>第三步,使用 apktool b files 命令编译打包,这里的 files 对应第一步反编译 apk 文件时得到的应用文件夹。执行完毕,便会得到一个新的 apk 文件;</p> <p>注意:此时得到的 apk 文件是没有没有经过签名的,使用 adb install 命令安装时会得到一个失败提示:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]。</p> <p>第四步,生成自己的签名文件。你可以选择使用 Android Studio -> Build -> Next -> Create New… 可视化操作界面生成一个新的签名文件,也可以直接使用 keytool 工具直接在终端工具上生成,如:</p> <pre> keytool -genkey -keystore example.keystore -keyalg RSA -validity 10000 -alias example </pre> <p>第五步,使用 jarsigner 工具为 apk 文件签名,签名过后得到的 apk 文件便可以使用 adb install 命令安装至连接到 PC 的安卓设备上了。签名命令如下:</p> <pre> jarsigner -verbose -keystore example.keystore -signedjar example-signed.apk example.apk example </pre> <p>注意:如果签名过后的 apk 文件依旧安装失败,可以试试在签名命令上加上 -digestalg SHA1 -sigalg MD5withRSA -tsa 参数。当然这里我在测试时没有添加该参数,但也能正常安装。</p> <p>修改资源文件并重新打包还是比较简单的,但是修改 java 源码再重新打包就比较复杂了,特别是在改动较大的情况下。</p> <p> </p> <p>来自:http://yifeng.studio/2016/12/05/android-apk-decompile-and-repackaging/</p> <p> </p>