这是很早之前的东西了,只是网上很少人放出来,具体的分析过程我也不记得了!大概说一下思路吧!
1、当QQ/TIM 启动的时候 会在本地创建一个小型的web服务器 比如 访问这个网页 就能提取出 http://localhost.ptlogin2.qq.com:4300/mc_get_uins 你当前登陆的所有QQ 但是 他只能显示出来登陆了几个,不能进行操作
2、登陆QQ之后,我们可以直接在QQ的面板点击 QQ空间进入 https://ssl.ptlogin2.qq.com/jump?ptlang=2052&clientuin=“+clientuin+”&clientkey="+clientkey+"&u1=https:%2F%2Fuser.qzone.qq.com%2F“+clientuin+”%2Finfocenter&source=panelstar
3、通过访问这个网址,可以获取到对应的cookies 从而完成快捷登陆,QQ9.1版本开始修复了 clientkey直接通过网页版获取,而是通过控件获取,导致我们无法加载控件
4、我们可以通过直接在内存中,完成 clientkey的计算 ,方法 包括了 内存搜索、 或者 调用相关的函数 本章 讲的是 如何调用 相关的函数计算
5、对应的算法 是 KernelUtil.dll 中 ?GetSignature@Misc@Util@@YA?AVCTXStringW@@PBD@Z
6、IDA载入后分析该函数
[C] 纯文本查看 复制代码 CTXStringW *__cdecl Util::Misc::GetSignature(CTXStringW *a1, int a2)
{
int v2; // eax
char v4; // [esp+0h] [ebp-10h]
int v5; // [esp+4h] [ebp-Ch]
int v6; // [esp+8h] [ebp-8h]
int v7; // [esp+Ch] [ebp-4h]
CTXStringW::CTXStringW(a1);
v5 = 0;
sub_55404A73(&v5);
if ( v5 )
{
v6 = 0;
if ( (*(*v5 + 60))(v5, a2, &v6) >= 0 )
{
v7 = 0;
sub_5536126A(v6);
v2 = Util::Encode::Encode16(&v4, &v7);
CTXStringW::operator=(a1, v2);
CTXStringW::~CTXStringW(&v4);
if ( v7 )
(*(*v7 + 8))(v7);
}
sub_5540C87C(&v6);
}
sub_5540C87C(&v5);
return a1;
}
7、发现有2个参数 其中 a1 是返回值 a2是主要参数 ,查看交叉引用
[C] 纯文本查看 复制代码 CTXStringW *__cdecl Util::Misc::Get32ByteValueAddedSign(CTXStringW *a1)
{
Util::Misc::GetSignature(a1, "buf32ByteValueAddedSignature");
return a1;
}
8、定为关键位置
[Asm] 纯文本查看 复制代码 .text:55416*FC ; class CTXStringW __cdecl Util::Misc::Get32ByteValueAddedSign(void)
.text:55416*FC public ?Get32ByteValueAddedSign@Misc@Util@@YA?AVCTXStringW@@XZ
.text:55416*FC ?Get32ByteValueAddedSign@Misc@Util@@YA?AVCTXStringW@@XZ proc near
.text:55416*FC ; CODE XREF: Util::URL::AdjustUrl(CTXStringW const &,Util::URL::URLMODIFYLEVEL,CTXStringW const &,wchar_t const *)+A8↓p
.text:55416*FC ; Util::URL::GetKeyFmt(*FmtString &)+21↓p ...
.text:55416*FC
.text:55416*FC arg_0 = dword ptr 8
.text:55416*FC
.text:55416*FC push ebp
.text:55416*FD mov ebp, esp
.text:55416*FF push offset aBuf32bytevalue ; "buf32ByteValueAddedSignature"
.text:55416D04 push [ebp+arg_0]
.text:55416D07 call ?GetSignature@Misc@Util@@YA?AVCTXStringW@@PBD@Z ; Util::Misc::GetSignature(char const *)
.text:55416D0C mov eax, [ebp+arg_0]
.text:55416D0F pop ecx
.text:55416D10 pop ecx
.text:55416D11 pop ebp
.text:55416D12 retn
9、函数代码不太难,直接远程注入,得到结果之后,构建第2步的网址,访问网页,发现 登陆成功了! 剩下的无非就是基本的网页抓包分析了!
10、值得注意的是,每个不同版本的QQ/TIM 所对应的 offset是不同的,所以需要动态获取
完整代码如下
12、整个快捷登陆代码如下
模块地址 https://www.leybc.com/thread-2843-1-1.html 模块中的命令都是乐易模块的!
|