declaresthatallthecontentinthisarticleisforlearningandcommunicationonly,thecontentofcapturedpackets,sensitiveURLs,anddatainterfaceshavebeendesensitized,andarestrictlyprohibitedforcommercialuseandIllegaluse,otherwiseallconsequencesarisingtherefromhavenothingtodowiththeauthor,ifthereisanyinfringement,pleasecontactmetodeleteimmediately!逆向目标目标:Steam登录主页:aHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL2xvZ2lu接口:aHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL2xvZ2luL2RvbG9naW4v逆向参数:FormData:password:MzX419b8uvaNe//lkf+15sx6hnLD/L1BX......captchagid:5718995253934681478rsatimestamp:374533150000逆向过程抓包分析来到Steam的登录页面,justenteranaccountpasswordtologin,capturethepacketandlocatethelogininterfaceasaHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL2xvZ2luL2RvbG9naW4v,POSTrequest,inFormData,donotcacheisa13-digittimestamp,passwordpasswordisencrypted,captchagidandrsatimestampareverificationcodes,captchagidandrsatimestamp_textarecaptchagid:Wenoticedthatabovetheloginrequest,thereisalsoarequestforgetrsakey,whichisobviouslyrelatedtoRSAencryption.Itshouldbetoobtainparameterssuchaskey.Youcanseethatthereturnvalueissimilarto:{"success":true,"publickey_mod":"b1ae3215684fd66207415e39810dcbda75c143dc8c4497994db51591ed5bd17dbaf75e1e......","publickey_exp":"010001","timestamp":"288093900000","token_gid":"c304e76a58481ad12"}这里可以发现登录请求的rsatimestamp参数就是这里的timestamp,其他parameterswillbeusedlater.XHR断点定位本例中,我们使用XHR断点来定位加密位置。首先,让我们了解什么是XHR。1、接收数据是Ajax的基础,属于Ajax的特殊请求类型。可以使用浏览器控制台过滤XHR请求。由于是XHR断点,所以这种方式只能用于XHR请求,这也是这种方式的缺点。通过XHR断点,定位到的位置通常在加密过程完成后就可以发送请求了。好处是我们可以跟踪堆栈,比较容易找到加密的地方。有两种方法可以定位XHR断点。第一种是在找到发送请求的URL后截取一部分URL。在Source面板下,将你拦截的URL添加到右侧的XHR/fetchBreakpoints中,如下图,就已经成功了。破解:第二种方法,在Network面板中,点击XHR过滤XHR请求,在Initiator项中可以看到被调用的JS,将鼠标移到JS上,可以看到调用栈,点击第一个,可以进入发送请求的位置与第一种方法相同。需要注意的是,XHR过滤在这个方法中不一定准确,但只要在Initiator项中能看到JS,就说明可以跟进调试。如果请求是通过Form表单或者其他方式发送的,Initiator项会显示Other,此时无法通过该方式进行调试。不管用哪一个,参数reverseXHR的两个方法的位置是一样的。查看右侧的CallStack,即调用栈,一步步查看调用的函数。在login.js中,可以找到varencryptedPassword=RSA.encrypt(password,pubKey);这句语句,很明显的RSA加密:可以重写key代码,方便本地调试:functiongetEncryptedPassword(password,results){varpubKey=RSA.getPublicKey(results.publickey_mod,results.publickey_exp);password=password.replace(/[^\x00-\x7F]/g,'');varencryptedPassword=RSA.encrypt(密码,pubKey);returnencryptedPassword}找到加密位置后,可以下断点,取消XHR断点,重新调试。可以看到结果是之前getrsakey请求返回的数据:RSA.getPublicKey和RSA.encrypt分别是rsa.js中RSA的getPublicKey和encrypt方法:转换整个rsa。js复制本地调试,会提示BigIntegerundefined,鼠标放上去,会看到用了jsbn.js里的方法,一个一个推导函数会比较麻烦,直接复制代码整个jsbn.js文件就是这样:完整代码GitHub关注K的爬虫,继续分享爬虫相关代码!欢迎加星!https://github.com/kgepachong/下面只是演示了部分关键代码,不能直接运行!完整代码仓库地址:https://github.com/kgepachong...JavaScript加密密钥代码结构navigator={};vardbits;//JavaScript引擎解析varcanary=0xdeadbeefcafe;varj_lm=((canary&a议员;0xffffff)==0xefcafe);//(public)ConstructorfunctionBigInteger(a,b,c){}//returnnew,unsetBigIntegerfunctionnbi(){}//am:Computew_j+=(x*this_i),传播carries,//c是初始进位,返回最终进位。//c<3*dvalue,x<2*dvalue,this_i
