腾讯qq空间GET登陆JS分析

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 腾讯QQ空间作为腾讯的社交核心产品之一在登陆的安全设置上没有用变态的技术都是常规策略。可能是因为该产品内容上的价值对于用户而言重要但是对于他人来说并不重要。老规矩首先抓个包试试看看那登陆请求有哪些字段u:2551513277@qq.

腾讯QQ空间作为腾讯的社交核心产品之一,在登陆的安全设置上没有用变态的技术,都是常规策略。可能是因为该产品内容上的价值对于用户而言重要,但是对于他人来说并不重要。


老规矩首先抓个包试试看看那登陆请求有哪些字段

u:2551513277@qq.com
verifycode:!NNT
pt_vcode_v1:0
pt_verifysession_v1:e02e02eecdb805b45ce122cde11c229d62be175396694ebe18c4f39b3491e5f7845b10c499d60bc42ad9ff81768d860401fbf1871932aacd
p:xeOyBOEajC3l2pBFTuB6EGzMpGaIMGpL5rOkK3s6qe3ExEc1QB8xZIojs2wFvNVIElBAAvEP5ap0kbLGmTDgkRWU0vPYTvM8mVbYpYcCsxc9DwJXbpIVNQk0a8R4fg4jdMiKKtvri4SsNXFjIgr5NMQb*3OaB06ynyg2Xd2jcEo0CxmUx-eoKSpSb6vzUbNrlJSuo1DtFHZDINXcGtnLxARgMy35Km7BzXrKgkNj2uuOoKD1aXd*Cx5pMpDxXbUtmTc1TAA5PI1qKUElnihIGeZ8M35F9r07dsB0M0D5a9T-QVXIBsYCr0N8ecUEkFCOC2zSZy0z1xsDMlyNdcBV9Q__
pt_randsalt:2
u1:https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone
ptredirect:0
h:1
t:1
g:1
from_ui:1
ptlang:2052
action:3-19-1548851060420
js_ver:10291
js_type:1
login_sig:
pt_uistyle:40
aid:549000912
daid:5


粗略分析我们就知道哪些字段比较难搞了,u是用户名、verifycode是类似验证码的东西、pt_verifysession_v1类似id的字符串、p就应该是密码了。


我们分析的重点在verifycode、pt_verifysession_v1、P三个字段了,然后再看post请求之前的请求,发现了一个有价值的get请求:

返回如下:

ptui_checkVC('0','!NNT','\x00\x00\x00\x00\x98\x15\x00\xbd',
'e02e02eecdb805b45ce122cde11c229d62be175396694ebe18c4f39b3491e5f7845b10c499d60bc42ad9ff81768d860401fbf1871932aacd','2')


很好,这个get请求已经返回verifycode、pt_verifysession_v1参数,那我们需要重点分析的是password的加密方式了。再看这个请求的参数:

其中appid是来自html源码中的,那就是时候获得这两个参数并没有太大问题。


继续看password,查找发出该请求的相应js位置

if ("login" == t) {
            i.u = encodeURIComponent(pt.plogin.at_account),
            i.verifycode = $("verifycode").value,
            pt.plogin.needShowNewVc ? i.pt_vcode_v1 = 1 : i.pt_vcode_v1 = 0,
            i.pt_verifysession_v1 = pt.plogin.pt_verifysession || $.cookie.get("verifysession");
            var n = $("p").value;
            pt.plogin.armSafeEdit.isSafe && (n = pt.plogin.armSafeEdit.safepwd),
            i.p = $.Encryption.getEncryption(n, pt.plogin.salt, i.verifycode, pt.plogin.armSafeEdit.isSafe),
            i.pt_randsalt = pt.plogin.isRandSalt || 0,
            window.TDC && TDC.getInfo && TDC.getInfo().tokenid && (i.pt_jstoken = TDC.getInfo().tokenid)
        }


p= $.Encryption.getEncryption(n, pt.plogin.salt, i.verifycode, pt.plogin.armSafeEdit.isSafe),其中n是输入的密码,pt.plogin.salts是特殊的字符串、i.verifycode是verifycode字段、pt.plogin.armSafeEdit.isSafe为空。


