通过进程ID获取基地址

绝地灬酷狼 2022-06-16 11:28 377阅读 0赞

下面代码是通过进程ID来获取进程的基地址,创建一个进程快照后,读取进程模块,一般情况下第一个模块就是进程的基地址,下面的程序通过模块的字符串匹配来找到基地址。通过MODULEENTRY32来读取,下面是代码:

  1. #include <Windows.h>
  2. #include <Tlhelp32.h>
  3. #include <stdio.h>
  4. HMODULE fnGetProcessBase(DWORD PID);
  5. DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle) ;
  6. int main()
  7. {
  8. HMODULE hModule = fnGetProcessBase(6520);
  9. printf("%X",hModule);
  10. return 0;
  11. }
  12. HMODULE fnGetProcessBase(DWORD PID)
  13. {
  14. //获取进程基址
  15. HANDLE hSnapShot;
  16. //通过CreateToolhelp32Snapshot和线程ID,获取进程快照
  17. hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);
  18. if (hSnapShot == INVALID_HANDLE_VALUE)
  19. {
  20. GetLastErrorBox(NULL,"无法创建快照");
  21. return NULL;
  22. }
  23. MODULEENTRY32 ModuleEntry32;
  24. ModuleEntry32.dwSize = sizeof(ModuleEntry32);
  25. if (Module32First(hSnapShot, &ModuleEntry32))
  26. {
  27. do
  28. {
  29. TCHAR szExt[5];
  30. strcpy(szExt, ModuleEntry32.szExePath + strlen(ModuleEntry32.szExePath) - 4);
  31. for (int i = 0;i < 4;i++)
  32. {
  33. if ((szExt[i] >= 'a')&&(szExt[i] <= 'z'))
  34. {
  35. szExt[i] = szExt[i] - 0x20;
  36. }
  37. }
  38. if (!strcmp(szExt, ".EXE"))
  39. {
  40. CloseHandle(hSnapShot);
  41. return ModuleEntry32.hModule;
  42. }
  43. } while (Module32Next(hSnapShot, &ModuleEntry32));
  44. }
  45. CloseHandle(hSnapShot);
  46. return NULL;
  47. }
  48. // 显示错误信息
  49. DWORD GetLastErrorBox(HWND hWnd, LPSTR lpTitle)
  50. {
  51. LPVOID lpv;
  52. DWORD dwRv;
  53. if (GetLastError() == 0) return 0;
  54. dwRv = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
  55. FORMAT_MESSAGE_FROM_SYSTEM,
  56. NULL,
  57. GetLastError(),
  58. MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
  59. (LPSTR)&lpv,
  60. 0,
  61. NULL);
  62. MessageBox(hWnd, (LPCSTR)lpv, lpTitle, MB_OK);
  63. if(dwRv)
  64. LocalFree(lpv);
  65. SetLastError(0);
  66. return dwRv;
  67. }

发表评论

表情:
评论列表 (有 0 条评论,377人围观)

还没有评论,来说两句吧...

相关阅读

    相关 通过进程ID获取基地

    下面代码是通过进程ID来获取进程的[基地址][Link 1],创建一个进程快照后,读取进程模块,一般情况下第一个模块就是进程的基地址,下面的程序通过模块的字符串匹配来找到基地址