douyin网页版登录加密分析(一)

douyin网页版登录加密分析(一),第1张

网址: aHR0cHM6Ly93d3cuZG91eWluLmNvbQ==

输入账号: 15112348765

输入密码: 123456

先不考虑登录前的滑块, 抖音滑块后面再分析, 本文主要分析登录时提交的参数

一. 抓包

请求方式为: POST

POST的字段有mix_mode、account、password、account_type、service、fixed_mix_mode

在请求地址中也携带了一些GET参数: aid、account_sdk_source、language、msToken、Bogus、_signature

本文主要分析account和password的加密

二. js调试 方法一: XHR断点

寻找可以的方法, 不妨进入第一个n.accountLoginV2中下断看看

运气比较好, 直接就找到了加密位置

整理一下红框处的代码:

o = z(
    T(
        {
            account: e.account,
            password: e.password,
            account_type: void 0 === t ? 0 : t,
            service: e.service
        }, 
        void 0 === r ? {} : r
    ), 
    ["account", "password"]
);

先断到这里看看

不是T函数, 那一定就是z函数了

跟到里面看看


)]

稍微分析一下就可以知道账号和密码的加密函数都是N

断到N处

对账号加密的时候在账号前面加了个+86

然后对明文的ASCII码进行了简单的变换

方法二: 字段搜索

直接搜索password:

逐个进入, 然后在文件中继续搜索, 全部打上断点

三. 扣JS代码

这个加密方法比较容易, js代码都不需要动, 直接拿出来就行, 或者也可以用python代码进行改写

function encrypt(e) {
    var t, n = [];
    if (void 0 === e)
        return "";
    t = function(e) {
        for (var t, n = e.toString(), r = [], o = 0; o < n.length; o++)
            0 <= (t = n.charCodeAt(o)) && t <= 127 ? r.push(t) : 128 <= t && t <= 2047 ? (r.push(192 | 31 & t >> 6),
                                                                                          r.push(128 | 63 & t)) : (2048 <= t && t <= 55295 || 57344 <= t && t <= 65535) && (r.push(224 | 15 & t >> 12),
                    r.push(128 | 63 & t >> 6),
                    r.push(128 | 63 & t));
        for (var i = 0; i < r.length; i++)
            r[i] &= 255;
        return r
    }(e);
    for (var r = 0, o = t.length; r < o; ++r)
        n.push((5 ^ t[r]).toString(16));
    return n.join("")
}
四. 使用python实现加密
import execjs

def encrypt(str):
    ctx = execjs.compile("""
        function encrypt(e) {
            var t, n = [];
            if (void 0 === e)
                return "";
            t = function(e) {
                for (var t, n = e.toString(), r = [], o = 0; o < n.length; o++)
                    0 <= (t = n.charCodeAt(o)) && t <= 127 ? r.push(t) : 128 <= t && t <= 2047 ? (r.push(192 | 31 & t >> 6),
                                                                                                r.push(128 | 63 & t)) : (2048 <= t && t <= 55295 || 57344 <= t && t <= 65535) && (r.push(224 | 15 & t >> 12),
                            r.push(128 | 63 & t >> 6),
                            r.push(128 | 63 & t));
                for (var i = 0; i < r.length; i++)
                    r[i] &= 255;
                return r
            }(e);
            for (var r = 0, o = t.length; r < o; ++r)
                n.push((5 ^ t[r]).toString(16));
            return n.join("")
        }
    """)

    return ctx.call("encrypt", str)


def main():
    print(encrypt("+86 15112348765"))
    print(encrypt("123456"))

if __name__ == '__main__':
    main()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1298554.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存