Discuz教程网

WEB检测QQ登录状态机制分析

[复制链接]
authicon dly 发表于 2012-8-30 09:42:42 | 显示全部楼层 |阅读模式
打开空间、微博的时候能够自动检测到本地登录的QQ号。今天简单跟了一下,发现这个神奇的链接来自:http://xui.ptlogin2.qq.com/cgi-bin/qlogin  只要一打开,就能知道登录的QQ了,它是如何实现的呢,继续分析js,
发现其主要是用了一个ActivexObject,
q_hummerQtrl = new ActiveXObject(“SSOAxCtrlForPTLogin.SSOForPTLogin2″);
      在XP下,这个Dll的存放路径为C:\Program Files\Common Files\Tencent\TXSSO\Bin\SSOAxCtrlForPTLogin.dll,既然都用dll了,那么判断个登录QQ就没什么好奇怪了。
    但是还有个问题,这个activeX是否可被别人利用?于是,做了个小小的实验。挑出必要的检测代码,放在了如下的html文件中。(IE走activex流程,而firefox走的是embed application/nptxsso),如果成功,则会弹出你的QQ号等一系列信息。
    结果发现在本地打开该html的时候,create  ActiveXObject 失败了,猜想腾讯必然对其进行了域名限制,于是修改本地host文件,加了一条:
xui.ptlogin2.qq.com  127.0.0.1
    再用xui.ptlogin2.qq.com这个域名去访问本地的这个html果然,可以正常实现了,那么说明判断域名的时候是在这个dll中判断的,所以网页无法篡改。做了简单测试,发现对于域名还是限制挺严格的,如xue.ptlogin2.qq.com  xue.ptlogin2.paipai.com等才能成功,而www.qq.com就不成功了。反解了一下,这些域名都指向同一个服务器,202.106.195.30


  1. <html>
  2. <body>
  3. <script>
  4. var g_vOptData;
  5. var mylocation= “xui.ptlogin2.qq.com/cgi-bin1/qlogintest.html”;
  6. var pt = {
  7. ishttps: false,
  8. low_login: 0,
  9. keyindex: 9,
  10. init: function()
  11. {
  12.   pt.ishttps = /^https/.test(mylocation);
  13.   //if (navigator.mimeTypes["application/nptxsso"]) {
  14.   var B = document.createElement(“embed”);
  15.   B.type = “application/nptxsso”;
  16.   B.style.width = “0px”;
  17.   B.style.height = “0px”;
  18.   document.body.appendChild(B);
  19.   pt.sso = B
  20. }
  21. };
  22. pt.init();
  23. try {
  24. if (window.ActiveXObject)
  25. {
  26.   q_hummerQtrl = new ActiveXObject(“SSOAxCtrlForPTLogin.SSOForPTLogin2″);
  27.   var A = q_hummerQtrl.CreateTXSSOData();
  28.   q_hummerQtrl.InitSSOFPTCtrl(0, A);
  29.   g_vOptData = q_hummerQtrl.CreateTXSSOData()
  30. }
  31. hummer_loaduin();
  32. } catch(B) {
  33. alert(/create ActiveXObject failed/)
  34. }

  35. function hummer_loaduin()
  36. {
  37. if (window.ActiveXObject)
  38. {
  39.   var Y = q_hummerQtrl.DoOperation(1, g_vOptData);
  40.   if (null == Y) {
  41.    return
  42.   }
  43.   try
  44.   {
  45.    var T = Y.GetArray(“PTALIST”);
  46.    var c = T.GetSize();
  47.    var X = “”;
  48.    for (var d = 0; d < c; d++)
  49.    {
  50.     var E = T.GetData(d);
  51.     var a = E.GetDWord(“dwSSO_Account_dwAccountUin”);
  52.     var J = “”;
  53.     var O = E.GetByte(“cSSO_Account_cAccountType”);
  54.     var b = a;
  55.     if (O == 1)
  56.     {
  57.      try
  58.      {
  59.       J = E.GetArray(“SSO_Account_AccountValueList”);
  60.       b = J.GetStr(0)
  61.      } catch(Z) {}
  62.     }
  63.     var Q = 0;
  64.     try {
  65.     Q = E.GetWord(“wSSO_Account_wFaceIndex”)
  66.     } catch(Z) {
  67.     Q = 0
  68.     }
  69.     var S = “”;
  70.     try {
  71.     S = E.GetStr(“strSSO_Account_strNickName”)
  72.     } catch(Z) {
  73.     S = “”
  74.     }
  75.     var F = E.GetBuf(“bufGTKey_PTLOGIN”);
  76.     var G = E.GetBuf(“bufST_PTLOGIN”);
  77.     var N = “”;
  78.     var A = G.GetSize();
  79.     for (var W = 0; W < A; W++) {
  80.     var B = G.GetAt(W).toString(“16″);
  81.     if (B.length == 1) {
  82.     B = “0″ + B
  83.     }
  84.     N += B
  85.     }
  86.     var M = {
  87.      uin: a,
  88.      name: b,
  89.      type: O,
  90.      face: Q,
  91.      nick: S,
  92.      key: N
  93.     };
  94.     var str = “QQinfo\r\n”+
  95.         “uin:” + M['uin']+”\r\n”+
  96.         “name:”+M['name']+”\r\n”+
  97.         “type:”+M['type']+”\r\n”+
  98.         “face:”+M['face']+”\r\n”+
  99.         “nick:”+M['nick']+”\r\n”+
  100.         “key:”+M['key']+”\r\n”;
  101.     alert(str);
  102.     q_aUinList[d] = M
  103.    }
  104.   } catch(Z) {}
  105.   } else
  106.   {
  107.   try {
  108.    var M = pt.sso;
  109.    var L = M.InitPVA();
  110.    if (L != false)
  111.    {
  112.     var I = M.GetPVACount();
  113.     for (var W = 0; W < I; W++)
  114.     {
  115.      var C = M.GetUin(W);
  116.      var D = M.GetAccountName(W);
  117.      var K = M.GetFaceIndex(W);
  118.      var U = M.GetNickname(W);
  119.      var P = M.GetGender(W);
  120.      var V = M.GetUinFlag(W);
  121.      var f = M.GetGTKey(W);
  122.      var R = M.GetST(W);
  123.     }
  124.     var str = “QQinfo\r\n”+
  125.         “uin:” + C +”\r\n”+
  126.         “name:”+D+”\r\n”+
  127.         “face:”+K +”\r\n”+
  128.         “nick:”+U+”\r\n”+
  129.         “key:”+f+”\r\n”;
  130.     alert(str);
  131.    }
  132.   } catch(Z) {}
  133.   }
  134. }
  135. </script>
  136. </body>
  137. </html>
复制代码
from:http://1.lanz.sinaapp.com/?p=152

关于QQ空间自动检测本地已经通过客户端登陆的账号
https://www.discuz.1314study.com/thread-76643-1-1.html
检测本机是否登录了指定QQ账号
https://www.discuz.1314study.com/thread-76645-1-1.html





上一篇:关于QQ空间自动检测本地已经通过客户端登陆的账号
下一篇:检测本机是否登录了指定QQ账号
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2024-5-5 17:00

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表