簡單的CreateRemoteThread例程-初學者必看

  1. // _remotethreaddemo.cpp : Defines the entry point for the console application.
  2. // Author:秋鎮菜
  3. #include "stdafx.h"
  4. #include "windows.h"
  5. // ========== 定義一個代碼結構,本例爲一個對話框============
  6. struct MyData
  7. {
  8.  char sz[64]; // 對話框顯示內容
  9.  DWORD dwMessageBox; // 對話框的地址
  10. };
  11. // ========== 遠程線程的函數 ==============================
  12. DWORD __stdcall RMTFunc(MyData *pData)
  13. {
  14.  typedef int(__stdcall*MMessageBox)(HWND,LPCTSTR,LPCTSTR,UINT);
  15.  MMessageBox MsgBox = (MMessageBox)pData->dwMessageBox;
  16.  MsgBox(NULL, pData->sz, NULL, MB_OK);
  17.  return 0;
  18. }
  19. int main(int argc, char* argv[])
  20. {
  21. // ===== 獲得需要創建REMOTETHREAD的進程句柄 ===============================
  22.  HWND hWnd = FindWindow("notepad", NULL); // 以NOTEPAD爲例
  23.  DWORD dwProcessId;
  24.  ::GetWindowThreadProcessId(hWnd, &dwProcessId);
  25.  HANDLE hProcess = OpenProcess(
  26.         PROCESS_ALL_ACCESS,
  27.         FALSE,
  28.         dwProcessId);
  29. // ========= 代碼結構 ================================================
  30.  MyData data;
  31.  ZeroMemory(&data, sizeof (MyData));
  32.  strcat(data.sz, "對話框的內容.");
  33.  HINSTANCE hUser = LoadLibrary("user32.dll");
  34.  if (! hUser)
  35.  {
  36.   printf("Can not load library./n");
  37.   return 0;
  38.  }
  39.  data.dwMessageBox = (DWORD)GetProcAddress(hUser, "MessageBoxA");
  40.  FreeLibrary(hUser);
  41.  if (! data.dwMessageBox)
  42.   return 0;
  43. // ======= 分配空間 ===================================================
  44.  void *pRemoteThread
  45.   = VirtualAllocEx(hProcess, 0,
  46.       1024*4, MEM_COMMIT|MEM_RESERVE,
  47.       PAGE_EXECUTE_READWRITE);
  48.  if (! pRemoteThread)
  49.   return 0;
  50.  if (! WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, 1024*4, 0))
  51.   return 0;
  52.  MyData *pData
  53.   = (MyData*)VirtualAllocEx(hProcess, 0,
  54.       sizeof (MyData), MEM_COMMIT,
  55.       PAGE_READWRITE);
  56.  if (!pData)
  57.   return 0;
  58.  if (! WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0))
  59.   return 0;
  60. // =========== 創建遠程線程 ===========================================
  61.  HANDLE hThread
  62.   = CreateRemoteThread(hProcess, 0,
  63.        0, (LPTHREAD_START_ROUTINE)pRemoteThread,
  64.        pData, 0, 0);
  65.  if (! hThread)
  66.  {
  67.   printf("遠程線程創建失敗");
  68.   return 0;
  69.  }
  70.  CloseHandle(hThread);
  71.  VirtualFreeEx(hProcess, pRemoteThread, 1024*3, MEM_RELEASE);
  72.  VirtualFreeEx(hProcess, pData, sizeof (MyData), MEM_RELEASE);
  73.  CloseHandle(hProcess);
  74.  printf("Hello World!/n");
  75.  return 0;
  76. }

DEBUG版本可能會導致程序崩潰,

編譯成RELEASE版本就不會出錯了,主要是DEBUG版本加了一個__chkesp的函數導致調用了非法地址

 

http://www.cnblogs.com/i_like_cpp/archive/2005/06/02/166459.html

發佈了18 篇原創文章 · 獲贊 1 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章