1. 读取进程内存数据
读取其他进程内存数据,需要用到的windows API函数:
BOOL ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead );
参数比较简单,可以参考MSDN,这里只说一下参数hProcess,可以使用API OpenProcess得到:
2. 获取进程句柄
HANDLE OpenProcess( DWORD fdwAccess, BOOL fInherit, DWORD IDProcess );
参数比较简单,可以参考MSDN,这里只说一下参数IDProcess,也就是进程的ID。这个ID可以通过遍历系统中的进程来获取。
3.得到进程ID
需要遍历系统进程ID,需要使用到三个API。
1)得到进程等信息的快照:
HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID );
2)打开第一个进程
BOOL WINAPI Process32First( HANDLE hSnapshot, LPPROCESSENTRY32 lppe );
3)打开下一个进程
BOOL WINAPI Process32Next( HANDLE hSnapshot, LPPROCESSENTRY32 lppe );
至此,获取其他进程内存空间的知识,已经介绍完毕。下面附上一个简单的例子,如果你需要测试,你自己还需要写一个简单的目标程序。
#include "stdafx.h"
#include
#include
wchar_t buff[2048];
HANDLE OpenProcessName(wchar_t * name);
BOOL FindString(wchar_t *addr, wchar_t *str);
BOOL GetMemory(LONG pAddr, HANDLE hProcess, PVOID pBuff, LONG len, DWORD * read);
int _tmain(int argc, _TCHAR* argv[])
{
//需要被扫描的进程名
wchar_t * Name = L"ReadOtherProcessData.exe";
HANDLE hProcess = OpenProcessName(Name);
DWORD read;
LONG memoryAddr;
LONG findCnt = 0;
LONG j=0;
if (hProcess != NULL)
{
for(LONGLONG i = 0; i < 0x80000000; i+= 4096)
{
memoryAddr = i;
GetMemory(memoryAddr, hProcess, buff, 4, &read);
if (read == 4)
{
printf("addr = %x, data is %x\n", i, *(PLONG)&buff[0]);
findCnt++;
}
else
{
printf("Get data error.\n");
}
}
}
return 0;
}
BOOL FindString(wchar_t *addr, wchar_t *str)
{
if (::wcscmp(addr, str) == 0)
return TRUE;
else
return FALSE;
}
BOOL GetMemory(LONG pAddr, HANDLE hProcess, PVOID pBuff, LONG len, DWORD * read)
{
ReadProcessMemory(hProcess, (LPVOID)pAddr, pBuff, len, read);
if (*read > 0)
return TRUE;
else
return FALSE;
}
HANDLE OpenProcessName(wchar_t * name)
{
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
wchar_t temp[1000];
//打开快照
HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hProcessSnap == NULL)
{
return hProcessSnap;
}
//打开进程
HANDLE hProcess;
BOOL bMore=::Process32First(hProcessSnap,&pe32);//获得第一个进程的信息
while (bMore)
{
::wsprintf(temp,L"%s",pe32.szExeFile);
if (::wcscmp(temp, name) == 0)
{
hProcess=::OpenProcess(PROCESS_ALL_ACCESS,false,(DWORD)pe32.th32ProcessID);
return hProcess;
}
bMore=::Process32Next(hProcessSnap,&pe32);//获得其他进程信息
}
//CloseToolhelp32Snapshot(hProcessSnap);
return NULL;
}