您的位置:首页 > 编程语言 > C语言/C++

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

2012-01-24 02:24 771 查看
有时候,一个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.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);
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