QQ空间协议login_sig、ptqrtoken、p、g_tk、E.salt参数逆向获取
QQ空间协议所有需要加密算法的重要参数汇总
除了这些参数,其他所有参数都可在相关请求包的响应中找到,只要有这几个参数便可以玩转QQ空间协议
本专栏包含QQ空间协议登录、点赞、发|删说说、留言等
login_sig、ptqrtoken、p、E.salt和登录有关
g_tk 登录成功后发说说、点赞、留言等所有功能都需要的参数
一、 各参数算法
1.1ptqrtoken
直接在c_login_2.js中搜索ptqrtoken即可发现是通过hash33函数进行加密得到
下断点可以判断,参数就是qrsig
1.2login_sig
直接GET请求 下方的URL 在响应Cookie中即可找到login_sig
https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https://qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&=&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=手机QQ空间&pt_qr_link=https://z.qzone.com/download.html&self_regurl=https://qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=https://z.qzone.com/download.html&pt_no_auth=0
1.3g_tk
简单跟栈,搜索g_tk即可发现在interface_minl.js中的QZONE.FrontPage.getACSRFToken 方法返回的结果就是g_tk 在这个方法处下断点可以知道参数为cookie中的p_skey
1.4 p
1.4.1 p分析
先在登录包处查看堆栈,在loadScript、submit、匿名处下断点
在c_login_2.js,通过debug的作用域参数列表可以知道p参数是在S['default']中,搜索这个逐步查找可以找到图片中框起来的部分,发现p是通过getEncryption函数进行加密得到
可以看到密码p的密文是通过getEncryption这个函数得到的,一共有4个参数 ,注意其中的E.salt
getEncryption函数 可以看到函数的参数
t——密码明文
e——E.salt
n——验证码包响应的验证码
o——空
此处验证码包也就是参数n请看我的文章
跟踪E.salt ,可以看到E.salt是通过账号进行uin2hex算法得到的,登陆时输入邮箱的话会把@qq.com替换为空
uin2hex 就是 getEncryption函数 e参数算法 参数str为账号明文
1.4.2 getEncryption扣代码思路
代码是经过简单混淆的,扣代码还是比较困难的,和p算法有关的代码扣了900多行
可以看到涉及三个不同的作用域n['default]、u['default]、S['default]还有本身的作用域
像这些本地作用域的函数,直接在函数所在的本地作用域找即可
直接在这里面找l(),t(),w()等方法抠出来
对于其他作用域
可以像这样单独创建对应的代码块,然后抠出来放进去,对S,n,u分别弄
怎么找到对应的块的代码?
下断点之后,鼠标悬停在对应的方法,即可找到该函数的代码 ,网上找到这个代码所在的区域,把_()、y()、k()等方法扣下来放到u对应的里面即可
比如我的var aaaaaa对象则代表u['default']
完整且规范写的话需要写var S,var n,var u三个
二、Python代码
2.1ptqrtoken代码
def hash33(t): #参数:qrsig
e = 0
for n in range(len(t)):
e = (e << 5) + ord(t[n])
return e & 2147483647 # 返回ptqrtoken
2.2login_sig代码
def get_initial_cookies():
global global_cookies
# 发送 GET 请求到指定的 URL 来获取初始 Cookie
url = "https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https://qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&=&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https://qzs.qqzone.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=手机QQ空间&pt_qr_link=http://z.qzone.com/download.html&self_regurl=https://qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http://z.qzone.com/download.html&pt_no_auth=1"
headers = {
"Host": "xui.ptlogin2.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Cache-Control": "max-age=0"
}
# 发起 GET 请求
response = requests.get(url, headers=headers)
if response.status_code == 200:
# 合并获取的 Cookie
global_cookies.update(response.cookies)
return global_cookies, headers
else:
print(f"请求失败,状态码:{response.status_code}")
return None, None
2.3g_tk代码
def get_tk(skey):
hash_value = 5381
for char in skey:
hash_value += (hash_value << 5) + ord(char)
return str(hash_value & 2147483647)
print(get_tk('p_skey'))
2.4p算法代码调用思路
将p算法完整的js代码扣下来之后,使用python的subprocess库对js代码进行调用即可
由于扣下来的js代码较长,这里只展示扣代码思路,只要跟着debug里面的方法一点点扣下来即可
使用args配合subprocess库,args[0]即为python代码传入的第一个参数,其他同理
vercode就是js代码中args[0]
标签:QQ,qq,ptqrtoken,代码,html,参数,tk,login,com From: https://blog.csdn.net/qq_37454479/article/details/142550262测试结果: i267PnCDEUJb5h03dENIKxs8lQw7piqg*kUELiyl1L3s7QVsgk2LuM4HGtGJ0G0vc6q-u1aCHsdioDr4n9MQEeLx9WdtB5l4Y*hPMOUn5jQ5ygWyioefo1usP0kguKCzppaxBs0HCiMF0aI0DPSvxXtE8BPPaRaFV*h4rFdNNdeSs2AHF9STi44GUmwtUwxS0rb*MJ75InMO7bxgyP4d-o3mjgHO10mftu0EBJLl-WDn03LCWlhl3GCFyY3t0*gKMKMf*XULEjkA660vGOlB5Je*iLgivVQCWNEokL6JoIVjZp7IP1sy7h0IzAFX7Fy2fI2DKCsOjYKRLbQrq-HbDA__