腾讯滑块---Js逆向酷狗音乐登入

发布于:2025-09-14 ⋅ 阅读:(29) ⋅ 点赞:(0)
url = "aHR0cHM6Ly93d3cua3Vnb3UuY29tLw=="

        仅共学习使用,请勿用于非法用途,如有侵权,联系删除文章!!!

        仅共学习使用,请勿用于非法用途,如有侵权,联系删除文章!!!

        仅共学习使用,请勿用于非法用途,如有侵权,联系删除文章!!!

        打开这个网站,选择登入,选择手机号码登入,当我们输入xx号码,点击发送验证码的时候,会弹出一个验证码,这个是一个tx的滑块,现在来研究一下这个流程。        那么首先还是找到返回验证码图片的接口,但是这个tx滑块比较特殊,它的验证码图片是一个单独的接口,并不是在某一个接口里面需要我们取出来做拼接,但是都差不多。        

        这里就不说请求过程了,自己去分析一下

"""
1.请求https://turing.captcha.qcloud.com/cap_union_prehandle 接口获取sess和sid 其中的ua为处理后的ua
2.请求https://turing.captcha.qcloud.com/cap_union_new_show页面接口,从里面取出滑块图和背景图的url 和新的sess 需要携带第一次请求返回的sess和sid
3.请求滑块图和背景图,需要携带第一次请求返回的的sid和第二次请求返回的sess,image
4.请求验证接口https://turing.captcha.qcloud.com/cap_union_new_verify 需要逆向collect,eks,vData,nonce,ans sess为第二次请求返回,sid为第一次请求返回
"""

        首先是请求第一个接口,里面有个ua需要处理一下,但是在同一个游览器里面,这个值可以固定,定位就就不说了。        第二个接口就比较重要了,这个是一个html页面接口,里面有很多我们后面请求需要的参数。        然后就是请求背景图和滑块图了,这个接口里面的请求参数也是从第二个接口和第一个接口返回的参数,这里就不说了。        关键的还是这个验证接口。先分析一下参数,ua前面已经说过了,sess这个是第二个接口返回的,sid这个是一个接口返回的,ans需要分析,prehandleLoadTime是创建iframe标签开始时间,需要和前面那个接口保持一致,rnd一个随机值,直接固定,collect,eks,vData需要逆向分析,tlg是collect的长度,nonce是第二个接口返回的。

