1.反编译与重编译

工具:apktool
下载地址:https://ibotpeaches.github.io/Apktool/
环境:Java (JRE 1.7)
安装步骤:参考官网(也可以不安装,直接使用java -jar apktool.jar 命令) ,具体如下图所示
反编译命令:java -jar apktool.jar d xxx.apk --frame-path <指定框架资源保存路径>
重编译命令:java -jar apktool.jar b <反编译出来的文件夹> --frame-path <指定框架资源保存路径>
作用:资源文件的获取,可以提取出图片文件和布局文件进行查看

1.1 反编译

打开终端指向apktool根目录,输入以下命令即可完成反编译:

java -jar apktool.jar d xxx.apk

如上图所示日志中出现了一个警告:

S: WARNING: Could not write to (C:\Users\Administrator\AppData\Local\apktool\fra
mework), using C:\Users\ADMINI~\AppData\Local\Temp\ instead...
S: Please be aware this is a volatile directory and frameworks could go missing,
please utilize --frame-path if the default storage directory is unavailable

大致意思是默认保存框架资源的文件夹不可用。如果不想这个警告输出,可以在命令后面加上参数--frame-path重新指定保存框架资源的文件夹。

java -jar apktool.jar d xxx.apk --frame-path <指定框架资源保存路径>

成功反编译的话可以看到如下日志并生成一个和apk名字一样的文件夹(与apktool.jar同一目录)以及在指定目录生成的1.apk文件。

这样我们就可以根据需求对mainfest.xml等文件做相应的修改了(比如增加权限等)。

随着反编译的流行,为了保证自己的产品不会变成满天飞的山寨应用,更多的企业选择了混淆编译以及将核心逻辑编译成.so等方法,以防止别人的反编译。

1.2 重编译

接下来我们就需要进行重编译,同样是使用Apktool工具。在终端输入:
java -jar apktool.jar b <反编译出来的文件夹> --frame-path <指定框架资源保存路径>

重编译成功的话会在文件夹中看到build和dlist文件夹,重新编译成功的apk就保存在dlist文件夹中。但是这个apk目前还不能正常安装,原因是该apk还是未签名状态(unsign)。

2.签名

工具:re-sign.jar
下载地址:https://pan.baidu.com/s/1i3H0tKD
前提:.SDK;.C:\Users\Administrator\.android\debug.keystore文件
作用:将apktool重编译的应用变成带有签名证书的应用

接下来我们就说说Android应用的签名。

在Eclipse的设置中点击Android标签中的Build选项,可以看到Eclipse中Android工程默认的签名都是Android ADT自带的debug签名,如图所示。

同样地,右击一个项目,选择Android Tools中的Export Signed APPlication Package,能够成功创建所选签名证书的应用apk。

而需要让一个没有签名的应用程序签上名的话,需要工具re-sign.jar。

下载后双击打开,界面如下图所示。

将重编译出来的apk文件拖到上图界面上,选择保存路径后,弹出下图所示消息提示签名成功。

另外,由此提示消息也可以得知此apk包的package name和main activity。

此时会生成一个<apk name>_debug.apk文件,可以将其安装到模拟器或真机上测试。

问题1:在打开re-sign.jar时可能会弹出如下消息。

解决方法:在环境变量中配置ANDROID_HOME为sdk路径,并将ANDROID_HOME添加到Path中。

问题2:签名后的apk包安装失败。

可能原因:重签名的原理就是去除apk正式签名,使用系统自带的 debug.keystore默认签名进行再次签名。因为re-sign.jar默认的 debug.keystore 在C盘/用户/.android/debug.keystore下,而后来Android SDK更新后 debug.keystore存在于SDK目录/.android/debug.keystore,导致C盘/用户/.android/目录下缺少debug.keystore文件。

解决方法:在C盘/用户/.android/目录下创建一个debug.keystore文件即可。

创建debug.keystore的方法(参考这里):
在cmd下,进入C:\Users\Administrator\.android目录执行命令如下:
keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000
输入密码,用户等信息确认后便可生成一个debug.keystore。

最后,我在github上找到了一个re-sign.jar的优化版本apkReSign,大家也可以尝试使用。
https://github.com/pengwei1024/apkReSign

3.查看源代码 

工具1:dex2jar
下载地址:https://sourceforge.net/projects/dex2jar
反编译命令:d2j-dex2jar.bat xxx.apk
作用:将apk反编译成java源代码 工具2:JD-GUI
下载地址:http://jd.benow.ca/
使用方法:双击打开,将<apk name>-dex2jar.jar文件直接拖进去即可查看
作用:查看apk中的源代码

在dex2jar根目录处打开命令窗口,输入以下命令进行反编译:

d2j-dex2jar.bat xxx.apk

成功之后会生成<apk name>-dex2jar.jar文件。

接着使用JD-JUI打开<apk name>-dex2jar.jar文件,就能够直接看到应用程序的代码,如下图所示。

