赞
踩
https://blog.csdn.net/weixin_37639900/article/details/108872307
Apktool是一个逆向android非常有用的工具,可以用来反编译apk文件,并且能在修改部分资源文件后,重新打包成一个新的apk。
将Android的包dex文件转换成jar文件,此时拿到的时字节码文件一般和jd-gui结合使用,将字节码文件转成对应的源码
将dex2jar中的jar(字节码)文件转成源码,既可以查看源码也可以进行修改。
我的需求只涉及修改版本号,而不需要修改源代码,只需要通过apktool工具反编译拿到资源文件、修改版本号、重新回编打包成apk、内存对齐以及重签名 下面详细介绍apktool的使用过程,dex2jar和jd-gui的使用将单起一篇文章进行介绍。
首先下载一个最新版的apktool.jar
新建一个apktool.bat脚本 放入如下内容:
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
chcp 65001 2>nul >nul
java -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0\apktool.jar" %*
新建bat文件很简单直接将txt文件另存为.bat文件即可
对apk包进行反编译,将apk包和bat文件(apktool.jar)放到同一个文件夹下,目的是为了输入方便,只需要输入相对路径即可,如果不放到同一个文件夹下,每次输入命令都要输入绝对路径。
在cmd终端,cd到此目录下,输入以下命令:
**
注意
* outDir :表示反编译后的资源文件存放到哪个目录下
* source.apk :表示要进行反编译的apk文件名称
*/
apktool.bat d -o outDir source.apk
或者也可以通过下面的命令反编译两者实现的效果都是相同的
java -jar apktool.jar d -f source.apk -o outDir
执行完成后就会在当前目录下生成outDir文件夹存放反编译后生产的资源文件
有了这个outDir就能修改里面的东西了,最难修改的部分就是java代码,这里对应的是smali相关的文件夹,需要了解一些smali的语法才行。
修改应用版本号只需要修改apktool.yml即可,apktool.yml文件中找到versionCode,修改里面的versionCode对应的值保存即可。
然后就是再使用下面的命令行,可以将我们的outDior文件夹重新编译成一个apk文件,也就是下面命令中的new_no_singnalign.apk
**
注意
* new_no_singnalign.apk :新生成的apk文件,此apk文件没有签名和对齐
* outDir :将outDir的文件进行编译
*/
apktool.bat b -o new_no_signalign.apk outDir
此处简单介绍一下Android用的签名工具,以及V1(Jar Signature) V2(Full APK Signature)两种签名
在AS打包Build->Generate signed apk… 打包签名过程中,可以看到两种签名选项 V1(Jar Signature) V2(Full APK Signature),从Android 7.0开始, 谷歌增加新签名方案 V2 Scheme (APK Signature);但Android 7.0以下版本, 只能用旧签名方案 V1 scheme (JAR signing)
V1签名:
V2签名:
V2签名优点很明显:
签名更安全(不能修改压缩包)
签名验证时间更短(不需要解压验证),因而安装速度加快
注意: apksigner工具默认同时使用V1和V2签名,以兼容Android 7.0以下版本
位于Android SDK/build-tools/SDK版本/zipalign.exe zipalign;是对zip包对齐的工具,使APK包内未压缩的数据有序排列对齐,从而减少APP运行时内存消耗
zipalign -v 4 in.apk out.apk //4字节对齐优化
zipalign -c -v 4 in.apk //检查APK是否对齐
非常重要:
在此处介绍一下v1和v2签名以及zipalign内存对齐,至于先签名后对齐,还是先对齐后签名与你采用的签名方是有关系,
1:zipalign可以在V1签名后执行,但zipalign不能在V2签名后执行,只能在V2签名之前执行!!!
2:如果不好记你就记住一个原则就是:先对齐后签名
有了上面概念理论介绍,接下来就直奔主题进行实操了,接下来我就按照先对齐后签名的方式分别用V1和V2进行签名,至于V1签名的先签名后对齐的方式不在这里描述了,感谢兴趣的自己可以试试。
我们可以通过zipalign -c -v 4 new_no_signalign.apk //检查APK是否对齐
此命令执行完成后可以看到 Verification FAILED,表示没有对齐。
通过zipalign -v 4 new_no_signalign.apk new_align.apk //4字节对齐优化
jarsigner -verbose -keystore android.zhumu.keystore -signedjar (签名后的apk路径及名称) (要给谁签名.apk路径 ) 签名文件的别名
运行上面的命令后需要先输入签名文件的密码才能生成签名文件, 最终生成的singnedv1.apk就是我们最终要用的apk文件。
cd到Android SDK/build-tools/SDK版本/目录下, 输入命令 apksigner sign --ks 密钥库名 --ks-key-alias 密钥别名 --out 生成的签名文件路径及名称 给哪个apk文件签名
注意:
1:上面面参数中 密钥库名、给哪个apk文件签名 需要给出绝对路径,要不就报错早找不到文件,因为在当前目录下没有签名文件和要进行签名的apk文件
2:而生成的签名文件路径及名称 如果不指定路径就生成在当前目录下
生成的singnedV2.apk就是最终要用的APK,注意4和5是两种签名方式用哪一种都可以。
方案1只支持校验v1签名:
keytool -printcert -jarfile singnedv1.apk //此命令只支持校验v1签名
方案2支持v1和v2的签名校验:
apksigner verify -v --print-certs (apk地址)
需要切cd 到apksigner所在的目录
如:apksigner verify -v --print-certs C:\Users\tiansc\Desktop\apks\signedV2.apk
需要用到aapt工具看看新的apk的版本号是不是真的修改成功了,
输入下面的命令分别对singnedv1.apk
和signedV2.apk
分别进行查看
aapt dump badging 要验证的apk
如:
aapt dump badging singnedv1.apk
aapt dump badging signedV2.apk
而在我们平时工作中关于APK的打包以及签名都由AS工具可视化一键完成了,逆向开发这块需要对APK的打包签名的流程有较为深刻的理解,只有这样才能一步一步的手动完成反编译、打包、签名的整个过程。
本文章只是着重介绍了反编译工具apktool的使用,至于dex2jar和 jd-gui工具将会另起一篇文章进行详细介绍,敬请关注!!!
最后附上反编译工具的下载地址
Android反编译工具集合一键全消,akktool反编译获取资源文件、dex2jar将dex文件转成jar
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。