data = {
    "aid": "2055803012",
    "protocol": "https",
    "accver": "1",
    "showtype": "popup",
    "ua": "TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEzOS4wLjAuMCBTYWZhcmkvNTM3LjM2",
    "noheader": "1",
    "fb": "1",
    "aged": "0",
    "enableAged": "0",
    "enableDarkMode": "0",
    "grayscale": "1",
    "clientype": "2",
    "sess": "s0S0yHKmxdmdOixl3qn80d1sfkoj2gY7zu-1ajheSFLsvSxbbO6jq_yAialTTU0j3TFbW-Gbp5MRqNmCh7ooXkrhuQws35oMcl6u3ZzPV1He5JFos6zba1X3BHDTlqMpKvD4RIdIIKtEVdf2iOP-_n-syskuee7N6AkoywG-JhJTb9ZsQ9JFvTpL6S0EPeGzWthXqlLojkE3KsRcsxHd6B71x1oWleZQPUr1_inmC0cgKkZzsVeTeszjXsGsBVAiDzBpAYAxhpmndLUrAEX2MX9No3wyyigOP8qLlGD6ruB72KPdKHOpM4u2baJ1hNbvbZ",
    "fwidth": "0",
    "sid": "7372267392331694080",
    "wxLang": "",
    "tcScale": "1",
    "uid": "",
    "cap_cd": "",
    "rnd": "834205",
    "prehandleLoadTime": "3797",
    "createIframeStart": "1757685519624",
    "global": "0",
    "subsid": "3",
    "cdata": "0",
    "ans": "181,106;",
    "vsig": "",
    "websig": "",
    "subcapclass": "",
    "pow_answer": "",
    "pow_calc_time": "0",
    "collect": "K70ulCSsKVbJdCwP0OUP/rRH6IF/bOZlPvJdA5GYaPUU9A1iTVIxJcf2d8r3/FqPNlv16JreHZ S2mRtL97ptXOan6WW2zA5I2hBqwNdN5 bgLFb/SGBedWqXWhi2hNT8BJ56i3YjGSgszXlGOCEB4jsUMcVMejlrL8j8fIma7orky7yvccUMLIm0DZqTZly8et7nbp/AyD6FvQyekZ6VRizD7m/K5xhbi7eVYihEisKsTictaYsJXRpjisGr0OTBMPOSQFBRG9TnkNwf1tDn6CBWbLiWfS5lsIokVP8jm55yySq0EIkbm32Lz6 TMKKnA1zLMfz18uLe6IpQ0LPOokGl7CIO3OpH3aW T6Io8pqnSny3507AJh9mrTY85xIQ2iUdIsLd8I0ncWfM0b/z4nnbYfgJWiarIlaD7hUT8hSDXTOx6UcTr7ftRhkJD0QDjxZKlYtu1zfb81KJ3mi73NZUIPxliHPYBOWq2sMmQqRPVTkkJBhdAeb6eDiXTBDFFrDK3I5PyTiiTjLN/K2FDopMFgE2BFGZkWFClx8jRpbWmE6l6n/6FfalI9xjhoIidsmiJS4aY4ONoSecKMxIqum0hgJ7SV yO8Uypr2X/nBO0lMLxPy1PDTsScqWNk7xT3w/RoTP36vR8JnrP5xCxSC8u1tkc5c koi1lVkbY9L7b5lzlKx8LpmDpzi38t4aDEjcGOLdEJ3C8/0ej2a8ZFas920JV/n0R09fp81AU2V1c0hSp8eKZEFxV6Eq3sRj /oaGt8xmyJf8q75qUJwJyRBasvjc1/XfIFfa6 7T3PO2n uVQyl6opaWYroktD4YTCVRTR6DM1SXdQ8auSNVXqBvIfL58k0MN1xYVsSx4o98ivvWCFQt5JDhMHfzzTDXRSAQg1WhMhMfJn5FO3frUrVmQaacLPcGPfYEhRt 8q0CYKhJkQZBirPANVWcMaes0afGdkBxMRuKehIt02Q53gmZXmKgqpd7h0IYCFgL1eFSw1bJmY5F4VLDVsmZjkUEkx5C7fKbTSVg8DbRrCqrHB5ORHUEOgvVL8DO3NnviZRqW6 qy/L36JaM6F6xq24SKHomz49A2H7y5aSiQmPPDlXpZUWHHbhVu1TfCpHOHexhUWE/SgI43S3ODKP7JXr8nOS7aZAzs5/RXSyzWrPyeAtAShmUUUghpx1gR/oHRjVMJhVk7b739A26Nd t8ZIKVqzuXM1w Z2WhBTZQq8pCjxtf60QWq5M36QEYz3t4w/2wArTYgBscmJKaUGu2CxT pD63ZAzagBYGBlRT2sMRuMkgwZYFJkAolyGUiMBGYHxTqHO  iDD/bACtNiAGHTi/ spEO rFP6kPrdkDNou9MohBsDfiOFDvmUolNQuxXTYWouff6F3BeOL I5ayDqjgHEeXRQ6YHxTqHO  iDD/bACtNiAG6fghnURc3bdAvKB X6XsSI tlogXKcl0kmxy4JC7438IMgX8bEJE bJCZ3lnx9/m0feuRMixgxa1ZtM4ErCcN0VLOBXcQ1 1djPw11UWcmyBBA LUt57NfcbdeEcXkzyglD1jH Hy60gwNlWCyAA2yDA2VYLIADbduHCR3whzCcDG6tfwb59g/J29q0za4PcIMDZVgsgANv/ZvYe7USb /cbdeEcXkzyRZZ4RmpcSIMfscH8wppz7vDl5nMheL3ZY4gN3bdjQGMR23kcGiPz F4VLDVsmZjkXd1S4qEoRUFY uuIYUzJLBzyClqZFT8KXVHWI4LeCE8SDpycM QK75cowvUkwoWuEahW0uMAzl092UXLeGiVqpDD/heD084STkjCad/FwHnVLJwlN2Wz406uBIDc/VPOWA46jrS1PWrluymE7VNqL46W1H6VySCbjP0h3H2mD9yh6/ReH/RvzznF9jpVImJEJS4wxLmvpjpeFSw1bJmY5F4VLDVsmZjk6wcL/41D/R3nTsCIdfYmO DdDLCs9JxlVyGi0oEM9X iaridtcMlfQiXG/9S44kEwi0JcZZ 0o9woICC5CLOpGYnUaqeOH4F P5Rnzg5bQnF5Ud6U8MNa DtiX5hET/JELuMWT/4ExTQqBKNBfr7zBLvvI37pFkQFGzfQN17vjZ6HaiWa3PuKr7J/7ktXz Rvsn/uS1fP5EBfpcS0BlRmf6n/rKWa2aTRzBbJpkgdmz p/6ylmtmk77J/7ktXz Rq6Auhu pJEiroC6G76kkSJ2dT6YIhMmq Z/a5WwpY7f WtTY4nKb9qlhZQsLLrrOJfsRzjkNdG5s4xBHBmvutA==",
    "tlg": "2296",
    "fpinfo": "",
    "eks": "UuPZPoIYgVCjgrOc1 DkzOUamf66UUFwo02ZzkgYV6PyQxr3iDIZaUUh8gUfktjraC3Hp27BD/G63Rf4pbvsO2Y9V MjUYB954xuaLzV1WjWnRyHpwqTiTo33CUOSc8ahnhplB59SqFYdRSmg5KGlU1Nd8GLnZtf0uPngvfmHeTr3ffjdWA4ZGTfAHudv4XouB8phvHqjSVHI DnnrogIOQfi0btaVWybvrIX2T8OQo=",
    "nonce": "eda1152f11f1daf0",
    "vlg": "0_0_1",
    "vData": "_A88VtkrVW1gOsyx7rZzh1RFBKSAwts4PVbArhPGbtR_hLT5DoNZCs_mhqCkw54HQ-rHLwAT_Mrkige*7v2l3MD4Pj2-7diC7eIBOmnwwRsQpCSJUr0tyZd4qR_4ydujzjknUBsO6tifpUNwKn_V77YY"
}

        这个和新版的tx滑块有一点区别的,主要就是这里的两个值上面,老版本的没pow_answer的,但是新版的也没有vData,所以,其实没有什么区别,难度都差不多。        这里先分析ans,直接跟栈分析,这里就不做过多的分析,直接上代码。其中i.left就是识别的距离,其他的值除了R.spt是第二个接口返回的,都可以固定了。

 c = [{
                left: Math.floor((i.left - b.operation.offset().left) / R.rate),
                top: Math.floor(parseInt(R.spt, 10))
            }];

        转python代码如下:

