读取其他进程内存数据

 

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;
}

你可能感兴趣的:(读取其他进程内存数据)