Injection.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "StdAfx.h"
  2. #include "Injection.h"
  3. CInjection::CInjection(DWORD dwPid, LPCTSTR lpDynamicLibraryPath)
  4. :m_dwInjectPID(dwPid),
  5. m_hInjectProcess(NULL),
  6. m_lpInjectData(NULL),
  7. m_lpEjectData(NULL),
  8. m_hInjectThread(NULL),
  9. m_hEjectThread(NULL),
  10. m_dwPathLen(0)
  11. {
  12. ASSERT(dwPid!=0);
  13. ASSERT(lpDynamicLibraryPath!=NULL);
  14. memset(m_szDllPath, 0, sizeof(m_szDllPath));
  15. _tcscpy_s(m_szDllPath,lpDynamicLibraryPath);
  16. m_hInjectProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_dwInjectPID);
  17. //m_hInjectProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, m_dwInjectPID);
  18. }
  19. CInjection::~CInjection(void)
  20. {
  21. // 卸载dll;
  22. EjectDynamicLibrary();
  23. // 释放所有资源;
  24. if (m_hInjectThread)
  25. CloseHandle(m_hInjectThread);
  26. m_hInjectThread = NULL;
  27. if (m_hEjectThread)
  28. CloseHandle(m_hEjectThread);
  29. m_hEjectThread = NULL;
  30. if (m_lpInjectData)
  31. VirtualFreeEx(m_hInjectProcess, m_lpInjectData, m_dwPathLen, MEM_RELEASE);
  32. m_lpInjectData = NULL;
  33. if (m_lpEjectData)
  34. VirtualFreeEx(m_hInjectProcess, m_lpEjectData, m_dwPathLen, MEM_RELEASE);
  35. m_lpEjectData = NULL;
  36. if (m_hInjectProcess)
  37. CloseHandle(m_hInjectProcess);
  38. m_hInjectProcess = NULL;
  39. }
  40. BOOL CInjection::InjectDynamicLibrary()
  41. {
  42. ASSERT(m_hInjectProcess!=NULL);
  43. m_dwPathLen = _tcslen(m_szDllPath)*sizeof(TCHAR)+1;
  44. m_lpInjectData = VirtualAllocEx(m_hInjectProcess,NULL, m_dwPathLen, MEM_COMMIT, PAGE_READWRITE);
  45. if (NULL == m_lpInjectData)
  46. return FALSE;
  47. if (WriteProcessMemory(m_hInjectProcess, m_lpInjectData, m_szDllPath, m_dwPathLen, NULL) == 0)
  48. {
  49. VirtualFreeEx(m_hInjectProcess, m_lpInjectData, 0, MEM_RELEASE);
  50. return FALSE;
  51. }
  52. HMODULE hk32 = GetModuleHandle(_T("kernel32.dll"));
  53. // 注意:微信使用的是W版本;
  54. LPVOID lpAddr = GetProcAddress(hk32,"LoadLibraryW");
  55. m_hInjectThread = CreateRemoteThread(m_hInjectProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpAddr, m_lpInjectData, 0, NULL);
  56. if (NULL == m_hInjectThread)
  57. {
  58. VirtualFreeEx(m_hInjectProcess, m_lpInjectData, 0, MEM_RELEASE);
  59. return FALSE;
  60. }
  61. if (m_hInjectThread)
  62. CloseHandle(m_hInjectThread);
  63. m_hInjectThread = NULL;
  64. /* 注入成功后,不能释放内存否则微信会挂;
  65. if (m_lpInjectData != NULL)
  66. VirtualFreeEx(m_hInjectProcess, m_lpInjectData, 0, MEM_RELEASE);
  67. */
  68. return TRUE;
  69. }
  70. BOOL CInjection::EjectDynamicLibrary()
  71. {
  72. if(m_hInjectProcess==NULL)
  73. return -1;
  74. // 获取模块句柄;
  75. HANDLE hModule = FindModuleEx(m_szDllPath, m_dwInjectPID);
  76. if (hModule == NULL )
  77. return FALSE;
  78. LPVOID lpAddr = GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "FreeLibraryAndExitThread");//FreeLibraryAndExitThread//FreeLibrary
  79. m_hEjectThread = CreateRemoteThread(m_hInjectProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpAddr, hModule, 0, NULL);
  80. WaitForSingleObject(m_hEjectThread, INFINITE);
  81. return TRUE;
  82. }
  83. void CInjection::InjectionExistProcess()
  84. {
  85. // 查找现在的进程;
  86. vector<DWORD> vtPID = FindAllProcess(WECHAT);
  87. }