超级大碰碰 发表于 2021-8-23 15:58

内存读取本机已登录QQ,剔除离线

#include <iostream>
#include <windows.h>
#include <TlHelp32.h>
using namespace std;


DWORD GetModuleInfo(DWORD pid,const wchar_t*name)
{
        MODULEENTRY32 module;
        module.dwSize = sizeof(module);
        HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
        if (handle == INVALID_HANDLE_VALUE)
        {
                return 0;
        }
        BOOL ret = Module32First(handle, &module);
        while (ret)
        {
                if (!wcscmp(name, module.szModule))
                {
                        CloseHandle(handle);
                        return (DWORD)module.modBaseAddr;
                }
                ret = Module32Next(handle, &module);
        }
        CloseHandle(handle);
        return 0;
}

DWORD 取QQ号(DWORD pid)
{
        HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
        if (!hprocess)
        {
                cout << "打开进程失败,错误码:" << GetLastError() << endl;
                return 0;
        }
        DWORD addr = GetModuleInfo(pid, L"AudioVideo.dll") + 0x8015FC;//QQ号码
        DWORD num = 0;
        BOOL ret = ReadProcessMemory(hprocess, (LPCVOID)addr, &num, 4, NULL);
        if (!ret)
        {
                cout << "读取内存失败,错误码:" << GetLastError() << endl;
                CloseHandle(hprocess);
                return 0;
        }
        else
        {
                DWORD addr1 = GetModuleInfo(pid, L"PreloginLogic.dll") + 0x1165B0;//该QQ在线为1,不在线为0
                DWORD isonline = 666;
                if (ReadProcessMemory(hprocess, (LPCVOID)addr1, &isonline, 4, NULL) && isonline == 1)
                {
                        CloseHandle(hprocess);
                        return num;
                }

        }
        CloseHandle(hprocess);
        return 0;
}




BOOL 该QQ是否在线(DWORD Q号)
{
        PROCESSENTRY32 pe;
        pe.dwSize = sizeof(pe);
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        BOOL ret = Process32First(hSnapshot, &pe);
        while (ret)
        {
                if (!wcscmp(L"QQ.exe", pe.szExeFile))
                {
                        if (取QQ号(pe.th32ProcessID) == Q号)
                        {
                                CloseHandle(hSnapshot);
                                return TRUE;
                        }
                }
                ret = Process32Next(hSnapshot, &pe);
        }
        CloseHandle(hSnapshot);
        return FALSE;

}


int main()//适用于当前最新版本:QQ 9.4.9(27849),其它版本未测试
{
        DWORD QQnum = 0;
        while (TRUE)
        {
                cout << "请输入要检测是否在线的QQ号:" << endl;
                cin >> QQnum;
                if (QQnum)
                {
                        cout << "你输入的QQ号为: " << QQnum << endl;
                        break;
                }
        }

        clock_t start = clock();
        BOOL ret = 该QQ是否在线(QQnum);
        clock_t end = clock();
        cout <<"该QQ号:"<< QQnum << " 在线状态为: " << ret <<"耗时: " <<end-start<<"ms" << endl;
       
        system("pause");
        return 0;
}

超级大碰碰 发表于 2021-8-28 14:09

经测试,当前(8月28号)更新的最新版本QQ 9.5.0(27852) ,同样适用本代码。

超级大碰碰 发表于 2021-8-23 17:34

涛之雨 发表于 2021-8-23 17:20
感觉这个过程可以稍微在脱破区讲解一下,
或者也可以在动画区发一下操作的视频,



查找方法:
CE附加QQ。代码用的最新版的QQ,QQ 9.4.9(27849)。
直接搜索4字节QQ号,搜到的数据,拉到最下方,有绿色的,选一个来读取。

关于剔除离线的。首先在QQ在线(含隐身忙碌离开等)的时候,搜索4字节1,然后离线后搜0,同样有个绿色的。

数据找出来了,就剩下读取内存了。

等到烟火也清凉 发表于 2021-8-23 17:09

咋找到这些值 的

超级大碰碰 发表于 2021-8-23 17:14

等到烟火也清凉 发表于 2021-8-23 17:09
咋找到这些值 的

用CE找的。我测试过win10 win11 win8,只要是最新版的QQ,都能读到QQ号,而且剔除了离线的QQ。

涛之雨 发表于 2021-8-23 17:20

超级大碰碰 发表于 2021-8-23 17:14
用CE找的。我测试过win10 win11 win8,只要是最新版的QQ,都能读到QQ号,而且剔除了离线的QQ。

感觉这个过程可以稍微在脱破区讲解一下,
或者也可以在动画区发一下操作的视频,

感觉这个分析的过程挺麻烦的,也更方便大家学习

IBinary 发表于 2021-8-23 18:07

Thank you. QQ内部kernelutil中可以调用他的函数来返回自己的QQ号. 好像叫做 Getxxx

要塞暗哨 发表于 2021-8-24 21:53

刚入坑编程。,来学学新技术

wtuqi 发表于 2022-6-12 12:07

等到烟火也清凉 发表于 2021-8-23 17:09
咋找到这些值 的

建议网友还是扎实编程方面基本工,不要把精力花费在易语言上,更不要一味的停留在下载工具,使用工具的层面很难对自身有所促进,数10年也不过是原地踏步,也难对论坛环境也难有促进.感觉这章还是不错的,确实达到了抛砖的作用.

ryu5973 发表于 2022-7-7 20:40

感谢分享
页: [1]
查看完整版本: 内存读取本机已登录QQ,剔除离线