分享好友 移动开发首页 频道列表

Android Apk 文件反编译和重新打包的过程分析

Android开发  2016-12-06 13:030

学习的方式有很多种,Read the fucking source code 绝对不失为最佳的方式。除了阅读 Android SDK 的源码,还能通过反编译 APK 的方式,阅读他人开发的应用源码。本文就来聊聊在 Mac 环境下如何借助第三方工具反编译 APK 压缩文件(通过爱加密、360加固等手段处理的 APK 文件除外),阅读源码、修改源码并重新打包成一个新的 APK 安装文件。

准备工具

本文描述的反编译手段需要借助三个工具,分别是:apktool、dex2jar 和 jd-gui,下面我一一介绍下他们的下载及配置过程。

apktool

  1. 打开 apktool 脚本链接网页 ,右键存储为一个命名为 apktool 的文件,记得不要添加任何格式后缀;

  2. 打开 apktool.jar 下载链接,下载最新版本,下载完成之后重命名为 apktool.jar;

  3. 打开命令行工具,使用 cp 命令将前面两步下载的 apktool 脚本文件和 apktool.jar 文件复制到 PC 的 /usr/local/bin 目录下 (复制前的文件至此可以删除),如:

    sudo cp apktool apktool.jar /usr/local/bin
    
  4. 使用 chmod 命令为上一步复制过去的两个文件添加可执行权限,如:

    chmod +x apktool apktool.jar
    
  5. 操作至此,便可以在任一路径下使用 apktool 命令了。现在,你就可以使用 apktool -version 命令检查以上过程是否配置正确。

有关 apktool 工具的详细信息,可以参考官网介绍: A tool for reverse engineering Android apk files

dex2jar

  1. 你可以从 softpedia 或者 sourceforge 网站找到 dex2jar 的 Mac 版下载链接,并解压缩;

  2. 同样使用 chmod 命令修改 sh 文件的用户权限,如:

    chmod a+x *.sh
    

jd-gui

softpedia 或者 http://jd.benow.ca/ 网站下载并解压缩即可,里面的 JD-GUI 文件便是阅读 jar 包的应用程序。

反编译 apk 资源文件

apk 文件就是一个压缩文件,通过解压缩工具便可以打开并解压缩。但是里面的资源文件,除了 drawable 图片资源,其他都是经过编译处理的二进制文件,什么也看不出来。

而使用 apktool 工具可以直接从 apk 文件中反编译出诸如 AndroidManifest.xml 、layout、strings 等资源文件,可以直接修改,供再次打包。如:

apktool d example.apk

反编译 java 源码文件

解压缩 apk 文件,可以看到 classes.dex 源码文件,可能不止一个。通过 dex2jar 工具可以将其转化为 jar 文件,并使用 jd-gui 工具打开并阅读应用源码。

第一步,dex2jar 操作,得到 classes-dex2jar.jar 文件。注意 d2j-dex2jar.sh 和 classes.dex 文件的路径,按需修改:

sh d2j-dex2jar.sh classes.dex

第二步,使用 jd-gui 打开 classes-dex2jar.jar 文件,便可以看到目标应用所用到的第三方 library 和 开发源码,如:

Android Apk 文件反编译和重新打包的过程分析

如果对方开发人员在工程中开启了混淆功能,将会增加你的阅读难度,不过仔细分析,也能找到一些蛛丝马迹,给予你一些“灵感”。

当然,也可以直接针对 apk 文件使用 dex2jar 命令获取 jar 文件,减少上述 apk 文件解压缩的这一步骤,如:

sh d2j-dex2jar.sh example.apk

重新打包 apk 安装文件

学会如何反编译 apk 文件后,我们还可以修改 apk 文件中的内容,比如应用名称、桌面图标,甚至是 Java 源码等,然后使用 apktool 工具重新打包,产生一个新的 apk 安装文件。

这里以修改应用名称和桌面图标为例,看看如何重新打包 apk 文件并安装至手机上。(此处仅供学习参考,勿作恶!)

第一步,使用前文介绍的反编译 apk 资源文件的方式得到反编译后的文件夹,打开 AndroidManifest.xml 文件,找到 application 标签的 label 和 icon 属性。这样,我们就知道在哪里修改对应的资源文件了;

第二步,找到对应的 drawable 图标文件和 strings 字符串资源,比如 ic_launcher.png 和 app_name,替换图标并修改字符串内容;

