|
本帖最后由 小范q 于 2020-7-23 02:04 编辑
1. 前 言
-
前几天有人给我发了个该App推荐注册的邀请链接,抱着学习态度,研究该链接是如何生成。邀请链接如下:
https://xxxx.com/activity/NewProvinceGiftLink/index.html?k1=-a-3b-0++41&k2=703ig82h8e7e73g411969j25eeh9j8j3&k3=500000&k4=500100&k5=500120&k6=ACT20191110&s=80wz0f&l=76409dfa762b786747df54aa2372f5a2&from=singlemessage
2. 参数分析
-
2.1 抓包后看到如下zip数据包
-
2.2 下载该Zip链接 解压后 看到如下网页文件
-
2.3 使用 HBuilder X 打开项目,并且搜索 “NewProvinceGiftLink/index.html”
-
2.4 往上搜索 定位到 链接参数生成代码
function() {
var t = this;
this.codeData = {}, this.codeData.k1 = this.initData.realMobile, this.codeData.k2 = this.initData.userId,
this.codeData.k3 = this.initData.provinceId, this.codeData.k4 = this.initData.cityId, this.codeData.k5 =
this.initData.districtId, this.codeData.k6 = "ACT20191110", this.codeData.s = Math.random().toString(36).substr(
3, 6);
var e = {
encry: this.codeData.k1
};
uexCore.changeP_encry(JSON.stringify(e), function(e) {
t.codeData.k1 = e.data.P_encry.replace(/\(/g, "a").replace(/\)/g, "b"), t.m1 = e.data
});
var r = {
encry: this.codeData.k2
};
uexCore.changeT_encry(JSON.stringify(r), function(e) {
t.codeData.k2 = e.data.T_encry, t.m2 = e.data
}), setTimeout(function() {
var e = t.codeData.k1 + t.codeData.k2 + t.codeData.k3 + t.codeData.k4 + t.codeData.k5 + t.codeData.k6 + t.codeData
.s;
t.codeData.l = (0, h.default)(e), t.newData = "k1=" + t.codeData.k1 + "&k2=" + t.codeData.k2 + "&k3=" + t.codeData
.k3 + "&k4=" + t.codeData.k4 + "&k5=" + t.codeData.k5 + "&k6=" + t.codeData.k6 + "&s=" + t.codeData.s +
"&l=" + (0, h.default)(e), t.config.value = t.sh + "/tuijianfenxiangxy/html/invitationWrite.html?" + t.newData
}, 100)
}
-
2.5 邀请链接参数分析
参数 |
加密前参数 |
机密算法分析 |
k1 |
this.initData.realMobile(手机号) |
changeP_encry(realMobile) |
k2 |
userId(userId) |
changeT_encry(userId) |
k3 |
provinceId(省Id) |
明文 |
k4 |
cityId(城市Id) |
明文 |
k5 |
districtId(区id) |
明文 |
k6 |
ACT20191110 |
固定值 |
l |
k1+k2+..+k6+s |
MD5 对所有参数校验 |
s |
随机6位字符串 |
(加盐) |
-
2.6 HBuilder X 中 全文搜索 k1, k2 实现的加密算法 changeP_encry / changeT_encry,并未查找到对应的实现方法。猜想该算法的实现应该在 app 的java 层进行实现,通过安卓的内置浏览器 EBrowserView 进行数据相互交互;
-
2.7 使用 jeb 反编译 该app (App存在加固,自行脱壳哈),并搜索 关键字 changeP_encry / changeT_encry;果然定位到该算法的实现方法
- changeT_encry 加解密 实现方法
3. 使用 python3 实现 电力分享链接生成
import base64
import binascii
import hashlib
import json
import string
import time
import jsonpath
import requests
import random
class ZsdlShare(object):
def __init__(self):
self.host = 'https://osg-static.sgcc.com.cn'
self.phone = "13812345678"
self.userId = "1234567890"
def __base_ranstr(self, nums):
"""
获取随机字符串
:param nums: 获取长度
:return:
"""
salt = ''.join(random.sample(string.ascii_letters + string.digits, nums))
return salt
def md5(self, data):
return hashlib.md5(data.encode()).hexdigest()
def change_num_decry(self, dnc_str):
"""
手机号解密
:param dnc_str:
:return:
"""
return dnc_str.replace("_", "\\\\u").replace("a", "(").replace("b", ")").replace("4", "5").replace("3",
"6").replace(
"2", "7").replace("1", "8").replace(
"0", "9").replace("+", "0").replace("-", "1").replace(")", "2").replace("(", "3").replace("*", "4")
def change_num_encry(self, enc_str):
"""
手机号加密
:param enc_str:
:return:
"""
return enc_str.replace("\\\\u", "_").replace("0", "+").replace("1", "-").replace("2", ")").replace("3",
"(").replace(
"4", "*").replace("5", "4").replace("6", "3").replace("7", "2").replace("8", "1").replace("9", "0").replace(
"(", "a").replace(")", "b")
def id_encrypt(self, user_id):
"""
用户User_id加密
:param user_id:
:return:
"""
v2 = []
for item in user_id:
temp_int = int(ord(item))
if item.isdigit():
temp_int += 3
if temp_int > 57:
temp_int -= 10
elif item.islower():
temp_int += 4
if temp_int > 122:
temp_int -= 26
v2.append(chr(temp_int))
return "".join(v2)
def id_dncry_For_New(self, dnc_str):
"""
UserId 解密
:param dnc_str
:return:
"""
v2 = []
for item in dnc_str:
temp_int = int(ord(item))
if item.isdigit():
if temp_int < 51:
temp_int += 10
temp_int -= 3
elif item.islower():
if temp_int < 101:
temp_int += 26
temp_int -= 4
v2.append(chr(temp_int))
return "".join(v2)
def get_shares(self):
"""
:return:
"""
base_url = self.host + '/activity/NewProvinceGiftLink/index.html?k1={0}&k2={1}&k3={2}&k4={3}&k5={4}&k6={5}&s={6}&l={7}'
k1 = self.change_num_encry(self.phone)
k2 = self.id_encrypt(self.userId)
k3 = "500000"
k4 = "500100"
k5 = "500120"
k6 = "ACT20191110"
s = self.__base_ranstr(6).lower()
l = self.md5(k1 + k2 + k3 + k4 + k5 + k6 + s).lower()
return base_url.format(k1, k2, k3, k4, k5, k6, s, l)
if __name__ == '__main__':
print(ZsdlShare().get_shares())
|
评分
-
查看全部评分
|