PROCMEM.CPP
上传用户:yihongxs01
上传日期:2007-01-05
资源大小:48k
文件大小:2k
源码类别:

系统/网络安全

开发平台:

WINDOWS

  1. #include <Windows.H>
  2. #include "ProcMem.h"
  3. //////////////////////////////////////////////////////////////
  4. #if defined(_X86_)
  5. #define STACKPTR(Context)  (Context.Esp)
  6. #endif
  7. #if defined(_MIPS_)
  8. #define STACKPTR(Context)  (Context.IntSp)
  9. #endif
  10. #if defined(_ALPHA_)
  11. #define STACKPTR(Context)  (Context.IntSp)
  12. #endif
  13. #if !defined(STACKPTR)
  14. #error Module contains CPU-specific code; modify and re-compile.
  15. #endif
  16. //////////////////////////////////////////////////////////////
  17. #define ORD_ExitThread ((LPCSTR) MAKEINTRESOURCE(0x55))
  18. //////////////////////////////////////////////////////////////
  19. PVOID AllocProcessMemory (HANDLE hProcess, DWORD dwNumBytes) {
  20. CONTEXT Context;
  21. DWORD dwThreadId, dwNumBytesXferred, dwError;
  22. HANDLE hThread;
  23. HINSTANCE hinstKrnl = GetModuleHandle(__TEXT("Kernel32"));
  24. PVOID pvMem;
  25. MEMORY_BASIC_INFORMATION mbi;
  26. BOOL fOk = FALSE;
  27. __try {
  28. hThread = CreateRemoteThread(
  29. hProcess, 
  30. NULL,
  31. dwNumBytes + sizeof(HANDLE),
  32. (LPTHREAD_START_ROUTINE) 
  33. GetProcAddress(hinstKrnl, ORD_ExitThread), 
  34. 0,
  35. CREATE_SUSPENDED,
  36. &dwThreadId);
  37. if (hThread == NULL) {
  38. dwError = GetLastError();
  39. __leave;
  40. }
  41. Context.ContextFlags = CONTEXT_CONTROL;
  42. if (!GetThreadContext(hThread, &Context))
  43. __leave;
  44. if (sizeof(mbi) != VirtualQueryEx(hProcess,
  45. (PDWORD) STACKPTR(Context) - 1, &mbi, sizeof(mbi)))
  46. __leave;
  47. pvMem = (PVOID) mbi.BaseAddress;
  48. fOk = WriteProcessMemory(hProcess, pvMem, &hThread, 
  49. sizeof(hThread), &dwNumBytesXferred);
  50. if (!fOk) 
  51. __leave;
  52. pvMem = (PVOID) ((PHANDLE) pvMem + 1);
  53. }
  54. __finally {
  55. if (!fOk) {
  56. if (hThread) {
  57. ResumeThread(hThread);
  58. }
  59. pvMem = NULL;
  60. }
  61. }
  62.     
  63.     return(pvMem);
  64. }
  65. //////////////////////////////////////////////////////////////
  66. BOOL FreeProcessMemory (HANDLE hProcess, PVOID pvMem) {
  67. BOOL fOk;
  68. HANDLE hThread;
  69. DWORD dwNumBytesXferred;
  70. pvMem = (PVOID) ((PHANDLE) pvMem - 1);
  71. fOk = ReadProcessMemory(hProcess, pvMem, &hThread, 
  72. sizeof(hThread), &dwNumBytesXferred);
  73. if (fOk) {
  74. if (ResumeThread(hThread) == 0xffffffff) {
  75. fOk = FALSE;
  76. }
  77. CloseHandle(hThread);
  78. }
  79. return(fOk);
  80. }