吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1043|回复: 7
收起左侧

[其他原创] php重写校友邦微信小程序签到加密逻辑

[复制链接]
lucien777 发表于 2024-7-17 12:31
前言介绍最近发现,校友邦的签到接口发生了变更,导致之前用于自动签到签退的PHP脚本无法正常工作。为了解决这个问题,我们进行了微信小程序的反编译分析,今天主要记录下校友邦微信小程序签到加密逻辑,并用PHP重写了加密,以便重新实现签到功能。解包分析
[JavaScript] 纯文本查看 复制代码
getTokenData: function(e, a) {
    // 定义一个包含62个数字和字母的数组t和一个包含0~61的数字的数组n
    for (var t = ["5", "b", "f", "A", "J", "Q", "g", "a", "l", "p", "s", "q", "H", "4", "L", "Q", "g", "1", "6", "Q", "Z", "v", "w", "b", "c", "e", "2", "2", "m", "l", "E", "g", "G", "H", "I", "r", "o", "s", "d", "5", "7", "x", "t", "J", "S", "T", "F", "v", "w", "4", "8", "9", "0", "K", "E", "3", "4", "0", "m", "r", "i", "n"], n = [], o = 0; o < 62; o++) n.push(o + "");
    // 获取当前时间戳
    var i = Math.round((new Date).getTime() / 1e3),
        // 对数组n进行乱序操作,截取前20个字符作为iArrStr属性的值
        r = function(e, a) {
            for (var t, n, o = e.slice(0), i = e.length, r = i - a; i-- > r;) t = o[n = Math.floor((i + 1) * Math.random())], o[n] = o[i], o[i] = t;
            return o.slice(r)
        }(n, 20),
        // 定义一个空字符串s,用于存储拼接后的属性值
        s = "";
    // 遍历数组r,将对应位置的字符从数组t中取出,拼接到字符串s中
    r.forEach((function(e, a) {
        s += t[e]
    }));
    // 定义一个空字符串d,用于存储拼接后的属性值
    var g, p = function(e) {
        for (var a = Object.keys(e).sort(), t = {}, n = 0; n < a.length; n++) t[a[n]] = e[a[n]];
        return t
    }(e),
    d = "";
    for (g in p) {
        if (-1 != ["content", "deviceName", "keyWord", "blogBody", "blogTitle", "getType", "responsibilities", "street", "text", "reason", "searchvalue", "key", "answers", "leaveReason", "personRemark", "selfAppraisal", "imgUrl", "wxname", "deviceId", "avatarTempPath", "file", "file", "model", "brand", "system", "deviceId", "platform", "code", "openId", "unionid"].indexOf(g) || l.test(p[g])) {
            continue;
        }
        d += p[g];
    }
    d += i,
    d = (d = (d = (d = (d = (d = (d = (d = (d += s).replace(/\s+/g, "")).replace(/\n+/g, "")).replace(/\r+/g, "")).replace(/</g, "")).replace(/>/g, "")).replace(/&/g, "")).replace(/-/g, "")).replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, ""),
    d = encodeURIComponent(d);
    return {
        md5: d = c.a.hexMD5(d),
        tstr: i,
        iArrStr: r && 0 < r.length ? r.join("_") : ""
    }
}
  • 数据定义和准备,定义了两个数组 t 和 n,分别包含了字符和数字,用于后续的字符串生成和乱序操作。
  • 获取时间戳,使用 Math.round((new Date).getTime() / 1e3) 获取当前时间戳,并将其存储在变量 i 中。
  • 乱序操作,使用 r 函数对数组 n 进行乱序,取前20个元素作为 iArrStr 属性的值。
  • 属性值处理,将输入对象 e 的属性按名称排序后,将其值拼接成一个字符串 d。在拼接过程中,排除了一些特定的属性名或者满足特定条件的属性值。
  • 字符串处理,对字符串 d 进行多次替换操作,移除空格、换行符、回车符、小于号、大于号、与号、连字符和特定表情符号。
  • 编码处理,使用 encodeURIComponent 对处理后的字符串 d 进行编码,确保其可以安全地用作 URL 的一部分。
  • 返回结果,返回一个对象,包含以下属性:md5:经过未明确定义的 c.a.hexMD5(d) 函数处理后的字符串 d 的 MD5 哈希值。tstr:当前时间戳 i。iArrStr:乱序后的数组 r 的字符串形式,用下划线连接。
