您的位置:首页 > 其它

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

2017-12-27 16:02 537 查看
今天在尝试简单的反编译,但是网上资料多繁杂重复且存在不可行的方式,遂记下此收获

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: