通过进程ID获取基地址
生活随笔
收集整理的這篇文章主要介紹了
通过进程ID获取基地址
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
From: http://blog.csdn.net/firefoxbug/article/details/7201351
下面代碼是通過進程ID來獲取進程的基地址,創建一個進程快照后,讀取進程模塊,一般情況下第一個模塊就是進程的基地址,下面的程序通過模塊的字符串匹配來找到基地址。通過MODULEENTRY32來讀取,下面是代碼:
#include <Windows.h> #include <Tlhelp32.h> #include <stdio.h>HMODULE fnGetProcessBase(DWORD PID); DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle) ;int main() {HMODULE hModule = fnGetProcessBase(6520);printf("%X",hModule);return 0; }HMODULE fnGetProcessBase(DWORD PID) {//獲取進程基址HANDLE hSnapShot;//通過CreateToolhelp32Snapshot和線程ID,獲取進程快照hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);if (hSnapShot == INVALID_HANDLE_VALUE){GetLastErrorBox(NULL,"無法創建快照");return NULL;}MODULEENTRY32 ModuleEntry32;ModuleEntry32.dwSize = sizeof(ModuleEntry32);if (Module32First(hSnapShot, &ModuleEntry32)){do {TCHAR szExt[5];strcpy(szExt, ModuleEntry32.szExePath + strlen(ModuleEntry32.szExePath) - 4);for (int i = 0;i < 4;i++){if ((szExt[i] >= 'a')&&(szExt[i] <= 'z')){szExt[i] = szExt[i] - 0x20;}}if (!strcmp(szExt, ".EXE")){CloseHandle(hSnapShot);return ModuleEntry32.hModule;}} while (Module32Next(hSnapShot, &ModuleEntry32));}CloseHandle(hSnapShot);return NULL;}// 顯示錯誤信息 DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle) { LPVOID lpv; DWORD dwRv; if (GetLastError() == 0) return 0; dwRv = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR)&lpv, 0, NULL); MessageBox(hWnd, (LPCSTR)lpv, lpTitle, MB_OK); if(dwRv) LocalFree(lpv); SetLastError(0); return dwRv; }總結
以上是生活随笔為你收集整理的通过进程ID获取基地址的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex4项目html-template
- 下一篇: FlashCache初体验