第三步,使用 apktool b files 命令编译打包,这里的 files 对应第一步反编译 apk 文件时得到的应用文件夹。执行完毕,便会得到一个新的 apk 文件;

注意:此时得到的 apk 文件是没有没有经过签名的,使用 adb install 命令安装时会得到一个失败提示:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]。

第四步,生成自己的签名文件。你可以选择使用 Android Studio -> Build -> Next -> Create New… 可视化操作界面生成一个新的签名文件,也可以直接使用 keytool 工具直接在终端工具上生成,如:

keytool -genkey -keystore example.keystore -keyalg RSA -validity 10000 -alias example

第五步,使用 jarsigner 工具为 apk 文件签名,签名过后得到的 apk 文件便可以使用 adb install 命令安装至连接到 PC 的安卓设备上了。签名命令如下:

jarsigner -verbose -keystore example.keystore -signedjar example-signed.apk example.apk example

注意:如果签名过后的 apk 文件依旧安装失败,可以试试在签名命令上加上 -digestalg SHA1 -sigalg MD5withRSA -tsa 参数。当然这里我在测试时没有添加该参数,但也能正常安装。

修改资源文件并重新打包还是比较简单的,但是修改 java 源码再重新打包就比较复杂了,特别是在改动较大的情况下。「鸿洋」大神有一篇文章,描述了如何反编译 apk 并为其添加启动页广告的过程,当然也没有涉及到原开发人员的 Java 源代码改动,详情可参考: Android 反编译初探 应用是如何被注入广告的

查看更多关于【Android开发】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
SDK热更之如何在SDK代码中自动插桩及如何生成补丁包
写在前面本文是SDKHotfix相关的SDK热更系列文章中的一篇,以下为项目及系列文章相关链接:SDKHotfix整体介绍:http://blog.bihe0832.com/sdk_hotfix_project.htmlSDKHotfix对应github地址:https://github.com/bihe0832/SDKHoxFix这篇文章主要介绍一下SDK热更

0评论2017-02-05358

ASimpleCache
ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。1、它可以缓存什么东西?普通的字符串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java对象,和 byte数据。2、它有什么特色?特色主要是

0评论2017-02-05376

原生App与javascript交互之JSBridge接口原理、设计与实现
前期调研调研对象:支付宝,微信,云之家调研文档:Android中JS与Java的极简交互库 SimpleJavaJsBridge设计需求阅读类型的业务功能页面需要由前端H5实现,需要做到服务端可控;页面界面更改减少重新发布新版本的频率;功能页面部分原型需求无法实现,需要原生

0评论2017-01-063119

RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例
之前写过一系列RxJava1的文章,也承诺过会尽快有RxJava2的介绍。无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨。所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家在使用RxJava的时候有一点点启发。对RxJava还不了解的同学可以先去看看

0评论2017-01-06508

使用Smalidea对无源码APK调试简介
阅读:8最近正好也用了Smalidea,就ZZ的原贴做一些补充。可调试APP如果Android的系统属性ro.debuggable等于1(用getprop ro.debuggable验证),则所有APP都可调试。如果ro.debuggable等于0,某APP的AndroidManifest.xml中有android:debuggable=”true”,该APP

0评论2017-01-06295

[Java] Retrofit2.0 如何进行GBK编码
对Retrofit + OkHttp还不熟悉的人可以点传送门,先看下这两个东西的使用。Retrofit:https://github.com/square/retrofitOkHttp:https://github.com/square/okhttp分析接口文档要求Post请求,字段使用GBK编码我们先按照Retrofit的规范和接口文档来写接口: @PO

0评论2016-12-231093

深入理解 final 在 Java 和 Android 中修饰局部变量的意义
在Android的日常编程中,我们会经常使用匿名内部类,比如给Button设置点击事件时,setOnClickListener(new OnClickListener(){...})。如果此时,我们需要在匿名内部类中外部方法中的局部变量,我们必须手动对将这个局部变量用final关键字修饰(在JDK1.8之后不

0评论2016-11-2371

从 Retrofit 源码学习 Java 的动态代理的使用
Retrofit 是当前 Android 最流行的 HTTP 网络库之一了,其使用方式比较特殊,是通过定义一个接口类,通过给接口中方法和方法参数添加注解的方式来定义网络请求接口。这种风格下定义一个网络接口变得很简单。不过 Retrofit 是如何使用一个接口的 Class 创建出

0评论2016-11-13181

更多推荐