APK反编译、重编译、签名、查看源码的更多相关文章

  1. VS反编译查看源码时,会把类实现的所有接口都直接显示

    今天在看ArrayList,发现一个很有意思的问题.从VS里反编译看,ArrayList继承了ICollection. IEnumerable.IList和ICloneable,而IList又继承了I ...

  2. 解决AndroidKiller APK 反编译失败,无法继续下一步源码反编译!

    报错背景 今天使用AndroidKiller V1.3.1,反编译一个APK,遇到如下报错: 当前 Apktool 使用版本:Android Killer Default APKTOOL 正在反编译 ...

  3. C#代码反编译 得到项目可运行源码

    C#代码反编译 得到项目可运行源码 摘自:http://www.cnblogs.com/know/archive/2011/03/15/1985026.html 谈到"C#代码反编译&quo ...

  4. Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正

    Android逆向之旅---反编译利器Apktool和Jadx源码分析以及错误纠正 http://blog.csdn.net/jiangwei0910410003/article/details/51 ...

  5. JDK源码重新编译——支持eclipse调试JDK源码--转载

    最近在研究jdk源码,发现debug时无法查看源码里的变量值. 因为sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar. 下面这六步是编译jdk的具体步骤: Step 1:   ...

  6. 编译Docker<v1.9.0>源码和初级安装

    本文主要介绍了如何在POWER CPU处理器上编译和安装Docker服务.很多时候,我们都需要自己编译Docker源码,有的时候是由于自己的处理器没有对应的安装包,有的时候是由于当前的新版本还有发布, ...

  7. Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)

    一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk  主要采用的是静态方式,步骤也很简单,首先使用 ...

  8. Ubuntu14 搭载vim环境查看源码

    首先是下载完整的vim74,然后编译安装.遗憾的是当编译时,没有开启图形界面. 在安装新版本的Vim之前,你需要卸载原来安装的老版本Vim,依次在终端下执行下列命令: sudo apt-get rem ...

  9. 解决eclipse为什么不能查看源码

    Java eclipse中查看源代码ctrl+左键单击 一.你是第一次使用该功能,没有导入项目源码,故无法查看源码 解决方法: ​1.点 “window“-> “Preferences”-> ...

  10. ReentrantLock(重入锁)的源码解析

    转自:从源码角度彻底理解ReentrantLock(重入锁)](https://www.cnblogs.com/takumicx/p/9402021.html)) 公平锁内部是FairSync,非公平 ...

随机推荐

  1. php文件缓存方法总结

    为大家分享很全的php文件缓存,供大家参考,具体内容如下 <?php class cache {  private static $_instance = null;    protected ...

  2. aws平台中为ec2实例添加双网卡

    亚马逊平台创建ec2实例时默认创建一个网卡primary网卡,主网卡是不能分离的. 在ec2服务控制台为ec2附加网卡. 平台资料中为正在使用的ec2添加网卡用到的操作系统是Amazon Linux ...

  3. MySql按字段分组取最大值记录 [此博文包含图片]

      要求:获得按table1_id分组,并且age最大的记录信息,即2.3.5条     方法一: select * from (select * from table2 order by age d ...

  4. php实现多域名共享session会话

    php会话机制参考:我的随笔 缘起 网站,通常会有多个服务器,多个子域名,每个节点运行着不同模块.有时为了整体体验,用户用同一个用户名.密码浏览整站,不用重复登录.这时候就需要多服务器共享sessio ...

  5. 离线安装 Android 4.0 SDK

    现在 4.0 的SDK已经可以下载, 开发者应该立刻去下载安装最新的SDK,然后打开4.0的模拟器 在上面测试自己的程序是否能够正常运行. 对于下载SDK比较慢的用户, 可以直接使用其他下载工具(比如 ...

  6. day10 十 函数、形参和实参

    一.形参和实参 1.形参:在函数定义()中出现的参数形参就是拷贝实参的值,随着函数的调用才产生,随着函数调用结束而销毁 def fn(a, b, c): print(a) print(b) print ...

  7. 第一次java程序测试感受

    第一次JAVA程序设计测试,检验了一个暑假的成果.显而易见,我做的并不是很好,程序最起码的输入输出以及方法的定义还是没有问题的,但是考到了文件输入输出便看出来了.对于文件的输入输出,虽然我预习到那里, ...

  8. MySQL的一些概念

    数据库与服务器.客户端的层次关系 关于数据库 程序中需要存储数据的方式: 1 变量(列表.元组.集合.字典.嵌套) 2 外存(文件)(*.ini) 3 表格.Excel(*.xls.*.xlsx.*. ...

  9. LITTLE-ENDIAN(小字节序、低字节序) BOM——Byte Order Mark 字节序标记 数据在内存中的存放顺序

    总结: 1. endian 字节存放次序 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了). 2. LITTLE-ENDIA ...

  10. radio样式的写法,单选和多选如何快速的改变默认样式,纯CSS,

    一.纯CSS写法改变单选框的默认选择样式,用背景图片代替 input[type='radio']:radio:before { content: '';//这里需要有 width: 20px; hei ...