【讨论】APP的免填邀请码解决方案

00x0 具体需求


app中已注册的用户分享一个含有邀请码的二维码,分享到朋友圈
新用户在朋友圈打开这个这个链接下载app.
新用户安装后打开app后就自动绑定邀请码
要求用户不填写任何东西

 朋友老板出差给出的需求,感觉挺有意思……搞搞!

00x1 初步分析

    1.APP

    2.无填写

    3.打开APP自动绑定邀请码

    新用户没有填写任何信息,也就是说没有任何有效标识能够识别该用户,我们最好的办法就是从其他地方寻找有效标识,必要时可添加一个标识……

00x2 解决方案

    想了很多,从其他地方寻找有效标识虽然可行但不稳定,所以我们只能添加一个标识了,那我们在哪添加标识呢?APK!对,只有APK是我们能够掌握的。

    先了解一下APK的结构:

    APK其实就是一个压缩文件,但是与平常的压缩文件有所不同,将后缀名改为zip打开后我们就可以看到如上结构。

    Assets目录,这是存放静态文件的目录,嗯哼?静态文件意味着我们可以任意修改的,可以说是对APK进行了一次简单的反编译。

    我们在Assets目录放一个txt文件,暂且命名为key.txt,里面放上邀请码,然后用APP启动后读取该静态文件就可以知道是谁邀请的了。

00x3 实现

    我们先写好一个app然后编译打包签名,得到一个APK文件,我们将该APK文件后缀改为ZIP留之待用,新用户通过邀请链接到达下载页面,后台取得请求中的邀请码将其写出为一个新的key.txt,然后将key.txt加入到ZIP文件覆盖原key.txt(待用的ZIP里可以不放key.txt),将ZIP的后缀改为APK后提供给用户下载。


<?php 

/* 

php 添加一个文件到zip压缩文件中 

参考代码
来源:https://www.jb51.net/article/62099.htm?tdsourcetag=s_pcqq_aiomsg

*/

$zip = new ZipArchive; 

if ($zip->open('app.zip') === TRUE) {//app.zip 是已经存在的zip文件,注意中文文件名要注意编码问题 

    $zip->addFile('key.txt');//添加新的文件 具体路径自己来呗

    $zip->close(); 

    echo 'ok'; 

} else { 

    echo 'failed'; 

} 

?>

00x4 问题

    由于之前使用的安卓模拟器进行的测试所以在后续进行实机测试时才发现修改后的APK无法正常安装。

    原因

谷歌的签名验证机制

Android 7.0之前的apk签名为v1方案(Jar Signature),Android 7.0之后推出了V2方案,且7.0之前是不支持V2的。

所以,我们之前那样直接修改后是不能直接用的(我使用的安卓模拟器没有签名验证),因此我们需要对我们修改后的APK再进行一次签名。

00x5 问题解决方案

使用Android studio自带的sdk中的apksigner.jar再次签名

apksigner具体使用文档: https://developer.android.com/studio/command-line/apksigner

apksigner sign --ks 签名文件 --ks-key-alias 证书名(别名) --ks-pass pass:签名密码 --key-pass pass:密匙密码 --out ouput.apk(输出路径) input.apk(输入路径)

    或者使用jarsigner进行签名

jarsigner  -verbose  -keystore [您的私钥存放路径] -signedjar [签名后文件存放路径] [未签名的文件路径] [您的证书名称]

#jarsigner的参数说明

-keystore 参数指定您的私钥的绝对路径,例如: C:\Users\wz\Desktop\sign_verification\abcAndroidKey.jks

-signedjar 参数指定签名后apk文件存放绝对的路径,例如 C:\Users\wz\Desktop\sign_verification\oppoemptyapk-      release-signed.apk

[未签名的文件路径] 指定要签名apk文件的绝对路径,也就是从要认领应用的平台下载到的,例如  C:\Users\wz\Desktop\sign_verification\oppoemptyapk-release-unsigned.apk

[您的证书名称] 是指您创建密钥时,您设置的证书名称,其实就是签名中的别名(即:keyAlias)

posted @ 2021-10-15 14:09  SomUrim  阅读(1043)  评论(0)    收藏  举报