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

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

2019-10-14 14:21
10767

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


进入之后 是这样的状态  d7dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6#2M7$3g2J5i4K6u0W2M7i4A6G2L8X3g2Q4x3X3g2I4M7g2)9J5k6h3y4G2L8g2)9J5c8W2!0q4z5q4!0n7c8W2)9&6z5g2!0q4z5g2)9^5y4#2)9^5b7#2!0q4y4W2)9&6z5q4!0m8c8W2!0q4y4q4!0n7c8q4!0m8x3q4!0q4y4#2)9&6b7g2)9^5y4q4q4c8i4@1f1#2i4K6S2r3i4@1t1%4i4K6u0r3K9h3&6X3L8$3y4W2L8Y4c8W2M7W2)9J5y4X3&6T1M7%4m8Q4x3@1t1`.
我们在地址栏 按下 CTRL+Z 会出现一串很长的网址 
fe9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6M7$3I4Q4x3X3g2H3N6r3I4G2k6$3W2F1x3W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3K9Y4g2E0M7q4)9K6c8Y4m8@1L8r3q4F1k6#2)9K6c8o6t1H3y4e0u0Q4x3U0k6S2L8i4m8Q4x3@1u0U0L8r3W2W2L8Y4c8#2K9h3&6Q4x3@1c8c8f1g2)9J5y4X3q4E0M7q4)9K6b7X3y4D9K9h3g2F1N6r3E0W2P5g2)9K6c8r3y4D9K9h3g2F1N6r3E0W2P5g2)9J5y4X3q4E0M7q4)9K6b7Y4f1I4i4K6y4p5K9s2c8@1M7s2y4Q4x3@1q4Q4x3U0f1J5c8W2)9J5y4e0u0r3N6i4y4W2M7W2)9J5k6i4q4*7L8$3&6W2i4K6u0W2M7i4q4Q4x3X3g2U0L8$3#2Q4x3U0f1J5f1g2q4Q4x3U0f1J5c8X3W2F1k6X3!0U0k6h3&6@1k6i4u0Q4x3U0k6S2L8i4m8Q4x3@1u0K6L8%4g2J5j5$3g2Q4x3@1c8H3j5h3&6W2L8s2y4@1j5i4t1`.

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

忘记以前是怎么定位的了,只记得是 KernelUtil.dll 中的  ?GetSignature@Misc@Util@@YA?AVCTXStringW@@PBD@Z   IDA附加 定位到函数
进入之后 是这样的状态  d7dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6#2M7$3g2J5i4K6u0W2M7i4A6G2L8X3g2Q4x3X3g2I4M7g2)9J5k6h3y4G2L8g2)9J5c8W2!0q4z5q4!0n7c8W2)9&6z5g2!0q4z5g2)9^5y4#2)9^5b7#2!0q4y4W2)9&6z5q4!0m8c8W2!0q4y4q4!0n7c8q4!0m8x3q4!0q4y4#2)9&6b7g2)9^5y4q4q4c8i4@1f1#2i4K6S2r3i4@1t1%4i4K6u0r3K9h3&6X3L8$3y4W2L8Y4c8W2M7W2)9J5y4X3&6T1M7%4m8Q4x3@1t1`.
我们在地址栏 按下 CTRL+Z 会出现一串很长的网址 
fe9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6M7$3I4Q4x3X3g2H3N6r3I4G2k6$3W2F1x3W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3K9Y4g2E0M7q4)9K6c8Y4m8@1L8r3q4F1k6#2)9K6c8o6t1H3y4e0u0Q4x3U0k6S2L8i4m8Q4x3@1u0U0L8r3W2W2L8Y4c8#2K9h3&6Q4x3@1c8c8f1g2)9J5y4X3q4E0M7q4)9K6b7X3y4D9K9h3g2F1N6r3E0W2P5g2)9K6c8r3y4D9K9h3g2F1N6r3E0W2P5g2)9J5y4X3q4E0M7q4)9K6b7Y4f1I4i4K6y4p5K9s2c8@1M7s2y4Q4x3@1q4Q4x3U0f1J5c8W2)9J5y4e0u0r3N6i4y4W2M7W2)9J5k6i4q4*7L8$3&6W2i4K6u0W2M7i4q4Q4x3X3g2U0L8$3#2Q4x3U0f1J5f1g2q4Q4x3U0f1J5c8X3W2F1k6X3!0U0k6h3&6@1k6i4u0Q4x3U0k6S2L8i4m8Q4x3@1u0K6L8%4g2J5j5$3g2Q4x3@1c8H3j5h3&6W2L8s2y4@1j5i4t1`.

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
接下来写代码 就可以了 ,这里我采用远程注入的方式 进行 操作,代码是易语言代码,其他的语言 自行修改即可

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 3
支持
分享
最新回复 (11)
雪    币: 355
活跃值: (15)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
mark 一下
2019-10-14 14:42
0
雪    币: 23
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Q共享内存就有 没必要去注入
2019-10-14 15:12
0
雪    币: 711
活跃值: (273)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
膜拜一下
2019-10-14 15:42
0
雪    币: 11638
活跃值: (3605)
能力值: ( LV5,RANK:71 )
在线值:
发帖
回帖
粉丝
5
易语言好牛逼啊,这都能搞
2019-10-14 19:50
0
雪    币: 865
活跃值: (1768)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
大佬 能讲解一下QQ怎么OD附加吗,我Q盾搞不来
2019-10-14 20:52
0
雪    币: 7065
活跃值: (6626)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
7
感谢分享,支持一下,目前用不到,MARK一下!
2019-10-14 23:06
0
雪    币: 42935
活跃值: (65742)
能力值: (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
游客
登录 | 注册 方可回帖
返回