Apk去掉签名以及重新签名的方法

Android开发中很重要的一部就是用自己的密钥给Apk文件签名,不经过签名的Apk文件一般是无法安装的,就算装了最后也是失败。

网上流传的“勾选允许安装未知来源的应用”其实跟签不签名没啥关系,说白了就是允许安装不从电子市场上下载的应用而已。

近几日需要修改一个Apk中JNI调用的.so文件,苦于没有apk源代码,只好研究了一下签名相关的问题。当然有很多第三方工具可以做到,但其实JDK中已经提供了强大的签名工具jarsigner。

    1. 去除签名

      其实很简单,用WinRAR打开apk,找到META-INF文件夹,删除MANIFEST.MF之外的所有其他文件即可。

    2. 签名

      运行jarsigner,如果没有设置PATH环境变量,那可以从JDK安装路径下的bin目录中找到,比如我本机的就是C:\Program Files\Java\jdk1.8.0_31\bin\jarsigner.exe

      jarsigner用法如下:

      用法: 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
      
      [-altsigner <类>]           替代的签名机制的类名
      
      [-altsignerpath <路径列表>] 替代的签名机制的位置
      
      [-internalsf]               在签名块内包含 .SF 文件
      
      [-sectionsonly]             不计算整个清单的散列
      
      [-protected]                密钥库具有受保护验证路径
      
      [-providerName <名称>]      提供方名称
      
      [-providerClass <类>        加密服务提供方的名称
        [-providerArg <参数>]]... 主类文件和构造器参数
      
      [-strict]                   将警告视为错误

      比较常用的参数就是指定keystore的位置和签名后的文件,举例如下:

      jarsigner -keystore C:\myKey.key -signedjar apk-signed.apk apk-unsigned.apk myKey

      待签名的文件是apk-unsigned.apk,签名后的apk是apk-signed.apk。我们也可以不指定-signedjar参数,则在待签名的apk上直接签名。最后一个myKey是我的keystore的别名。

      签名完成后再用WinRAR打开,会发现META-INF目录下多了MYKEY.RSA和MYKEY.SF两个文件,他们分别是:
      MANIFEST.MF中保存了所有其他文件的SHA-1并base64编码后的值。
      MYKEY.SF中也有其他文件的SHA-1并base64编码的值,而且还多一个MANIFEST.MF文件的SHA-1并base64编码后的值
      MYKEY.RSA包含了公钥信息和发布机构信息
      后两个文件的名称和我的key别名转换为大写后一致。

这里要用到Android SDK中的一个工具jarsigner,只要配置了SDK环境变量就可以直接使用

 

方法一(推荐):

复制命令到记事本保存为apk-sign.bat后运行

set/p keystore_path=请输入.keystore的文件路径:
set/p alias_path=请输入keystore的alias:
set/p unsign_path=请输入待签名的apk文件路径:
set/p sign_path=请输入签名后生成的apk文件路径:
 
jarsigner -verbose -keystore %keystore_path% -signedjar %sign_path% %unsign_path% %alias_path%
 
pause

 运行后根据提示填上对应的信息,最后输入keystore的密码,提示jar 已签名,就大功告成了。

 

方法二:

除了方法一也可以在命令行里直接用一行命令解决,但需要4个参数:

①keystore文件路径

②签名后生成的apk路径

③待签名的apk路径

④alias别名

 

jarsigner -verbose -keystore keystore文件路径 -signedjar 签名后生成的apk路径 待签名的apk路径 别名

1.例如,我已有的.keystore文件在D:\app\keystore的目录下,名为demo.keystore

2.待签名的apk在D:\app\apk的目录下,文件名是unsign.apk

3.签名后会产生一个新的apk,然后我要让新apk也生成在D:\app\apk目录下

4.keystore里面可能会存在多个别名,所以要注明一下别名,这里我的别名就是demo

把这4个参数合成完整的命令就是:

jarsigner -verbose -keystore D:\app\keystore\demo.keystore -signedjar D:\app\apk\unsign.apkD:\app\apk\sign.apk demo

 

APK使用APKTOOL命令行进行解包和重新打包

在刚开始安卓逆向时遇到了一个很坑爹的问题,就是对apk进行反编译后不能重新打包, 查了一些资料,这里就简单说一下用apktool进行解包和打包的整个过程。

 

首先把一个apk和apktool放到同一目录下,打开shell(我这里是power shell,用平常的shell也一样),输入

java -jar .\apktool_2.3.0.jar d .\app-debug.apk -o QKSword

格式为:   java  -jar  apktool的名字  d(反编译)  要解包的apk  -o(输出)  文件名

 

成功后可以看到解包出来的文件夹,然后可以对内容进行修改

当我们修改完之后可以进行重新的打包,重新打包后的apk在要打包的文件夹里的dist目录下

 java -jar .\apktool_2.3.0.jar b .\QKSword\

 格式为: java  -jar  apktool的名字  b(打包)  要打包的文件夹名字

 

 

 最后的签名就建议大家用工具进行签名,这里主要讲的是对于文件的打包的问题,因为之前打包用了好多的工具都不行,最后用这个原始的方法才可以。

 

 

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
APK签名是为了保证应用程序的完整性和安全性,防止应用程序被篡改或者恶意注入代码。一般来说,APK签名分为两种:Debug签名和Release签名。 Debug签名是用于开发和测试应用程序的签名,其签名证书由Android SDK自动生成,不需要手动签名。而Release签名则需要开发者自己生成签名证书,并使用该证书对APK进行签名。 下面是Release签名的步骤: 1. 生成签名证书:使用keytool工具生成签名证书。在命令行中输入以下命令: keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000 其中,-keystore参数指定生成的签名证书的文件名和存放位置;-alias参数指定证书别名;-keyalg参数指定加密算法,这里使用RSA算法;-keysize参数指定密钥长度;-validity参数指定证书的有效期。 2. 为应用程序配置签名证书:在应用程序的build.gradle文件中配置签名证书信息。在android节点下添加如下代码: ```gradle signingConfigs { release { storeFile file("my-release-key.keystore") storePassword "your_store_password" keyAlias "your_key_alias" keyPassword "your_key_password" } } ``` 其中,storeFile参数指定签名证书的文件名和存放位置;storePassword参数指定密钥库的密码;keyAlias参数指定别名;keyPassword参数指定别名密码。 3. 使用签名证书对APK进行签名:在应用程序的build.gradle文件中添加如下代码: ```gradle buildTypes { release { signingConfig signingConfigs.release } } ``` 这样,当你使用Android Studio生成Release版本的APK时,就会使用你生成的签名证书对APK进行签名
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值