再看加密的函数

 $.Encryption = $pt.Encryption = function() {
    function t(t{
        return e(t)
    }
    function e(t{
        return u(i(c(t), t.length * m))
    }
    function i(t, e{
        t[e >> 5] |= 128 << e % 32,
        t[14 + (e + 64 >>> 9 << 4)] = e;
        for (var i = 1732584193, n = -271733879, l = -1732584194, c = 271733878, u = 0; u < t.length; u += 16) {
            var g = i
              , d = n
              , h = l
              , f = c;
            i = o(i, n, l, c, t[u + 0], 7-680876936),
            c = o(c, i, n, l, t[u + 1], 12-389564586),
            l = o(l, c, i, n, t[u + 2], 17606105819),
            n = o(n, l, c, i, t[u + 3], 22-1044525330),
            i = o(i, n, l, c, t[u + 4], 7-176418897),
            c = o(c, i, n, l, t[u + 5], 121200080426),
            l = o(l, c, i, n, t[u + 6], 17-1473231341),
            n = o(n, l, c, i, t[u + 7], 22-45705983),
            i = o(i, n, l, c, t[u + 8], 71770035416),
            c = o(c, i, n, l, t[u + 9], 12-1958414417),
            l = o(l, c, i, n, t[u + 10], 17-42063),
            n = o(n, l, c, i, t[u + 11], 22-1990404162),
            i = o(i, n, l, c, t[u + 12], 71804603682),
            c = o(c, i, n, l, t[u + 13], 12-40341101),
            l = o(l, c, i, n, t[u + 14], 17-1502002290),
            n = o(n, l, c, i, t[u + 15], 221236535329),
            i = p(i, n, l, c, t[u + 1], 5-165796510),
            c = p(c, i, n, l, t[u + 6], 9-1069501632),
            l = p(l, c, i, n, t[u + 11], 14643717713),
            n = p(n, l, c, i, t[u + 0], 20-373897302),
            i = p(i, n, l, c, t[u + 5], 5-701558691),
            c = p(c, i, n, l, t[u + 10], 938016083),
            l = p(l, c, i, n, t[u + 15], 14-660478335),
            n = p(n, l, c, i, t[u + 4], 20-405537848),
            i = p(i, n, l, c, t[u + 9], 5568446438),
            c = p(c, i, n, l, t[u + 14], 9-1019803690),
            l = p(l, c, i, n, t[u + 3], 14-187363961),
            n = p(n, l, c, i, t[u + 8], 201163531501),
            i = p(i, n, l, c, t[u + 13], 5-1444681467),
            c = p(c, i, n, l, t[u + 2], 9-51403784),
            l = p(l, c, i, n, t[u + 7], 141735328473),
            n = p(n, l, c, i, t[u + 12], 20-1926607734),
            i = r(i, n, l, c, t[u + 5], 4-378558),
            c = r(c, i, n, l, t[u + 8], 11-2022574463),
            l = r(l, c, i, n, t[u + 11], 161839030562),
            n = r(n, l, c, i, t[u + 14], 23-35309556),
            i = r(i, n, l, c, t[u + 1], 4-1530992060),
            c = r(c, i, n, l, t[u + 4], 111272893353),
            l = r(l, c, i, n, t[u + 7], 16-155497632),
            n = r(n, l, c, i, t[u + 10], 23-1094730640),
            i = r(i, n, l, c, t[u + 13], 4681279174),
            c = r(c, i, n, l, t[u + 0], 11-358537222),
            l = r(l, c, i, n, t[u + 3], 16-722521979),
            n = r(n, l, c, i, t[u + 6], 2376029189),
            i = r(i, n, l, c, t[u + 9], 4-640364487),
            c = r(c, i, n, l, t[u + 12], 11-421815835),
            l = r(l, c, i, n, t[u + 15], 16530742520),
            n = r(n, l, c, i, t[u + 2], 23-995338651),
            i = s(i, n, l, c, t[u + 0], 6-198630844),
            c = s(c, i, n, l, t[u + 7], 101126891415),
            l = s(l, c, i, n, t[u + 14], 15-1416354905),
            n = s(n, l, c, i, t[u + 5], 21-57434055),
            i = s(i, n, l, c, t[u + 12], 61700485571),
            c = s(c, i, n, l, t[u + 3], 10-1894986606),
            l = s(l, c, i, n, t[u + 10], 15-1051523),
            n = s(n, l, c, i, t[u + 1], 21-2054922799),
            i = s(i, n, l, c, t[u + 8], 61873313359),
            c = s(c, i, n, l, t[u + 15], 10-30611744),
            l = s(l, c, i, n, t[u + 6], 15-1560198380),
            n = s(n, l, c, i, t[u + 13], 211309151649),
            i = s(i, n, l, c, t[u + 4], 6-145523070),
            c = s(c, i, n, l, t[u + 11], 10-1120210379),
            l = s(l, c, i, n, t[u + 2], 15718787259),
            n = s(n, l, c, i, t[u + 9], 21-343485551),
            i = a(i, g),
            n = a(n, d),
            l = a(l, h),
            c = a(c, f)
        }
        return 16 == v ? Array(n, l) : Array(i, n, l, c)
    }
    function n(t, e, i, n, o, p{
        return a(l(a(a(e, t), a(n, p)), o), i)
    }
    function o(t, e, i, o, p, r, s{
        return n(e & i | ~e & o, t, e, p, r, s)
    }
    function p(t, e, i, o, p, r, s{
        return n(e & o | i & ~o, t, e, p, r, s)
    }
    function r(t, e, i, o, p, r, s{
        return n(e ^ i ^ o, t, e, p, r, s)
    }
    function s(t, e, i, o, p, r, s{
        return n(i ^ (e | ~o), t, e, p, r, s)
    }
    function a(t, e{
        var i = (65535 & t) + (65535 & e);
        return (t >> 16) + (e >> 16) + (i >> 16) << 16 | 65535 & i
    }
    function l(t, e{
        return t << e | t >>> 32 - e
    }
    function c(t{
        for (var e = Array(), i = (1 << m) - 1, n = 0; n < t.length * m; n += m)
            e[n >> 5] |= (t.charCodeAt(n / m) & i) << n % 32;
        return e
    }
    function u(t{
        for (var e = _ ? "0123456789ABCDEF" : "0123456789abcdef", i = "", n = 0; n < 4 * t.length; n++)
            i += e.charAt(t[n >> 2] >> n % 4 * 8 + 4 & 15) + e.charAt(t[n >> 2] >> n % 4 * 8 & 15);
        return i
    }
    function g(t{
        for (var e = [], i = 0; i < t.length; i += 2)
            e.push(String.fromCharCode(parseInt(t.substr(i, 2), 16)));
        return e.join("")
    }
    function d(t, e{
        if (!(Math.random() > (e || 1)))
            try {
                var i = location.protocol + "//ui.ptlogin2.qq.com/cgi-bin/report?id=" + t;
                document.createElement("img").src = i
            } catch (t) {}
    }
    function h(e, i, n, o{
        n = n || "",
        e = e || "";
        for (var p = o ? e : t(e), r = g(p), s = t(r + i), a = TEA.strToBytes(n.toUpperCase(), !0), l = Number(a.length / 2).toString(16); l.length < 4; )
            l = "0" + l;
        TEA.initkey(s);
        var c = TEA.encrypt(p + TEA.strToBytes(i) + l + a);
        TEA.initkey("");
        for (var u = Number(c.length / 2).toString(16); u.length < 4; )
            u = "0" + u;
        var h = $pt.RSA.rsa_encrypt(g(u + c));
        return setTimeout(function() {
            d(4883581)
        }, 0),
        btoa(g(h)).replace(/[\/\+=]/gfunction(t{
            return {
                "/""-",
                "+""*",
                "=""_"
            }[t]
        })
    }
    function f(e, i, n{
        var o = n ? e : t(e)
          , p = o + i.toUpperCase();
        return $.RSA.rsa_encrypt(p)
    }
    var _ = 1
      , m = 8
      , v = 32;
    return {
        getEncryption: h,
        getRSAEncryption: f,
        md5: t
    }
}(),


主函数是h(e,i,n,o),当然该函数内部也调用了其他位置的函数,需要整理到一个js文件中,没有发现标准的加密函数名那么应该是自定义的加密函数,其中有个特殊字符参数"  ˜½"需要注意。


以上是对该过程的简单分析。


------------------------------


ID:Python之战


|作|者|公(zhong)号:python之战 


专注Python,专注于网络爬虫、RPA的学习-践行-总结


喜欢研究技术瓶颈并分享,欢迎围观,共同学习。


独学而无友,则孤陋而寡闻!


---------------------------

相关文章
|
1月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
25天前
|
Web App开发 JavaScript iOS开发
JS弹出式QQ在线客服插件
JS弹出式QQ在线客服插件
25 6
|
27天前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
41 3
|
1月前
|
JavaScript 前端开发 安全
JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择
本文深入探讨了JavaScript与TypeScript的对比,分析了两者的特性及在实际项目中的应用选择。JavaScript以其灵活性和广泛的生态支持著称,而TypeScript通过引入静态类型系统,提高了代码的可靠性和可维护性,特别适合大型项目。文章还讨论了结合使用两种语言的优势,以及如何根据项目需求和技术背景做出最佳选择。
55 4
|
1月前
|
JavaScript 前端开发 API
Vue.js与Angular的优劣分析
Vue.js和Angular都是非常流行的JavaScript框架,它们在构建现代Web应用程序方面各有优劣
|
1月前
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
53 4
|
1月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
282 9
|
1月前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
52 1
|
1月前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
42 1
|
7月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的QQ村旅游网站附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的QQ村旅游网站附带文章和源代码设计说明文档ppt
41 5