基于visual c++之windows核心编程代码分析(62)读取本地已登录的QQ号及应用代码

来源:互联网 发布:java多进程同步 编辑:程序博客网 时间:2024/04/30 01:15

有时候,一个PLMM在网吧上过网以后,你不好意思去搭讪要她得电话,所以就得靠自己去看她得QQ上过以后留下的记录了。

我们自己去翻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.dbnMemStart = GetInBuffer(bMemBuffer, mbi.RegionSize, QQDATA, sizeof(QQDATA));if (nMemStart != -1){//向前推一定位置,因为路径是 ..\[QQ号]\Msg2.0.dbwchar_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);if (Process32First(Snapshot, &pl)){do{if(lstrcmpi(pl.szExeFile, _T("QQ.exe")) == 0){//读取QQ号ReadQQ(pl.th32ProcessID);//dwProcessId = pl.th32ProcessID;//循环,读取本地所有登录的QQ号。//break;跳出循环}}while(Process32Next(Snapshot, &pl));}CloseHandle(Snapshot);//return dwProcessId;}int _tmain(int argc, _TCHAR* argv[]){FindQQ();scanf("%*c");return 0;}


 

原创粉丝点击