def process_coordinates(slide_distance, top_value):
    """ 
    :param slide_distance: 滑动的距离
    :param top_value: 接口返回的spt
    :return: ans
    """
    data = [{
        'left': (slide_distance - 9.600000381469727) // 0.5014705882352941,
        'top': int(top_value, 10)
    }]

    # 构建结果字符串
    c = ""
    for item in data:
        c += f"{int(item['left'])},{int(item['top'])};"
    return c

        接下来就分析collect,就在ans的下面生成的,这两个值都在这里生成的。

        跟进去就是一个jsvmp了,注意一下流程,先执行了3次的setData,其中第二次设置了轨迹,这个网站对轨迹的校验不怎么严格,只要有就可以了,再执行了getData进行加密生成值。        接下来就是补环境了,这里就不强调了,比较重要的就是canvas,addEventListener,和window下面的一些属性。        也没有多少,然后就是调用方法,生成值了,还有就是这个js文件是会变的,这个js文件是第二个接口返回的,所以需要re匹配出来请求得到这个动态的js文件。        接下来就是vData了,在发包的时候重写了XMLHttpRequest,找到vm-slide文件,全部拿下来补上环境,通过重写XMLHttpRequest把里面的vData取出来就可以了,这个js文件也是动态的,也是在第二个接口返回的链接。

        加密的参数就是a.data。        这些值都生成好后,就可以发送请求了,众所周知,tx滑块里面的errorCode是50就是失败的,0就是成功的,12就是请求频繁了,这个就是失败的。

        看一下本地请求的:        没有问题,相信你们也可以的!!!