**1、**反编译java代码首先需要下载**dex2jar**这个工具,下载地址:[https://sourceforge.net/projects/dex2jar/files/](https://sourceforge.net/projects/dex2jar/files/)
目前最新版是2.0, 下载完后并解压缩。 2、将要反编译的apk文件重命名为zip格式并解压缩,注意其中的classes.dex文件,它存放了全部的java代码,将classes.dex文件拷贝到dex2jar解压后的根目录下。 **3、**打开cmd,进入dex2jar解压后的根目录,执行命令:
**
d2j-dex2jar classes.dex
如下图:

<div class="image-caption">
dex2jar
</div>
命令执行完后在对应目录下会生成<strong>classes-dex2jar.jar**文件

<div class="image-caption">
jar文件
</div>
**4、**要查看java代码,还需要下载**jd-gui**这个工具,下载地址:[http://jd.benow.ca/](http://jd.benow.ca/),目前最新版是1.4.0,下载完后解压缩,并用**jd-gui.exe**打开上边反编译出来的jar文件:

<div class="image-caption">
java code
</div>
到此,已经顺利的反编译出了java代码
那资源文件呢,再回头看一下刚才apk文件对应的解压缩文件,所有的xml文件都是乱码,例如AndroidManifest.xml:

<div class="image-caption">
AndroidManifest.xml
</div>
当然要还原原始的资源文件还是有办法的,继续往下看。
二、反编译资源
**1、**要反编译apk中的资源文件,就需要**apktool**这个工具了,下载地址:[http://ibotpeaches.github.io/Apktool/install/](http://ibotpeaches.github.io/Apktool/install/),进入下载页面:

<div class="image-caption">
apktool download
</div>
按照图中1、2两条的提示,下载**apktool.bat和apktool.jar**这两个文件,目前最新的apktool是2.1.1,并放到同一文件夹:

<div class="image-caption">
apktool
</div>
,
**2、**将要反编译的apk文件放到apktool文件夹,打开cmd,进入apktool文件夹目录,执行命令:
**
apktool d test.apk
如下图:

<div class="image-caption">
apktool d test.apk
</div>
执行成功后,在当前目录下会生成一个<strong>test**文件夹:

<div class="image-caption">
test文件夹目录
</div>
其中,res文件夹下存放的是反编译出来的所有资源,smali文件夹下存放的是反编译出来的所有代码,AndroidManifest.xml则是经过反编译还原后的manifest文件。smali文件夹下的文件smali文件使用的是Android虚拟机所使用的寄存器语言,如果看的懂smail文件的话,就可以修改源代码的逻辑了,好可怕的事…当然这不是我们重点讨论的。
此时查看AndroidManifest.xml文件,发现已经成功反编译出来了:

<div class="image-caption">
AndroidManifest.xml
</div>
三、重新打包
**1、**既然资源文件已经顺利的反编译出来了,那我们就可以适当的修改点东西了,例如换个图标啥的、改下布局文件等,这里我们将AndroidManifest.xml中的**channel**值改为**10001**,然后开始重新打包,同样在cmd中切换到apktool文件夹目录,执行命令:
**
apktool b test -o new_test.apk
如下图:

<div class="image-caption">
重新打包
</div>
执行成功后,在当前目录会生成一个新的<strong>new_test.apk**文件:

<div class="image-caption">
new_test.apk
</div>
**2、**但是呢,这个apk文件目前并不能安装,因为需要重新签名。没有签名文件的话,通过Android Studio可以很简单的生成一个哦,将准备好的签名文件放到apktool文件夹根目录,继续在cmd执行命令:
**
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名
如下图:

<div class="image-caption">
jarsigner start
</div>

<div class="image-caption">
jarsigner success
</div>
注意,其中jarsigner命令文件是存放在jdk的bin目录下的,需要将bin目录配置在系统的环境变量中才可以在任何位置执行此命令。
3、签名完成后,建议对APK文件进行一次对齐操作,这样可以使得程序在Android系统中运行得更快,对齐操作使用的是zipalign工具,该工具在
**
zipalign 4 new_test.apk new_test_aligned.apk
执行成功后,会生成一个对齐后的<strong>new_test_aligned.apk**文件:

<div class="image-caption">
new_test_aligned.apk
</div>
**4、**最后可以通过如下命令验证apk签名是否成功:
**
jarsigner -verify -verbose -certs new_test_aligned.apk
如下图:

<div class="image-caption">
verify start
</div>

<div class="image-caption">
verify success
</div>
到这里apk反编译及重新打包流程就介绍完毕了。
<strong>以上用到的工具也可以在此下载哦:[反编译及二次打包工具](http://download.csdn.net/detail/shehuan320_/9551427)**
转载:http://www.jianshu.com/p/792a08d5452c
安卓apk反编译、修改、重新打包、签名全过程
首先明确,反编译别人apk是一件不厚道的事情。代码是程序员辛苦工作的成果,想通过这种手段不劳而获,是不对的。这也说明,代码混淆是非常重要的。本文抱着学习的态度,研究在一些特殊的情况下如果有需要,该怎么反编译apk。
工具简介
apktool,编译和反编译apk,从apk中提取图片和布局资源
dex2jar,将可运行文件classes.dex反编译为jar源码文件
jd-gui,查看jar源码文件
反编译
apktool安装
Windows系统:
- 首先确保系统安装有Java
- 下载apktool.bat脚本
- 下载最新版本的apktool.jar,并且重命名为apktool.jar
- 将apktool.bat和apktool.jar放在同一目录下,就可以在命令行窗口使用了。
- 其他系统请参考链接
用法
可以直接在命令行执行apktool.bat查看帮助。这里介绍两个最常用的:
反编译
`apktool<span class="hljs-preprocessor">.bat</span> d -o <output_dir> test<span class="hljs-preprocessor">.apk</span>`
其中<output_dir>指定输出目录,默认为apk.out。
编译
`apktool.bat b -o <span class="hljs-tag"><<span class="hljs-title">output.apk</span>></span> <span class="hljs-tag"><<span class="hljs-title">input_dir</span>></span>`
其中<input_dir>就是上面反编译输出的目录,<ouput.apk>是编译的输出结果,默认为dist/
示例
一个典型的apktool反编译的结果如下:
此时,可以查看AndroidManifest.xml,res及smali文件了。甚至可以修改这个目录下的资源文件或者smali文件,然后重新编译。
值得注意的是,apktool反编译出来只能得到apk的smali文件,即汇编语言版本,并不能得到源代码。
查看源码
一. 这里需要用到另外两个工具,下载dex2jar并解压。下载jd-gui,这是一个带UI的应用程序。
二. 将需要反编译的apk的后缀名改为.zip或者.rar,然后解压到一个文件夹,得到其中的classes.dex文件。
三. 将classes.dex复制到解压后的dex2jar-2.0文件夹下。从命令行进入到该目录,执行
`d2j-dex2jar<span class="hljs-preprocessor">.bat</span> classes<span class="hljs-preprocessor">.dex</span>`
会生成由classes.dex反编译得到的jar文件,classes-dex2jar.jar。
四. 然后使用jd-gui打开classes-dex2jar.jar,就可以查看源码了。
如果apk在发布的时候加过混淆处理,那么我们也只能得到混淆后的版本。想通过阅读源码来破解别人的apk,还是有一些难度的。
修改代码
如果只是修改apk相应的资源,例如图片,比较好办,在res文件夹下找到相应的文件替换就可以。
修改代码比较麻烦,因为反编译出来的结果中只有smali文件,即Java虚拟机支持的汇编语言。
如果确实需要修改代码,就得对照smali文件和从classes.dex反编译出来的源码了,按照smali的规范来改动即可。相当于写汇编,这个难度比较大。
重新打包
使用apktool编译前面反编译生成的目录即可。
签名
签名是对要发布的apk文件作标记,确保你的apk文件有唯一的身份归属认证,只有相同签名和相同包名的文件才可以覆盖安装并保留用户信息。
对于反编译的apk,我们可以通过jarsigner来对它进行签名。
生成keystore文件
首先,签名需要keystore文件,可以使用keytool工具生成,一般Java环境都带有keytool命令,可以在命令行测试。
`keytool <span class="hljs-attribute">-genkey</span> <span class="hljs-attribute">-alias</span> demo<span class="hljs-built_in">.</span>keystore <span class="hljs-attribute">-keyalg</span> RSA <span class="hljs-attribute">-validity</span> <span class="hljs-number">40000</span> <span class="hljs-attribute">-keystore</span> demo<span class="hljs-built_in">.</span>keystore`
各个参数解释如下:
-genkey 产生证书文件
-alias 产生别名
-keystore 指定密钥库的.keystore文件中
-keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法)
-validity 为证书有效天数,这里我们写的是40000天
输入上述命令后,会有如下的提示:
的主密码
(如果和 keystore 密码相同,按回车):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
" data-snippet-id="ext.ce951cbdba2d3ebc4e65523849d95030" data-snippet-saved="false" data-codota-status="done">`输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
[Unknown]: test
您的组织单位名称是什么?
[Unknown]: test
您的组织名称是什么?
[Unknown]:
您所在的城市或区域名称是什么?
[Unknown]:
您所在的州或省份名称是什么?
[Unknown]:
该单位的两字母国家代码是什么
[Unknown]:
CN=test, OU=test, <span class="hljs-keyword">O</span>=Unknown, L=Unknown, ST=Unknown, <span class="hljs-keyword">C</span>=Unknown 正确吗?
[否]: y
输入<demo.keystore>的主密码
(如果和 keystore 密码相同,按回车):`
签名apk
jarsigner也存在于Java JDK的安装包当中,所以安装好了Java环境的话,可以直接在命令行使用。
`jarsigner -verbose -keystore demo<span class="hljs-preprocessor">.keystore</span> demo<span class="hljs-preprocessor">.apk</span> demo<span class="hljs-preprocessor">.keystore</span>`
-verbose 指定生成详细输出
-keystore 指定数字证书存储路径
这样,就完成了对一个apk的签名过程,然后就可以安装使用了。注意如果你的手机上原来就有这个apk,需要卸载掉。因为新apk的签名已经改变了。
💬 评论