发布时间:2025-12-09 19:56:04 浏览次数:4
最近在分析QQ和微信的登陆过程中,发现存在了二维码登陆这个东西,比较疑惑其实现,作了一下简单的分析。
二维码说的直白一点就是包含二进制数据的黑白图片。当进行登录时,服务器生成一条二维码信息,发送给PC客户端。这时,手机终端(已经存在指定账号登录信息)扫描二维码,会将这条二维码信息与自身登录账户的相关信息发送至服务器,服务器就授权接收二维码的PC客户端进行登录。比如网页微信:打开wx.qq.com网页(https形式),就是一个二维码登陆页面,通过手机终端登陆的微信进行扫描,然后就能自动登陆了。这里和一些朋友推送方面的猜想不同,保持的是一个短连接。
通过分析数据包发现在网页存在的情况下,客户端会不间断的向服务器发起https连接,并且传输很少的数据之后就断开连接了。在网页的源代码中,找到了一个js文件“login18002b.js”。其中的代码
function _poll(_asUUID) {var _self = arguments.callee,_nTime = 0;_sCurUUId = _asUUID;_logInPage("_poll Request Start, time: " + new Date().getTime());_nTime = new Date().getTime();$.ajax({type: "GET",url: "https://login." + _sBaseHost + "/cgi-bin/mmwebwx-bin/login?uuid=" + _asUUID + "&tip=" + show_tip,dataType: "script",cache: false,timeout: _nAjaxTimeout,success: function(data, textStatus, jqXHR) {_logInPage("_poll Request Success, code: " + window.code + ", time: " + (new Date().getTime() - _nTime) + "ms");switch (_aoWin.code) {case 200:_sSecondRequestTime = new Date().getTime() - _sSecondRequestTime;_logInPage("Second Request Success, time: " + _sSecondRequestTime + "ms");clearTimeout(_oResetTimeout);$.get(_aoWin.redirect_uri + "&fun=new", function(msg) {_logInPage("new func reponse, reponseMsg: " + msg);_reportNow("new func reponse, reponseMsg: " + msg);var code = msg.match(/<script>(.*)<\/script>/);if(code){eval(code[1]);}else{$("#container").show();$("#login_container").hide();}});_reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Success, uuid: " + _asUUID + ", time: " + _sSecondRequestTime + "ms");break;case 201:clearTimeout(_oResetTimeout);show_tip = 0;$('.errorMsg').hide();$('.normlDesc').hide();$('.successMsg').show();_logInPage("First Request Success");_reportNow("/cgi-bin/mmwebwx-bin/login, First Request Success, uuid: " + _asUUID);// setTimeout(function(){_logInPage("Second Request Start");_reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Start, uuid: " + _asUUID);_sSecondRequestTime = new Date().getTime();_nAjaxTimeout = 5 * 1000;_self(_asUUID);// }, 500);break;case 408:setTimeout(function(){_self(_asUUID);}, 500);break;case 400:case 500:_reset();_afterLoadWebMMDo(function(){_aoWin.Log.d("500, Login Poll Svr Exception");});break;}},error: function(jqXHR, textStatus, errorThrown) {if (textStatus == 'timeout') {setTimeout(function(){_self(_asUUID);}, 500);} else {setTimeout(function(){_self(_asUUID);}, 5000);_logInPage("_poll Request Error:" + textStatus);_afterLoadWebMMDo(function(){_aoWin.Log.e("Login Poll Error:" + textStatus);});}}});}最后,对qq二维码登陆也做了一个简单的分析,QQ二维码登陆将会通过udp 8000端口频繁的向服务器发送询问请求,一直到二维码被扫描正确登陆或者二维码超时为止。