首页
社区
课程
招聘
[原创]调用QQ/TIM算法实现获取当前登陆账号和ClientKey
发表于: 2019-10-14 14:21 10357

[原创]调用QQ/TIM算法实现获取当前登陆账号和ClientKey

2019-10-14 14:21
10357

由于通过网页版实现快捷登陆被TX和谐了,所以,各种群验证以及相继失效!因此,想起来很多年前玩的一种方法,就拿出来分享了!
登陆QQ的网页,除了从网页快捷登陆之外,还可以通过QQ面板,直接登陆!
所以,我们点击QQ面板上的QQ空间标志,等待网页弹出,进入成功


进入之后 是这样的状态  https://user.qzone.qq.com/这里是你的QQ号/infocenter 
我们在地址栏 按下 CTRL+Z 会出现一串很长的网址 
https://ssl.ptlogin2.qq.com/jump?ptlang=2052&clientuin=QQ&clientkey=clientkey&u1=https:%2F%2Fuser.qzone.qq.com%2QQ%2Finfocenter&source=panelstar

clientkey是一段64位的文本字符串,这个肯定是从QQ内存中获取的,因为这里涉及了权限问题,所以,就没有QQ和key放出来。

忘记以前是怎么定位的了,只记得是 KernelUtil.dll 中的  ?GetSignature@Misc@Util@@YA?AVCTXStringW@@PBD@Z   IDA附加 定位到函数
进入之后 是这样的状态  https://user.qzone.qq.com/这里是你的QQ号/infocenter 
我们在地址栏 按下 CTRL+Z 会出现一串很长的网址 
https://ssl.ptlogin2.qq.com/jump?ptlang=2052&clientuin=QQ&clientkey=clientkey&u1=https:%2F%2Fuser.qzone.qq.com%2QQ%2Finfocenter&source=panelstar

clientkey是一段64位的文本字符串,这个肯定是从QQ内存中获取的,因为这里涉及了权限问题,所以,就没有QQ和key放出来。

忘记以前是怎么定位的了,只记得是 KernelUtil.dll 中的  ?GetSignature@Misc@Util@@YA?AVCTXStringW@@PBD@Z   IDA附加 定位到函数
CTXStringW *__cdecl Util::Misc::GetSignature(CTXStringW *a1, int a2)
{
  int v2; // eax
  int v4; // [esp-14h] [ebp-14h]
  int v5; // [esp-10h] [ebp-10h]
  int v6; // [esp-Ch] [ebp-Ch]
  int v7; // [esp-8h] [ebp-8h]
 
  CTXStringW::CTXStringW(a1);
  v5 = 0;
  sub_55404A73(&v5);
  if ( v5 )
  {
    v6 = 0;
    if ( (*(int (__stdcall **)(int, int, int *))(*(_DWORD *)v5 + 60))(v5, a2, &v6) >= 0 )
    {
      v7 = 0;
      sub_5536126A(&v7, v6);
      v2 = Util::Encode::Encode16(&v4, &v7);
      CTXStringW::operator=(a1, v2);
      CTXStringW::~CTXStringW((CTXStringW *)&v4);
      if ( v7 )
        (*(void (__stdcall **)(int))(*(_DWORD *)v7 + 8))(v7);
    }
    sub_5540C87C(&v6);
  }
  sub_5540C87C(&v5);
  return a1;
}
传入2个参数  
参数1 是 缓存区 返回结果指针
参数2 是 传入参数的指针

查看交叉引用 
 
