声明本文所有内容仅供学习交流,严禁用于商业和非法用途,否则由此产生的一切后果与您无关与作者联系,如有侵权,请第一时间联系我删除!反向目标目标:37网游登录主页:https://www.37.com/接口:https://my.37.com/api/login.php反向参数:查询字符串参数:密码:SlVEOThrcjgzNDNjaUYxOTQzNDM0eVM=反向过程抓包分析随意输入一个账号密码,点击登录,抓包定位到登录界面为https://my.37.com/api/login.php,GET请求,分析QueryStringParameters中的主要参数:callback是一个回调参数,该参数的取值不影响请求结果。其格式为jQuery+20位数字+_+13位时间戳,易于用Python构造;login_account为登录账号名;password为加密后的密码;_是13位时间戳。参数反转需要我们只用一个密码来反转参数。我们尝试直接全局搜索这个关键词,会发现很多结果,不利于分析。这里有个小技巧,加个等号,搜索password=,这样就大大缩短了搜索范围。当然你也可以搜索password:,也可以在关键字和符号之间加一个空格,也可以搜索varpassword等,没有结果就换一个。本例中,我们搜索password=,在sq.login2015.js文件中可以看到h.password=td(f)语句,这里疑似密码被加密了,可以在这里下断点调试,并且可以看到返回值确实是加密后的密码:继续跟进td函数,可以看到使用了自写的RSA加密,非常简单明了,我们直接复制调用即可Python:完整代码GitHub关注K哥爬虫,持续分享爬虫相关代码!欢迎加星!本例完整代码:https://github.com/kuaidaili/...37_encrypt.js变量c1、c2、c3;len=str.length;我=0;出=“”;while(i>2);out+=ch.charAt((c1&0x3)<<4);输出+=“==”;中断}c2=str.charCodeAt(i++);如果(i==len){out+=ch.charAt(c1>>2);out+=ch.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));out+=ch.charAt((c2&0xF)<<2);出+=“=”;中断}c3=str.charCodeAt(i++);out+=ch.charAt(c1>>2);out+=ch.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));out+=ch.charAt(((c2&0xF)<<2)|((c3&0xC0)>>6));out+=ch.charAt(c3&0x3F)}返回out}functiongetEncryptedPassword(a){varmaxPos=ch.length-2,w=[];对于(i=0;i<15;i++){w.push(ch.charAt(Math.floor(Math.random()*maxPos)));如果(i===7){w.push(a.substr(0,3))}如果(i===12){w.push(a.substr(3))}}返回__rsa(w.join(""))}//测试样例//console.log(getEncryptedPassword("34343434"))37_login.py#!/usr/bin/envpython3#-*-coding:utf-8-*-importtimeimportrandomimportexecjsimportrequestslogin_url='https://my.37.com/api/login.php'defget_encrypted_pa??ssword(密码):withopen('37_encrypt.js','r',encoding='utf-8')作为f:www_37_js=f.read()encrypted_pwd=execjs.compile(www_37_js).call('getEncryptedPassword',password)returnencrypted_pwddef登录(用户名,encrypted_pa??ssword):timestamp=str(int(time.time()*1000))jsonp=''for_inrange(20):jsonp+=str(random.randint(0,9))callback='jQuery'+jsonp+'_'+timestampparams={'callback':callback,'action':'login','login_account':username,'password':encrypted_pa??ssword,'ajax':0,'remember_me':1,'save_state':1,'ltype':1,'tj_from':100,'s':1,'tj_way':1,'_':timestamp}headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.114Safari/537.36','sec-ch-ua':'"Not;ABrand";v="99","GoogleChrome";v="91","Chromium";v="91"'}response=requests.post(url=login_url,headers=headers,params=params)print(response.text)defmain():username=input('请输入登录账号:')password=input('请输入登录密码:')encrypted_pa??ssword=get_encrypted_pa??ssword(password)login(username,encrypted_pa??ssword)if__name__=='__main__':main()