🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### 13.4.2 使用apktool对apk进行二次打包 在13.4.1节中介绍了dex2jar和jd-gui的使用方式,通过它们可以将一个dex文件反编译为Java代码,但是它们无法反编译出apk中的二进制数据资源,但是采用apktool就可以做到这一点。apktool另外一个常见的用途是二次打包,也就是常见的山寨版应用。将官方应用二次打包为山寨应用,这是一种不被提倡的行为,甚至是违法的,建议开发者不要去这么做,但是掌握以下二次打包的技术对于个人技术的提高还是很有意义的。apktool同样有多个版本,这里同样只介绍Windows版和Linux版,apktool是一个命令行工具,它的使用方式如下所示。这里仍然拿13.1节中的示例程序为例,假定apk的文件名为CrashTest.apk。 Linux(Ubuntu) 解包:./apktool d -f CrashTest.apk CrashTest。 二次打包:./apktool b CrashTest CrashTest-fake.apk。 签名:java -jar signapk.jar testkey.x509.pem testkey.pk8 CrashTest-fake.apk CrashTest-fake-signed.apk。 Windows 解包:apktool.bat d -f CrashTest.apk CrashTest。 二次打包:apktool.bat b CrashTest CrashTest-fake.apk。 签名:java -jar signapk.jar testkey.x509.pem testkey.pk8 CrashTest-fake.apk CrashTest-fake-signed.apk。 需要注意的是,由于Windows系统的兼容性问题,有时候会导致apktool.bat无法在Windows的一些版本上正常工作,比如Windows 8,这个时候可以安装Cygwin,然后采用Linux的方式来进行打包即可。除此之外,部分apk也可能会打包失败,以笔者的个人经验来说,apktool在Linux上的打包成功率要比Windows高。 这里对上面的二次打包的命令稍作解释,解包命令中,d表示解包,CrashTest.apk表示待解包的apk, CrashTest表示解包后的文件的存储路径,-f表示如果CrashTest目录已经存在,那么直接覆盖它。 打包命令中,b表示打包,CrashTest表示解包后的文件的存储路径,CrashTest-fake.apk表示二次打包后的文件名。通过apktool解包以后,可以查看到apk中的资源以及smali文件,smali文件是dex文件反编译(不同于dex2jar的反编译过程)的结果。smali有自己的语法并且可以修改,修改后可以被二次打包为apk,通过这种方式就可以修改apk的执行逻辑,显然这让山寨应用变得十分危险。需要注意的是,apk经过二次打包后并不能直接安装,必须要经过签名后才能安装。 签名命令中,采用signapk.jar来完成签名,签名后生成的apk就是一个山寨版的apk,因为签名过程中所采用的签名文件不是官方的,最终CrashTest-fake-signed.apk就是二次打包形成的一个山寨版的apk。对于本文中的例子来说,CrashTest-fake-signed.apk安装后其功能和正版的CrashTest.apk是没有区别的。 在实际开发中,很多产品都会做签名校验,简单的二次打包所得到的山寨版apk安装后无法运行。尽管如此,还是可以通过修改smali的方式来绕过签名校验,这就是为什么市面上仍然有那么多的山寨版应用的原因。一般来说山寨版应用都具有一定的危害性,我们要抵制山寨版应用以防止自己的财产遭受到损失。关于smali的语法以及如何修改smali,这就属于比较深入的话题了,本节不再对它们进行深入的介绍,感兴趣的话可以阅读逆向方面的专业书籍,也可以阅读笔者之前写的一篇介绍应用破解的文章:http://blog.csdn.net/singwhatiwanna/article/details/18797493。