例如最终得输出结果为:
{  md5: 'ec008344def5a714212dc44e627bdec5',  tstr: 1679473312,  iArrStr: '29_7_13_2_34_36_60_8_55_44_3_19_53_59_48_58_40_45_27_1'}总结一下功能就是实现在62 个字符中随机取出 20 个,来进行加密。php重写
[PHP] 纯文本查看 复制代码
function getHeaderToken($data){
        if (!is_array($data)) {
        return null;
    }
    $cookbook = ["5", "b", "f", "A", "J", "Q", "g", "a", "l", "p", "s", "q", "H", "4", "L", "Q", "g", "1", "6", "Q",
                 "Z", "v", "w", "b", "c", "e", "2", "2", "m", "l", "E", "g", "G", "H", "I", "r", "o", "s", "d", "5",
                 "7", "x", "t", "J", "S", "T", "F", "v", "w", "4", "8", "9", "0", "K", "E", "3", "4", "0", "m", "r",
                 "i", "n"];
    $except_key = ["content", "deviceName", "keyWord", "blogBody", "blogTitle", "getType", "responsibilities",
                   "street", "text", "reason", "searchvalue", "key", "answers", "leaveReason", "personRemark",
                   "selfAppraisal", "imgUrl", "wxname", "deviceId", "avatarTempPath", "file", "file", "model",
                   "brand", "system", "deviceId", "platform"];
    $indexes = range(0, count($cookbook) - 1);
    shuffle($indexes);
    $noce = array_slice($indexes, 0, 20);
    $now_time = time();
    $sign_str = "";
    ksort($data);
    foreach ($data as $k => $v) {
        $v = strval($v);
        if (!in_array($k, $except_key) && !preg_match('/[`~!@#$%^&*()+=|{}[\]:;",.<>\/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]/', $v)) {
            $sign_str .= $v;
        }
    }
    $sign_str .= strval($now_time);
    foreach ($noce as $index) {
        $sign_str .= $cookbook[$index];
    }
    $sign_str = preg_replace('/\s+/', '', $sign_str);
    $sign_str = preg_replace('/\n+/', '', $sign_str);
    $sign_str = preg_replace('/\r+/', '', $sign_str);
    $sign_str = str_replace('<', '', $sign_str);
    $sign_str = str_replace('>', '', $sign_str);
    $sign_str = str_replace('&', '', $sign_str);
    $sign_str = preg_replace('/\xEF\xBF\xBD/', '', $sign_str);
    $sign_str = urlencode($sign_str);
    $m = md5($sign_str);
    return [
        'n' => implode(',', $except_key),
        't' => strval($now_time),
        's' => implode('_', $noce),
        'm' => $m,
        'v' => '1.6.36'
    ];
}

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
gl1433223 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

7c丶陪你 发表于 2024-7-17 16:27
&#128077;,虽然我已经更新好了,写了Python 和 易语言版。  楼主写的莫有问题。
 楼主| lucien777 发表于 2024-7-17 17:04
7c丶陪你 发表于 2024-7-17 16:27
&#128077;,虽然我已经更新好了,写了Python 和 易语言版。  楼主写的莫有问题。

感谢烙铁
Sane0 发表于 2024-7-18 19:58
先收藏,后续有用再来。冒昧问一下,这个要怎么使用?
 楼主| lucien777 发表于 2024-7-19 08:13
Sane0 发表于 2024-7-18 19:58
先收藏,后续有用再来。冒昧问一下,这个要怎么使用?

这个是进行签到的请求头加密,抓包下包提交签到进行就可以了。
Sane0 发表于 2024-7-19 15:15
lucien777 发表于 2024-7-19 08:13
这个是进行签到的请求头加密,抓包下包提交签到进行就可以了。

ok,谢谢
alongzhenggang 发表于 2024-7-19 15:57
7c丶陪你 发表于 2024-7-17 16:27
&#128077;,虽然我已经更新好了,写了Python 和 易语言版。  楼主写的莫有问题。

这个 虽然 要考 圈起来
 楼主| lucien777 发表于 2024-7-21 09:02
alongzhenggang 发表于 2024-7-19 15:57
这个 虽然 要考 圈起来

我也上线到小程序上签到了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 13:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表