网页游戏外挂的设计与编写:QQ摩天大楼【三】(登陆准备-信息发送方式)
???? 剛剛發(fā)現(xiàn)騰訊修改了校友網(wǎng)(朋友網(wǎng))登陸頁面的代碼,把登陸窗口的地址藏在js文件中去了,因此上篇文章中講的部分東西就過時(shí)了,但是思路還是這個(gè)思路,我還是用別的辦法找到了所需的信息,大家按照我的思路好好看看javascript代碼,待會(huì)我還是會(huì)告訴大家如何找到發(fā)送的完整URL。
??? 上一篇文章分析了騰訊校友登陸頁面的JavaScript代碼,掌握了登陸所需的足夠信息,其實(shí)信息掌握的并不全,我疏忽了,細(xì)心的朋友肯定會(huì)問:“現(xiàn)在才知道密碼的處理方式,我們是不是還不知道用戶名和密碼的發(fā)送方式?”是的,我們需要向服務(wù)器發(fā)送一個(gè)完整的URL,現(xiàn)在我們不知道URL是怎么組成的,就無法向服務(wù)器發(fā)送登陸請(qǐng)求。
????下面我們就說如何找到騰訊家的URL。
??? 第一步還是像上篇文章那樣,找到文件comm.js,由于騰訊改了js的代碼,所以我還是說一下新的方法好了。
??? 我們先來到朋友網(wǎng)登陸首頁www.pengyou.com,用瀏覽器查看本頁源文件,發(fā)現(xiàn)不能像以前那樣找到iframe的地址了,本頁有關(guān)iframe的代碼如下:
???? <iframe scrolling="no" id="j_loginFrame" name="login_frame"
src="about:blank" width="356" height="138" frameborder="0"
scrolling="no"allowTransparency="true" style="margin-top:30px;">
??? iframe的src那里是"about:blank"。
??? 仔細(xì)查看該頁的源文件,可以發(fā)現(xiàn)如下三行:
??? <script type="text/javascript" src="http://qzonestyle.gtimg.cn/campus/js/Mcommontmp.js">\<\/script>\
??? <script type="text/javascript" src="http://qzonestyle.gtimg.cn/bailing/js/BMcommon.js">\<\/script>\?? ??? <script type="text/javascript" src="http://qzonestyle.gtimg.cn/bailing/js/BMindexLogin.js">\<\/script>
????這三個(gè)js文件一定有內(nèi)容,下載下來看看。
??? 先看BMindexLogin.js,發(fā)現(xiàn)里面有個(gè)initLogin()的函數(shù),
function initLogin() {
?var ptlogin_base_domain=DOMAINS.ROOT;
?//qq.com
?var ptlogin='http://ui.ptlogin2.'+ptlogin_base_domain+'/cgi-bin/login?appid=15004601&qlogin_jumpname=&hide_title_bar=1&s_url=http://'+DOMAINS.MAIN+'/index.php%3fmod%3Dlogin2%26act%3Dqqlogin&self_regurl=http://'+DOMAINS.REG+'/emailreg.html&css=http://'+DOMAINS.MAIN+'/asset/login.css';
?var set_username_label=function () {
??try
??{
???window.frames['login_frame'].document.getElementById('label_uin').innerHTML='Email/QQ帳號(hào):';
???window.frames['login_frame'].document.getElementById('label_pwd').innerHTML='密碼:';
??}
??catch(e)
??{
??}
?};
?var iframe=document.getElementById('j_loginFrame');
?iframe.src=ptlogin;
?if(iframe.attachEvent) {
??iframe.attachEvent("onload",set_username_label);
?}else {
??iframe.οnlοad=set_username_label;
?}
?var query=window.location.search;
?if(query&&query.length>10&&query.indexOf('act=logout')==-1&&query.indexOf('mod=login')==-1) {
??var m=query.match(/\?([^&]{
???10,200
??})/);
??if(m) {
???var ref=unescape(m[1]);
???if(ref.indexOf('ref=')===0) {
????ref=ref.substr(4);
???}
???ref=ref.replace(/\&/gi,'%26');
???document.cookie='ref='+ref+';domain='+DOMAINS.COOKIE_DOMAIN;
??}
?}
?else {
??document.cookie='ref=deleted;domain='+DOMAINS.COOKIE_DOMAIN;
?}
?var frag=window.location.hash;
?if(frag&&frag.indexOf('qqreg=1')!=-1) {
??reg_by_qq();
?}
}?
???? 紅色的字體就是給iframe的src賦值語句,藍(lán)色的字體就是我們要找的iframe的地址了。但仔細(xì)一看,這個(gè)地址還不能直接復(fù)制到地址欄,因?yàn)槔镱^有一些DOMAINS.MAIN之類的東西,沒事,我們?nèi)チ韮蓚€(gè)js文件找,在Mcommontmp.js里,查找DOMAINS,記得區(qū)分大小寫,因?yàn)槊菜朴泻芏郿omains,于是我們找到如下賦值語句:
??? window.DOMAINS={
???COOKIE_DOMAIN:'pengyou.qq.com',MAIN:'pengyou.qq.com',HOME:'home.pengyou.qq.com',REG:'reg.pengyou.qq.com',FEED:'feed.pengyou.qq.com',APP:'app.pengyou.qq.com',API:'api.pengyou.qq.com',ROOT:'qq.com',IMGCACHE:'qzonestyle.gtimg.cn',OFFICE:'pengyou.qq.com',SHARE:'share.pengyou.qq.com',PROFILE:'profile.pengyou.qq.com'
??};
???? 把這些東西替換到我們之前找到的URL中的相應(yīng)位置,然后就可以復(fù)制到IE地址欄,點(diǎn)擊回車,就出現(xiàn)了我們上篇文章中找到的登陸窗口,查看本頁源文件,找到<script language="javascript" src="http://imgcache.qq.com/ptlogin/ac/v8/js/comm.js?v=1.2.5"></script>,下載這個(gè)js文件。
???? 講得有點(diǎn)跳躍性,這些都是上篇講過的東西,所以就沒講得太詳細(xì)。
???? 找到ajax_submit,里頭有這么一句:
???? C.src=E.action+"?"+B;
???? 一般URL都是xxx+?+參數(shù)的格式,因此我們有理由猜測這句就是我們要找的登陸URL。有人會(huì)問,里頭的E是什么,B又是什么,如果大家仔細(xì)看JavaScript文件,就會(huì)知道,E就登陸時(shí)要提交的表單,B就是登陸時(shí)要提交的參數(shù)。我們?cè)诨氐降顷懘翱诘脑次募?#xff0c;不是www.pengyou.com,是我們從js文件中找到的那個(gè),可以在form里看到,action=http://ptlogin2.pengyou.com/login,至于參數(shù),大家就只能在ajax_submit里面根據(jù)程序邏輯把參數(shù)一個(gè)一個(gè)的拼起來,沒有捷徑,除了看我拼好的,我也是一點(diǎn)一點(diǎn)拼的,拼好就是下面這個(gè)樣子:
?"u=" + 您的QQ號(hào) + "&p=" +?您的密碼 + "&verifycode=" +?驗(yàn)證碼?+ "&aid=15004601&u1=http%3A%2F%2Fxiaoyou.qq.com%2Findex.php%3Fmod%3Dlogin%26adtag%3Dfrom_index&h=1&ptredirect=1&ptlang=2052&from_ui=1&dumy=&fp=loginerroralert"
???? 這串是我剛剛拼好的,以后騰訊肯定還要改,大家有空自己拼一下吧,實(shí)在懶就算了,我這個(gè)暫時(shí)還能用。
???? 現(xiàn)在用戶名和密碼的處理方式和發(fā)送方式都知道了,心急的朋友可能會(huì)問:“是不是就可以登陸了?”。
???? 答案是不能,因?yàn)檫€要驗(yàn)證碼。我們登陸時(shí),有時(shí)需要一個(gè)驗(yàn)證碼,有時(shí)又不需要。對(duì)于驗(yàn)證碼,有種簡單的處理方式,就是每次登陸都要求輸入,一定不會(huì)有錯(cuò)的,就是用起來麻煩點(diǎn),如果想做得完美點(diǎn),就可以像騰訊家一樣自動(dòng)檢查一下,檢查通過就不需要輸入了,這樣也可以,就是寫程序的時(shí)候麻煩一點(diǎn)。
?????好我不啰嗦了,下面就說說騰訊家是如何檢查是否需要驗(yàn)證碼。
???? 所有都在comm.js里面,有一個(gè)ptui_needVC函數(shù),找到這個(gè)函數(shù),代碼如下:
function ptui_needVC(C,D) {
?if(t_appid==D) {
??if((C.indexOf("@")<0)&&isNaN(C)) {
???C="@"+C
??}
?}var B="";
?if(pt.isHttps) {
??ptui_checkVC("1","");
??return
?}else {
??B="http://ptlogin2."+g_domain+"/check?uin="+C+"&appid="+D+"&r="+Math.random()
?}var A=document.createElement("script");
?g_imgTime=new Date();
?A.src=B;
?document.body.appendChild(A);
?g_loadcheck=true;
?return
}
???????紅色的字就是URL了,這個(gè)比較直觀,不用拼參數(shù)了,g_domain可以在登陸窗口的頁面源文件中找到,
?????var g_domain = "pengyou.com"
???? C就是QQ帳號(hào),D也可以在登錄窗口的頁面源文件中找到,
???? var g_appid = 15004601
???? Math.random()是JavaScript本身的一個(gè)函數(shù),函數(shù)功能是取0到1之間的一個(gè)隨機(jī)數(shù)。
?????把以上內(nèi)容嵌進(jìn)去就是檢查是否需要驗(yàn)證碼的URL了。
?
???? 如果需要驗(yàn)證碼的話,還需要獲取驗(yàn)證碼的圖片,獲取方法都可以在comm.js中找到。找到函數(shù)loadVC,函數(shù)如下:
function loadVC(A) {
?if(isLoadVC==A&&(lastUin==g_uin)) {
??return
?}lastUin=g_uin;
?isLoadVC=A;
?if(A==true) {
??var B=$("imgVerify");
??var F=g_uin;
??if((g_appid==t_appid)&&isNaN(g_uin)&&(g_uin.indexOf("@")<0)) {
???F="@"+g_uin
??}var E="/getimage?aid="+g_appid+"&r="+Math.random()+"&uin="+F;
??if(g_https) {
???E="."+E
??}else {
???E="http://captcha."+g_domain+E+"&vc_type="+vc_type
??}var D=new Date();
??B.src=E;
??$("verifyinput").style.display="";
??$("verifytip").style.display="";
??$("verifyshow").style.display="";
??ptui_notifySize("login");
??try{
???$("p").focus()
??}catch(C) {
??}
?}else {
??$("verifyinput").style.display="none";
??$("verifytip").style.display="none";
??$("verifyshow").style.display="none";
??ptui_notifySize("login");
??try{
???$("p").focus()
??}catch(C) {
??}
?}
? 紅色的字就是獲取的URL了,g_domain前面講過是pengyou.com,至于vc_type,是由ptui_needVC函數(shù)返回的,其實(shí)也可以不附加vc_type,整個(gè)URL拼起來就像這個(gè)樣子:"http://captcha.pengyou.com/getimage?aid="+g_appid+"&r="+Math.random()+"&uin="+您的QQ號(hào)+"&vc_type="+vc_Type。
? g_appid和Math.random()上面都說過是什么,大家找找吧,我每次都說一遍好累啊。
? 好了,驗(yàn)證碼也知道怎么檢查和獲取了,至此,JavaScript全部分析完了,上篇也說分析完了,哈哈,不過這次是真的啦,下篇進(jìn)入實(shí)戰(zhàn)部分了,是不是好激動(dòng)的?我會(huì)先告訴大家使用一個(gè)工具,非常給力的網(wǎng)絡(luò)抓包工具—Wireshark。????
總結(jié)
以上是生活随笔為你收集整理的网页游戏外挂的设计与编写:QQ摩天大楼【三】(登陆准备-信息发送方式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何自己制作一个RISC指令集的CPU?
- 下一篇: _initialize() 区别 __c