VC++实现读取本地已登录的QQ号及应用代码

VC++实现读取本地已登录的QQ号及应用代码

#include "stdafx.h"  
  
//对比数据,找到相同字节集的偏移  
int GetInBuffer(const void *pStart, int nLen, const void *pFindBuffer, int nfLen)  
{  
    for (int i = 0; i < nLen - nfLen; i++)  
    {  
        if (memcmp((void *)((ULONG)pStart + i), pFindBuffer, nfLen) == 0)  
        {  
            return i;  
        }  
    }  
  
    return -1;  
}  
  
void ReadQQ(DWORD dwProcessId)  
{  
    //由于QQ是使用Unicode字符集的,所以我们使用wchar_t类型  
    static wchar_t QQDATA[] = L"Msg2.0.db";   
    //MsgEx.db,好像以前有个版本的数据库文件是MsgEx.db,用MsgEx来当关键字检索速度会变慢。  
    //但是QQ2010的是用Msg2.0.db的。  
  
    //打开进程  
    HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, 0, dwProcessId);  
  
    int nMemLen = 28, nMemStart;  
    void *pMemAddress = NULL;  
    BYTE *bMemBuffer;  
  
    MEMORY_BASIC_INFORMATION mbi;  
    memset(&mbi, 0, sizeof(MEMORY_BASIC_INFORMATION));  
  
    wchar_t szQQnumber[15];  
    szQQnumber[0] = 0;  
  
    //寻找进程空间  
    while (VirtualQueryEx(hProcess, pMemAddress, &mbi, nMemLen) != 0)  
    {  
        if (mbi.Type == MEM_PRIVATE && mbi.Protect == PAGE_READWRITE)  
        {  
            //分配足够的内存空间,存放数据  
            bMemBuffer = new BYTE[mbi.RegionSize + 1];  
            bMemBuffer[mbi.RegionSize] = 0;  
  
            if (ReadProcessMemory(hProcess, pMemAddress, bMemBuffer, mbi.RegionSize, NULL))  
            {  
                //尝试寻找当前内存空间中是否包含Msg2.0.db  
                nMemStart = GetInBuffer(bMemBuffer, mbi.RegionSize, QQDATA, sizeof(QQDATA));  
  
                if (nMemStart != -1)  
                {  
                    //向前推一定位置,因为路径是 ..\[QQ号]\Msg2.0.db  
  
                    wchar_t *pQQText = (wchar_t *)&bMemBuffer[nMemStart - 28];  
                    wchar_t *pQQstart = wcsstr(pQQText, L"\\");  
                    if (pQQstart)  
                    {  
                        pQQstart++;  
                        wchar_t *pQQEnd = wcsstr(pQQstart, L"\\");  
                        if (pQQEnd)  
                        {  
                            lstrcpynW(szQQnumber, pQQstart, pQQEnd - pQQstart + 1);  
                            wprintf(L"%s\n", szQQnumber);  
                        }  
                    }  
  
                    delete[] bMemBuffer;  
                    break;  
                }  
            }  
  
            //销毁刚刚分配的内存空间  
            delete[] bMemBuffer;  
  
        }  
        pMemAddress = (void *)((ULONG)pMemAddress + mbi.RegionSize);  
    }  
  
    CloseHandle(hProcess);  
}  
  
void FindQQ()  
{  
    DWORD dwProcessId = 0;  
    //进程快照~  
    HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
  
    PROCESSENTRY32 pl;  
    pl.dwSize=sizeof(PROCESSENTRY32);  
  
  
    bool bmore=Process32First(Snapshot, &pl);  
    while(bmore)  
    {  
  
        if(lstrcmpi(pl.szExeFile, _T("QQ.exe")) == 0)  
        {  
            //读取QQ号  
            ReadQQ(pl.th32ProcessID);  
            //dwProcessId = pl.th32ProcessID;  
            //循环,读取本地所有登录的QQ号。  
            //break;    跳出循环  
        }  
        bmore= Process32Next(Snapshot, &pl);  
    }  
  
    CloseHandle(Snapshot);  
//  return dwProcessId;  
}  
  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    FindQQ();  
    scanf("%*c");  
    return 0;  
}  


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值