apk反编译和重新打包

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apk反编译和重新打包相关的知识,希望对你有一定的参考价值。

参考技术A 操作系统:Mac OS X
软件:apktool

进入官网 https://ibotpeaches.github.io/Apktool/ ,点击官网首页的install( https://ibotpeaches.github.io/Apktool/install/ )进入安装指南,里面有Windows,Linux和Mac的安装方法,不同的操作系统按不同的步骤来就可以了。

在终端输入: apktool d xxx.apk ,我在反编译时出现了以下错误:

看提示是无法写入到这个目录 /Users/xxx/Library/apktool/framework (xxx为电脑用户名),那就在 /Users/xxx/Library 下新建apktool文件夹,并在apktool文件夹下再新建个framework文件夹,然后为了保险起见设置新建文件夹到权限,在终端输入: chmod -R 777 /Users/xxx/Library/apktool
接着再重新执行反编译命令就可以成功了,在xxx.apk相同目录下会出现反编译后的文件夹。

在终端输入编译命令: apktool b xxx (xxx为刚才反编译的文件夹),成功后会在xxx文件夹下的dist文件夹下生成打包好后的apk文件

现在打包好后的apk是没有签名的,所以无法安装,现在给apk签名

20000为时间,这个设置长点就好了,-keystore后面是签名文件保存路径。输入命令按回车键会让输入密码等信息,按提示输入,不要忘了密码,签名时要用。
2.接着在终端输入:

-keystore后面的为签名文件的路径,-signedjar后面为签名好后apk的存放路径,在这个后面的一个为需要签名的pak的路径,最后的android.keystore为证书的别名,如果不知道别名,可以在终端输入: keytool -list -v -keystore /Users/xxx/Desktop/android.keystore 查看具体信息,里面有别名。
这一步还要注意,签名文件和需要签名的apk要在同一目录下。

安卓apk反编译修改重新打包签名全过程

首先明确,反编译别人apk是一件不厚道的事情。代码是程序员辛苦工作的成果,想通过这种手段不劳而获,是不对的。这也说明,代码混淆是非常重要的。本文抱着学习的态度,研究在一些特殊的情况下如果有需要,该怎么反编译apk。

工具简介
apktool,编译和反编译apk,从apk中提取图片和布局资源

dex2jar,将可运行文件classes.dex反编译为jar源码文件

jd-gui,查看jar源码文件

反编译
apktool安装
Windows系统:
1. 首先确保系统安装有Java
2. 下载apktool.bat脚本
3. 下载最新版本的apktool.jar,并且重命名为apktool.jar
4. 将apktool.bat和apktool.jar放在同一目录下,就可以在命令行窗口使用了。
5. 其他系统请参考链接

用法
可以直接在命令行执行apktool.bat查看帮助。这里介绍两个最常用的:

反编译
apktool.bat d -o <output_dir> test.apk
1
其中<output_dir>指定输出目录,默认为apk.out。

编译
apktool.bat b -o <output.apk> <input_dir>
1
其中<input_dir>就是上面反编译输出的目录,<ouput.apk>是编译的输出结果,默认为dist/<name>.apk。

示例
一个典型的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.bat classes.dex
1
会生成由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 -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
1
各个参数解释如下:

-genkey 产生证书文件
-alias 产生别名
-keystore 指定密钥库的.keystore文件中
-keyalg 指定密钥的算法,这里指定为RSA(非对称密钥算法)
-validity 为证书有效天数,这里我们写的是40000天

输入上述命令后,会有如下的提示:

 

输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
  [Unknown]:  test
您的组织单位名称是什么?
  [Unknown]:  test
您的组织名称是什么?
  [Unknown]:
您所在的城市或区域名称是什么?
  [Unknown]:
您所在的州或省份名称是什么?
  [Unknown]:
该单位的两字母国家代码是什么
  [Unknown]:
CN=test, OU=test, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗?
  [否]:  y


输入<demo.keystore>的主密码
        (如果和 keystore 密码相同,按回车):

  

签名apk
jarsigner也存在于Java JDK的安装包当中,所以安装好了Java环境的话,可以直接在命令行使用。

jarsigner -verbose -keystore demo.keystore demo.apk demo.keystore
1
-verbose 指定生成详细输出
-keystore 指定数字证书存储路径

这样,就完成了对一个apk的签名过程,然后就可以安装使用了。注意如果你的手机上原来就有这个apk,需要卸载掉。因为新apk的签名已经改变了。

from:https://blog.csdn.net/dreamer2020/article/details/52761606

以上是关于apk反编译和重新打包的主要内容,如果未能解决你的问题,请参考以下文章

安卓apk反编译修改重新打包签名全过程

一步一步带你反编译apk,并教你修改smali和重新打包

利用apktool反编译apk,并且重新签名打包

Android 反编译Apk,修改资源,重新打包,签名发布

Android 反编译Apk,修改资源,重新打包,签名发布

Android反编译和二次打包