1. 基本原理
使用自己写的代码, 在指定的进程里面启动一个远程线程, 从而把相关的代码注入到这个指定进程里面去, 实施操作. 通常这样做是为了拦截一些系统的 API, 或者是操控(挟持)这个进程.
2. 具体实现
拿到进程的句柄, 然后用 LoadLibrary 系统函数开启一个远程的线程. 从而把我们的DLL导入到这个指定的进程.(读者可以使用自己的办法, 不过套路应该都差不多)
3. 样例代码

  1. #include "windows.h"

  2. int main()
  3. {
  4.     char * lpExeFile = "D:\\src-project\\testProcess.exe";
  5.     char * lpDllFile = "D:\\src-project\\memTrace.dll";

  6.     // Step 1. 开启想要跟踪的进程,并挂起.
  7.     STARTUPINFOA startupInfo = { sizeof(startupInfo) };
  8.     PROCESS_INFORMATION processInfo;
  9.     if ( ! CreateProcessA(
  10.         NULL,lpExeFile,NULL,NULL,FALSE,CREATE_SUSPENDED,
  11.         NULL,NULL,&startupInfo,&processInfo ) )
  12.     {
  13.         return -1;
  14.     }

  15.     // Step 2. 开启远程线程的相关参数初始化.
  16.     LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL; // 表示使用默认值.
  17.     SIZE_T sizeStack = 0; // 表示使用默认值.
  18.     LPTHREAD_START_ROUTINE lpStartAddress // 新线程执行入口地址.
  19.         = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("Kernel32"),"LoadLibraryA");
  20.     LPVOID lpParameter = NULL; // 传给新线程的参数.
  21.     DWORD flagCreation = 0; // 表示立即执行, CREATE_SUSPENDED 表示挂起.
  22.     DWORD threadID = 0; // 用来记录新创建的线程的ID.

  23.     // Step 3. 准备远程线程需要的参数.
  24.     SIZE_T sizeLength = strlen(lpDllFile) + 1;
  25.     lpParameter = VirtualAllocEx(processInfo.hProcess,NULL,sizeLength,MEM_COMMIT,PAGE_READWRITE);
  26.     if ( ! lpParameter ) return -1;
  27.     if ( ! WriteProcessMemory(processInfo.hProcess,lpParameter,lpDllFile,sizeLength,NULL) )
  28.         return -1;

  29.     // Step 4. 通过远程线程导入我们的动态库.
  30.     HANDLE hRemoteThread = CreateRemoteThread(
  31.         processInfo.hProcess,lpThreadAttributes,sizeStack,
  32.         lpStartAddress,lpParameter,flagCreation,&threadID);
  33.     WaitForSingleObject(hRemoteThread,INFINITE);

  34.     // Step 5. 恢复子进程的主线程, 相关系统资源的销毁.
  35.     ResumeThread(processInfo.hThread);
  36.     VirtualFreeEx(processInfo.hProcess,lpParameter,0,MEM_RELEASE);

  37.     if ( hRemoteThread ) CloseHandle(hRemoteThread);
  38.     if ( processInfo.hThread ) CloseHandle(processInfo.hThread);
  39.     if ( processInfo.hProcess ) CloseHandle(processInfo.hProcess);

  40.     return 0;
  41. }

 
09-04 03:39