讀寫內存 大概輪廓


ReadProcessMemory 讀另一個進程的內存,原形如下:
BOOL ReadProcessMemory(
HANDLE hProcess, // 被讀取進程的句柄;
LPCVOID lpBaseAddress, // 讀的起始地址;
LPVOID lpBuffer, // 存放讀取數據緩衝區;
DWORD nSize, // 一次讀取的字節數;
LPDWORD lpNumberOfBytesRead // 實際讀取的字節數;
);
hProcess 進程句柄可由OpenProcess 函數得到,原形如下:
HANDLE OpenProcess(
DWORD dwDesiredAccess, // 訪問標誌;
BOOL bInheritHandle, // 繼承標誌;
DWORD dwProcessId // 進程ID;
);

---- 當然,用完別忘了用 CloseHandle 關閉打開的句柄。讀另一個進程的內存 dwDesiredAccess 須指定爲 PROCESS_VM_READ ,寫另一個進程的內存 dwDesiredAccess 須指定爲 PROCESS_VM_WRITE ,繼承標誌無所謂,進程ID可由 Process32First 和 Process32Next 得到,這兩個函數可以枚舉出所有開啓的進程,這樣進程的信息也就得到了。 Process32First 和 Process32Next是由 TLHelp32 單元提供的,需在 uses 里加上TLHelp32。ToolsHelp32 封裝了一些訪問堆、線程、進程等的函數,只適用於Win9x,原形如下:

BOOL WINAPI Process32First(
HANDLE hSnapshot //
由 CreateToolhelp32Snapshot 返回
的系統快照句柄;
LPPROCESSENTRY32 lppe // 指向一個 PROCESSENTRY32 結構;
);
BOOL WINAPI Process32Next(
HANDLE hSnapshot // 由 CreateToolhelp32Snapshot 返回
的系統快照句柄;
LPPROCESSENTRY32 lppe // 指向一個 PROCESSENTRY32 結構;
);
hSnapshot 由 CreateToolhelp32Snapshot 返回的系統快照句柄;
CreateToolhelp32Snapshot 原形如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, // 快照標誌;
DWORD th32ProcessID // 進程ID;
);
現在需要的是進程的信息,所以將 dwFlags
指定爲 TH32CS_SNAPPROCESS,
th32ProcessID 忽略;PROCESSENTRY32 結構如下:
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; // 結構大小;
DWORD cntUsage; // 此進程的引用計數;
DWORD th32ProcessID; // 進程ID;
DWORD th32DefaultHeapID; // 進程默認堆ID;
DWORD th32ModuleID; // 進程模塊ID;
DWORD cntThreads; // 此進程開啓的線程計數;
DWORD th32ParentProcessID;// 父進程ID;
LONG pcPriClassBase; // 線程優先權;
DWORD dwFlags; // 保留;
char szExeFile[MAX_PATH]; // 進程全名;
} PROCESSENTRY32;  

---- 至此,所用到的主要函數已介紹完,實現讀內存只要從下到上依次調用上述函數即可,具體參見原代碼:

 HANDLE hProcess;
 HANDLE hSnapshot;
 
 PROCESSENTRY32 FProcessEntry32;
 DWORD th32ProcessID;

 hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 FProcessEntry32.dwSize=sizeof(FProcessEntry32);
    int Flag=0;
 if(Process32First(hSnapshot,&FProcessEntry32))
 {
  do
  {
   if((CString)FProcessEntry32.szExeFile=="文件加密.EXE")
   {
    Flag=1;
    break;
   }
  }while (Process32Next(hSnapshot, &FProcessEntry32));

  if(Flag==1)
  {
   this->MessageBox(FProcessEntry32.szExeFile);
   th32ProcessID=FProcessEntry32.th32ProcessID;
   DWORD nSize;
   nSize=4;
   char * buff;

   buff=(char*)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,nSize);
   hProcess=OpenProcess(PROCESS_VM_READ,false,th32ProcessID);

   DWORD   dwRead;  
   ReadProcessMemory(hProcess,(LPCVOID)0x000283a2,buff,nSize,&dwRead);  //??
   this->MessageBox((CString)buff);
   
   GlobalFree(buff);
  }
  
 }

 CloseHandle(hSnapshot);

//2種


1.通過FindWindow讀取窗體的句柄

2.通過GetWindowThreadProcessId讀取查找窗體句柄進程的PID值

3.用OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, ProcessId)打開查到PID值的進程. 此打開具備 讀取,寫入,查詢的權限

4.ReadProcessMemory讀出指定的內存地址數據
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章