apktool反编译和二次打包,jarsigner和apksigner进行签名

 

今天在尝试简单的反编译,但是网上资料多繁杂重复且存在不可行的方式,遂记下此收获

1.apktool反编译

反编译:

apktool d test.apk //apktool d XXX.apk

反编译test.apk文件,并且会在当前目录下生成test文件夹,其中,
res文件夹下存放的是反编译出来的所有资源,
smali文件夹下存放的是反编译出来的所有代码,
AndroidManifest.xml则是经过反编译还原后的manifest文件,
smali文件夹下的文件smali文件使用的是Android虚拟机所使用的寄存器语言。

二次打包:
apktool b test -o new_test.apk //apktool b XXX(反编译后的文件夹名称) -o newXXX.apk(新APP的名字)

会在当前目录下生成需重新签名的APK文件,无法安装到安卓系统上
可以使用Android Studio或者IDEA简单生成签名文件来签名,使用JDK自带的jarsigner来对APK签名

APK签名和jar包签名,两者原理流程差不多
对APK签名,既可用 JDK/bin/jarsigner.exe,
也可用 Android SDK/build-tools/版本号/apksigner.bat或者Android SDK/build-tools/版本号/lib/apksigner.jar

最新版下载地址:https://ibotpeaches.github.io/Apktool/install/

 

2.jarsigner签名

网上实例里包含算法名称,同时我想到在AS或者IDEA里生成秘钥的时候并没有指定算法,所以算法上的指定可能就是在这里,并且如果不指定话,似乎默认为RSA
使用IDEA生成密钥库123_key.jks,密码123456,别名(似乎是密钥链)key,别名密码123456(以下亲测可行,具体含义请看下面的参数说明)

(命令在java路径下:\jdk路径\bin\jarsigner.exe)
1.jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystrore 123_key.jks -storepass 123456 app.apk key
2.jarsigner -verbose -keystrore 123_key.jks -storepass 123456 app.apk key

验证是否签名成功:jarsigner -verify -verbose -certs new_test_aligned.apk

zipalign是一款对APK文件进行优化的工具。(该工具在/build-tools/目录下)
APK文件本质上是一个zip压缩文档,经过优化能使包内未压缩的数据有序的排列,从而减少应用程序运行时的内存消耗。在使用jarsigner对APK重签名之后,可以使用该工具优化已签名APK文件。

zipalign -v 4 in.apk out.apk //执行4字节对齐优化操作
zipalign -c -v 4 in.apk //检查当前APK是否已经执行过Align优化


注意:
1)签名文件,APK文件为完全路径不能有中文,空格,转译字符
2)签名前后的文件路径不能改
3)加密算法请参考官方文档自行选取,但是第一次选择了后后面不要再随意更换加密算法
4)在jdk7及以上版本中执行jarsigner命令时,务必添加上-digestalg SHA1 -sigalg MD5withRSA参数,以修改jdk7默认digest算法sha256为sha1,修复Android低版本(4.2以下)出现的问题。

C:\Users\悦>jarsigner -help
用法: jarsigner [选项] jar-file 别名
jarsigner -verify [选项] jar-file [别名...]

[-keystore <url>] 密钥库位置

[-storepass <口令>] 用于密钥库完整性的口令

[-storetype <类型>] 密钥库类型

[-keypass <口令>] 私有密钥的口令 (如果不同)

[-certchain <文件>] 替代证书链文件的名称

[-sigfile <文件>] .SF/.DSA 文件的名称

[-signedjar <文件>] 已签名的 JAR 文件的名称

[-digestalg <算法>] 摘要算法的名称

[-sigalg <算法>] 签名算法的名称

[-verify] 验证已签名的 JAR 文件

[-verbose[:suboptions]] 签名/验证时输出详细信息。
子选项可以是 all, grouped 或 summary

[-certs] 输出详细信息和验证时显示证书

[-tsa <url>] 时间戳颁发机构的位置

[-tsacert <别名>] 时间戳颁发机构的公共密钥证书

[-tsapolicyid <oid>] 时间戳颁发机构的 TSAPolicyID

[-tsadigestalg <算法>] 时间戳请求中的摘要数据的算法

[-altsigner <类>] 替代的签名机制的类名

[-altsignerpath <路径列表>] 替代的签名机制的位置

[-internalsf] 在签名块内包含 .SF 文件

[-sectionsonly] 不计算整个清单的散列

[-protected] 密钥库具有受保护验证路径

[-providerName <名称>] 提供方名称

[-providerClass <类> 加密服务提供方的名称
[-providerArg <参数>]]... 主类文件和构造器参数

[-strict] 将警告视为错误

 

3.apksigner签名

注:
APK调试签名的默认密钥库, 默认在C:\Users\用户名\.android
密钥库名: debug.keystore
密钥别名: androiddebugkey
密钥库密码: android

apksigner是一款在Android build tools 24.0.3及以上版本中提供的对apk文件签名以及验证签名信息的工具,它与jarsigner的作用类似,但比后者功能更加强大。注意在使用apksigner前,请先对APK执行zipalign,而不能在之后执行zipalign操作,这一点与jarsigner不同。(路径在build-tools\相应版本\apksigner.bat)

apksigner sign --ks release.jks app.apk //签名
apksigner verify --verbose app.apk //验证签名

 

4.更多信息

更多信息请自行查阅jarsigner.jar -help和apksigner.bat help

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值