Procmem.cpp
上传用户:tzh4061
上传日期:2007-01-08
资源大小:309k
文件大小:4k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. /*************************************************************
  2. Module name: ProcMem.C
  3. Notices: Copyright (c) 1995-1997 Jeffrey Richter
  4. *************************************************************/
  5. #include "CmnHdr.H"                  /* See Appendix C. */
  6. #include <windows.h>
  7. #include "ProcMem.H"
  8. //////////////////////////////////////////////////////////////
  9. #if defined(_X86_)
  10. #define STACKPTR(Context)  ((Context).Esp)
  11. #endif
  12. #if defined(_MIPS_)
  13. #define STACKPTR(Context)  ((Context).IntSp)
  14. #endif
  15. #if defined(_ALPHA_)
  16. #define STACKPTR(Context)  ((Context).IntSp)
  17. #endif
  18. #if defined(_PPC_)
  19. #define STACKPTR(Context)  ((Context).Gpr1)
  20. #endif
  21. #if !defined(STACKPTR)
  22. #error Module contains CPU-specific code; modify and recompile.
  23. #endif
  24. //////////////////////////////////////////////////////////////
  25. PVOID AllocProcessMemory (HANDLE hProcess, DWORD dwNumBytes) {
  26.    CONTEXT Context;
  27.    DWORD dwThreadId, dwNumBytesXferred, dwError;
  28.    HANDLE hThread;
  29.    HINSTANCE hinstKrnl = GetModuleHandle(__TEXT("Kernel32"));
  30.    PVOID pvMem = NULL;
  31.    MEMORY_BASIC_INFORMATION mbi;
  32.    BOOL fOk = FALSE;    // Assume failure.
  33.    __try {
  34.       hThread = CreateRemoteThread(
  35.          hProcess, 
  36.          NULL,          // Default security
  37.          dwNumBytes + sizeof(HANDLE),
  38.                         // Amount of memory to allocate in
  39.                         // the remote process plus 4 bytes
  40.                         // for a thread handle
  41.          (LPTHREAD_START_ROUTINE)
  42.             GetProcAddress(hinstKrnl, "ExitThread"),
  43.                         // Address of function where thread
  44.                         // should begin execution. We pass the
  45.                         // address of ExitThread so that the
  46.                         // stack will be destroyed.
  47.          0,             // Parameter passed to thread function.
  48.                         // This will be passed to ExitThread.
  49.          CREATE_SUSPENDED, // Flags. We must create the thread
  50.                            // suspended so that the thread
  51.                            // doesn't terminate before we use
  52.                            // the allocated memory.
  53.          &dwThreadId);     // ID of the new thread
  54.       if (hThread == NULL) {  
  55.          dwError = GetLastError();  // For debugging
  56.          __leave;
  57.       }
  58.       Context.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
  59.       if (!GetThreadContext(hThread, &Context))
  60.          __leave;
  61.       // Determine the bottom address of the committed memory.
  62.       if (sizeof(mbi) != VirtualQueryEx(hProcess,
  63.          (PDWORD) STACKPTR(Context) - 1, &mbi, sizeof(mbi)))
  64.          __leave;
  65.       // Store the remote thread's handle in the bottommost
  66.       // bytes of the allocated memory.
  67.       pvMem = (PVOID) mbi.BaseAddress;
  68.       fOk = WriteProcessMemory(hProcess, pvMem, &hThread, 
  69.          sizeof(hThread), &dwNumBytesXferred);
  70.       if (!fOk) 
  71.          __leave;
  72.       // Point past the thread's handle.
  73.       pvMem = (PVOID) ((PHANDLE) pvMem + 1);
  74.    }
  75.    __finally {
  76.       if (!fOk) {
  77.          if (hThread) {
  78.             ResumeThread(hThread);
  79.             CloseHandle(hThread);
  80.          }
  81.          pvMem = NULL;
  82.       }
  83.    }     
  84.     
  85.     return(pvMem);
  86. }
  87. //////////////////////////////////////////////////////////////
  88. BOOL FreeProcessMemory (HANDLE hProcess, PVOID pvMem) {
  89.    BOOL fOk;
  90.    HANDLE hThread;
  91.    DWORD dwNumBytesXferred;
  92.    // Get the handle of the remote thread from the block of 
  93.    // memory.
  94.    pvMem = (PVOID) ((PHANDLE) pvMem - 1);
  95.    fOk = ReadProcessMemory(hProcess, pvMem, &hThread, 
  96.       sizeof(hThread), &dwNumBytesXferred);
  97.    if (fOk) {
  98.       if (ResumeThread(hThread) == 0xffffffff) {
  99.          // Resume failed, probably because the application
  100.          // overwrote the memory containing the handle.
  101.          fOk = FALSE;
  102.       }
  103.       CloseHandle(hThread);
  104.    }
  105.    return(fOk);
  106. }
  107. //////////////////////// End Of File /////////////////////////