2024年5月27日发(作者:)

#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"";

//,好像以前有个版本的数据库文件是,用MsgEx

来当关键字检索速度会变慢。

//但是QQ2010的是用的。

//打开进程

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 ( == MEM_PRIVATE && t ==

PAGE_READWRITE)

{

//分配足够的内存空间,存放数据

bMemBuffer = new BYTE[Size + 1];

bMemBuffer[Size] = 0;

if (ReadProcessMemory(hProcess, pMemAddress,

bMemBuffer, Size, NULL))

{

//尝试寻找当前内存空间中是否包含

nMemStart = GetInBuffer(bMemBuffer,

Size, QQDATA, sizeof(QQDATA));

if (nMemStart != -1)

{

//向前推一定位置,因为路径是 ..[QQ

号]

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"%sn", szQQnumber);

}

}