CTXStringW *__cdecl Util::Misc::GetSignature(CTXStringW *a1, int a2)
{
  int v2; // eax
  int v4; // [esp-14h] [ebp-14h]
  int v5; // [esp-10h] [ebp-10h]
  int v6; // [esp-Ch] [ebp-Ch]
  int v7; // [esp-8h] [ebp-8h]
 
  CTXStringW::CTXStringW(a1);
  v5 = 0;
  sub_55404A73(&v5);
  if ( v5 )
  {
    v6 = 0;
    if ( (*(int (__stdcall **)(int, int, int *))(*(_DWORD *)v5 + 60))(v5, a2, &v6) >= 0 )
    {
      v7 = 0;
      sub_5536126A(&v7, v6);
      v2 = Util::Encode::Encode16(&v4, &v7);
      CTXStringW::operator=(a1, v2);
      CTXStringW::~CTXStringW((CTXStringW *)&v4);
      if ( v7 )
        (*(void (__stdcall **)(int))(*(_DWORD *)v7 + 8))(v7);
    }
    sub_5540C87C(&v6);
  }
  sub_5540C87C(&v5);
  return a1;
}
传入2个参数  
参数1 是 缓存区 返回结果指针
参数2 是 传入参数的指针

查看交叉引用 
 
一个一个进去看
CTXStringW *__cdecl Util::Misc::Get32ByteValueAddedSign(CTXStringW *a1)
{
  Util::Misc::GetSignature(a1, (int)"buf32ByteValueAddedSignature");
  return a1;
}

CTXStringW *__cdecl Util::Misc::Get32ByteValueAddedSign(CTXStringW *a1)
{
  Util::Misc::GetSignature(a1, (int)"buf32ByteValueAddedSignature");
  return a1;
}

CTXStringW *__cdecl Util::Misc::GetValueSTHttp(CTXStringW *a1)
{
  Util::Misc::GetSignature(a1, (int)"bufSTHttp");
  return a1;
}
发现2个函数 调用方式 一样,不同的是
一个是 buf32ByteValueAddedSignature  一个是 bufSTHttp

这里选择  buf32ByteValueAddedSignature 因为我们获取的是64位的key
CTXStringW *__cdecl Util::Misc::GetValueSTHttp(CTXStringW *a1)
{
  Util::Misc::GetSignature(a1, (int)"bufSTHttp");
  return a1;
}
发现2个函数 调用方式 一样,不同的是
一个是 buf32ByteValueAddedSignature  一个是 bufSTHttp

这里选择  buf32ByteValueAddedSignature 因为我们获取的是64位的key
.text:55416CFC ; class CTXStringW __cdecl Util::Misc::Get32ByteValueAddedSign(void)
.text:55416CFC                 public ?Get32ByteValueAddedSign@Misc@Util@@YA?AVCTXStringW@@XZ
.text:55416CFC ?Get32ByteValueAddedSign@Misc@Util@@YA?AVCTXStringW@@XZ proc near
.text:55416CFC                                         ; CODE XREF: Util::URL::AdjustUrl(CTXStringW const &,Util::URL::URLMODIFYLEVEL,CTXStringW const &,wchar_t const *)+A8↓p
.text:55416CFC                                         ; Util::URL::GetKeyFmt(CFmtString &)+21↓p ...
.text:55416CFC                 push    ebp
.text:55416CFD                 mov     ebp, esp
.text:55416CFF                 push    offset aBuf32bytevalue ; "buf32ByteValueAddedSignature"
.text:55416D04                 push    dword ptr [ebp+8]
.text:55416D07                 call    ?GetSignature@Misc@Util@@YA?AVCTXStringW@@PBD@Z ; Util::Misc::GetSignature(char const *)
.text:55416D0C                 mov     eax, [ebp+8]
.text:55416D0F                 pop     ecx
.text:55416D10                 pop     ecx
.text:55416D11                 pop     ebp
.text:55416D12                 retn
.text:55416D12 ?Get32ByteValueAddedSign@Misc@Util@@YA?AVCTXStringW@@XZ endp
当前登陆QQ号  是通过 ?GetSelfUin@Contact@Util@@YAKXZ 获取的
.text:55416CFC ; class CTXStringW __cdecl Util::Misc::Get32ByteValueAddedSign(void)
.text:55416CFC                 public ?Get32ByteValueAddedSign@Misc@Util@@YA?AVCTXStringW@@XZ
.text:55416CFC ?Get32ByteValueAddedSign@Misc@Util@@YA?AVCTXStringW@@XZ proc near
.text:55416CFC                                         ; CODE XREF: Util::URL::AdjustUrl(CTXStringW const &,Util::URL::URLMODIFYLEVEL,CTXStringW const &,wchar_t const *)+A8↓p
.text:55416CFC                                         ; Util::URL::GetKeyFmt(CFmtString &)+21↓p ...
.text:55416CFC                 push    ebp
.text:55416CFD                 mov     ebp, esp
.text:55416CFF                 push    offset aBuf32bytevalue ; "buf32ByteValueAddedSignature"
.text:55416D04                 push    dword ptr [ebp+8]
.text:55416D07                 call    ?GetSignature@Misc@Util@@YA?AVCTXStringW@@PBD@Z ; Util::Misc::GetSignature(char const *)
.text:55416D0C                 mov     eax, [ebp+8]
.text:55416D0F                 pop     ecx
.text:55416D10                 pop     ecx
.text:55416D11                 pop     ebp
.text:55416D12                 retn
.text:55416D12 ?Get32ByteValueAddedSign@Misc@Util@@YA?AVCTXStringW@@XZ endp
当前登陆QQ号  是通过 ?GetSelfUin@Contact@Util@@YAKXZ 获取的
int __fastcall Util::Contact::GetSelfUin(int a1)
{
  int result; // eax
  int v2; // esi
  int v3; // [esp-8h] [ebp-8h]
 
  v3 = a1;
  result = dword_554F12AC;
  if ( !dword_554F12AC )
  {
    v3 &= dword_554F12AC;
    sub_55404A73(&v3);
    if ( v3 )
      (*(void (__stdcall **)(int, int *))(*(_DWORD *)v3 + 48))(v3, &dword_554F12AC);
    v2 = dword_554F12AC;
    sub_5540C87C(&v3);
    result = v2;
  }
  return result;
}
.text:55405EA9                 public ?GetSelfUin@Contact@Util@@YAKXZ
.text:55405EA9 ?GetSelfUin@Contact@Util@@YAKXZ proc near
.text:55405EA9                                         ; CODE XREF: .text:5535A2FE↑p
.text:55405EA9                                         ; .text:5535A921↑p ...
.text:55405EA9                 push    ebp
.text:55405EAA                 mov     ebp, esp
.text:55405EAC                 push    ecx
.text:55405EAD                 mov     eax, dword_554F12AC
.text:55405EB2                 test    eax, eax
.text:55405EB4                 jnz     short loc_55405EE7
.text:55405EB6                 and     [ebp-4], eax
.text:55405EB9                 lea     eax, [ebp-4]
.text:55405EBC                 push    eax
.text:55405EBD                 call    sub_55404A73
.text:55405EC2                 mov     eax, [ebp-4]
.text:55405EC5                 pop     ecx
.text:55405EC6                 test    eax, eax
.text:55405EC8                 jz      short loc_55405ED5
.text:55405ECA                 mov     ecx, [eax]
.text:55405ECC                 push    offset dword_554F12AC
.text:55405ED1                 push    eax
.text:55405ED2                 call    dword ptr [ecx+30h]
.text:55405ED5
.text:55405ED5 loc_55405ED5:                           ; CODE XREF: Util::Contact::GetSelfUin(void)+1F↑j
.text:55405ED5                 push    esi
.text:55405ED6                 mov     esi, dword_554F12AC
.text:55405EDC                 lea     ecx, [ebp-4]
.text:55405EDF                 call    sub_5540C87C
.text:55405EE4                 mov     eax, esi
.text:55405EE6                 pop     esi
.text:55405EE7
.text:55405EE7 loc_55405EE7:                           ; CODE XREF: Util::Contact::GetSelfUin(void)+B↑j
.text:55405EE7                 mov     esp, ebp
.text:55405EE9                 pop     ebp
.text:55405EEA                 retn
.text:55405EEA ?GetSelfUin@Contact@Util@@YAKXZ endp
接下来写代码 就可以了 ,这里我采用远程注入的方式 进行 操作,代码是易语言代码,其他的语言 自行修改即可
int __fastcall Util::Contact::GetSelfUin(int a1)
{
  int result; // eax
  int v2; // esi
  int v3; // [esp-8h] [ebp-8h]
 
  v3 = a1;
  result = dword_554F12AC;
  if ( !dword_554F12AC )
  {
    v3 &= dword_554F12AC;
    sub_55404A73(&v3);
    if ( v3 )
      (*(void (__stdcall **)(int, int *))(*(_DWORD *)v3 + 48))(v3, &dword_554F12AC);
    v2 = dword_554F12AC;
    sub_5540C87C(&v3);
    result = v2;
  }
  return result;
}
.text:55405EA9                 public ?GetSelfUin@Contact@Util@@YAKXZ
.text:55405EA9 ?GetSelfUin@Contact@Util@@YAKXZ proc near
.text:55405EA9                                         ; CODE XREF: .text:5535A2FE↑p
.text:55405EA9                                         ; .text:5535A921↑p ...
.text:55405EA9                 push    ebp
.text:55405EAA                 mov     ebp, esp
.text:55405EAC                 push    ecx
.text:55405EAD                 mov     eax, dword_554F12AC
.text:55405EB2                 test    eax, eax
.text:55405EB4                 jnz     short loc_55405EE7
.text:55405EB6                 and     [ebp-4], eax
.text:55405EB9                 lea     eax, [ebp-4]
.text:55405EBC                 push    eax
.text:55405EBD                 call    sub_55404A73
.text:55405EC2                 mov     eax, [ebp-4]
.text:55405EC5                 pop     ecx
.text:55405EC6                 test    eax, eax
.text:55405EC8                 jz      short loc_55405ED5
.text:55405ECA                 mov     ecx, [eax]
.text:55405ECC                 push    offset dword_554F12AC
.text:55405ED1                 push    eax
.text:55405ED2                 call    dword ptr [ecx+30h]
.text:55405ED5
.text:55405ED5 loc_55405ED5:                           ; CODE XREF: Util::Contact::GetSelfUin(void)+1F↑j
.text:55405ED5                 push    esi
.text:55405ED6                 mov     esi, dword_554F12AC
.text:55405EDC                 lea     ecx, [ebp-4]
.text:55405EDF                 call    sub_5540C87C
.text:55405EE4                 mov     eax, esi
.text:55405EE6                 pop     esi
.text:55405EE7
.text:55405EE7 loc_55405EE7:                           ; CODE XREF: Util::Contact::GetSelfUin(void)+B↑j
.text:55405EE7                 mov     esp, ebp
.text:55405EE9                 pop     ebp
.text:55405EEA                 retn
.text:55405EEA ?GetSelfUin@Contact@Util@@YAKXZ endp
接下来写代码 就可以了 ,这里我采用远程注入的方式 进行 操作,代码是易语言代码,其他的语言 自行修改即可

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 3
支持
分享
最新回复 (11)
雪    币: 355
活跃值: (15)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
mark 一下
2019-10-14 14:42
0
雪    币: 23
活跃值: (1486)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Q共享内存就有 没必要去注入
2019-10-14 15:12
0
雪    币: 711
活跃值: (253)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
膜拜一下
2019-10-14 15:42
0
雪    币: 11102
活跃值: (3035)
能力值: ( LV5,RANK:71 )
在线值:
发帖
回帖
粉丝
5
易语言好牛逼啊,这都能搞
2019-10-14 19:50
0
雪    币: 865
活跃值: (1613)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
大佬 能讲解一下QQ怎么OD附加吗,我Q盾搞不来
2019-10-14 20:52
0
雪    币: 6227
活跃值: (5665)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
7
感谢分享,支持一下,目前用不到,MARK一下!
2019-10-14 23:06
0
雪    币: 29182
活跃值: (63656)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
8
mark!
2019-10-17 14:41
0
雪    币: 8
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
mark
2019-10-18 09:08
0
雪    币: 258
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习一下
2019-11-6 11:24
0
游客
登录 | 注册 方可回帖
返回
//