dllmain.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // dllmain.cpp : 定义 DLL 应用程序的入口点。
  2. #include "stdafx.h"
  3. HMODULE g_hModule = NULL;
  4. HANDLE hThreadProc = NULL;
  5. TCHAR g_szCurModulePath[MAX_PATH] = {0};
  6. TCHAR g_szFna[MAX_PATH] = {0};
  7. HANDLE g_hPipe = NULL;
  8. // 配置文件名称;
  9. TCHAR g_szConfigFile[MAX_PATH] = {0};
  10. // 配置的窗口名称;
  11. TCHAR g_szWindowTitle[MAX_PATH] = {0};
  12. // 配置的窗口进程名称;
  13. TCHAR g_szProcessName[MAX_PATH] = {0};
  14. // 管道名称;
  15. TCHAR g_szPipeName[MAX_PATH] = {0};
  16. typedef struct PIPE_MSG
  17. {
  18. //消息类型;
  19. //消息内容;
  20. };
  21. // 枚举屏幕上的所有顶级窗口
  22. BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam)
  23. {
  24. TCHAR szLog[MAX_PATH] = {0};
  25. DWORD dwCurrentProcessId = *((DWORD*)lParam);
  26. // 根据进程ID、窗口,获取当前窗口所在线程ID;
  27. DWORD dwWindProcessId = 0;
  28. DWORD dwThreadId = GetWindowThreadProcessId(hwnd, &dwWindProcessId);
  29. #if _MSC_VER >= 1200 && _MSC_VER < 1500
  30. sprintf(szLog, _T("<Injecter> 进程ID=%ld, 窗口进程ID=%ld\n"), dwCurrentProcessId, dwThreadId);
  31. #else
  32. _stprintf_s(szLog, _T("<Injecter> 进程ID=%ld, 窗口进程ID=%ld\n"), dwCurrentProcessId, dwThreadId);
  33. #endif
  34. OutputDebugString(szLog);
  35. if ( dwCurrentProcessId == dwWindProcessId && GetParent(hwnd) == NULL ) // GetParent==Null表示主窗口,本来就是找顶级的,有点多余?;
  36. {
  37. *((HWND*)lParam) = hwnd;
  38. // 回调函数调用SetLastError以获取有意义的错误代码,以返回给EnumWindows的调用方
  39. SetLastError(10086);
  40. // 停止枚举,返回FALSE;
  41. return FALSE;
  42. }
  43. // 继续枚举,返回TRUE;
  44. return TRUE;
  45. }
  46. HWND GetMainWnd()
  47. {
  48. TCHAR szLog[MAX_PATH] = {0};
  49. // 获取当前DLL所在进程ID;
  50. DWORD dwCurrentProcessId = GetCurrentProcessId();
  51. // 枚举该进程窗口;
  52. EnumWindows(EnumWndProc, (LPARAM)&dwCurrentProcessId);
  53. DWORD dwError = GetLastError();
  54. if (dwError == 10086)
  55. {
  56. // 找到窗口句柄;
  57. return (HWND)dwCurrentProcessId;
  58. }
  59. #if _MSC_VER >= 1200 && _MSC_VER < 1500
  60. sprintf(szLog, _T("<Injecter> 进程ID=%ld, 没找到窗口,GetLastError=%ld\n"), dwCurrentProcessId, dwError);
  61. #else
  62. _stprintf_s(szLog, _T("<Injecter> 进程ID=%ld, 没找到窗口,GetLastError=%ld\n"), dwCurrentProcessId, dwError);
  63. #endif
  64. OutputDebugString(szLog);
  65. return NULL;
  66. }
  67. DWORD WINAPI WorkThreadProc(LPVOID lParam)
  68. {
  69. #ifdef _DEBUG
  70. Sleep(20000);
  71. #endif
  72. TCHAR szLog[MAX_PATH] = {0};
  73. TCHAR szWndTitle[MAXBYTE] = {0};
  74. // 获取DLL所在窗口句柄;
  75. HWND hWnd = GetMainWnd();
  76. if ( hWnd == NULL )
  77. {
  78. OutputDebugString(_T("<Injecter> 没有找到窗口句柄"));
  79. FreeLibraryAndExitThread(g_hModule, 0);
  80. return 0;
  81. }
  82. // 得到窗口名称
  83. GetWindowText(hWnd,szWndTitle,sizeof(szWndTitle));
  84. #if _MSC_VER >= 1200 && _MSC_VER < 1500
  85. sprintf(szLog, _T("找到窗口名称:%s\n"), szWndTitle);
  86. #else
  87. _stprintf_s(szLog, _T("找到窗口名称:%s\n"), szWndTitle);
  88. #endif
  89. OutputDebugString(szLog);
  90. //是否名称是计算器
  91. if( _tcsstr(szWndTitle, g_szWindowTitle) )
  92. {
  93. OutputDebugString(_T("<Injecter> 找到指定窗口!!!"));
  94. // 2、创建后台线程;
  95. MessageBox(NULL, szWndTitle, g_szWindowTitle, MB_OK);
  96. #if 1
  97. // 等待连接服务器管道;
  98. if ( WaitNamedPipe(g_szPipeName, NMPWAIT_WAIT_FOREVER) )
  99. {
  100. // 连接成功后,创建客户端管道;
  101. if ( (g_hPipe = CreateFile(g_szPipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) ) == INVALID_HANDLE_VALUE )
  102. {
  103. // 创建失败;
  104. }
  105. else
  106. {
  107. DWORD dwWrite = 0;
  108. TCHAR szValue[MAX_PATH] = {"test pipe"};
  109. if ( WriteFile(g_hPipe, szValue, sizeof(szValue)*sizeof(TCHAR), &dwWrite, NULL ) )
  110. {
  111. // 写完之后,进行读取;
  112. }
  113. else
  114. {
  115. // 写失败;
  116. }
  117. }
  118. }
  119. else
  120. {
  121. // 等待失败;
  122. }
  123. #endif
  124. }
  125. else
  126. {
  127. OutputDebugString(_T("<Injecter> 不满足条件,DLL自我卸载!!!"));
  128. // 如果不满足条件,DLL自我卸载;
  129. FreeLibraryAndExitThread(g_hModule, 0);
  130. }
  131. return 0;
  132. }
  133. BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  134. {
  135. g_hModule = hModule;
  136. #if 1
  137. // 获取dll的目录;
  138. TCHAR szDrive[MAX_PATH] = { 0 };
  139. TCHAR szDir[MAX_PATH] = { 0 };
  140. TCHAR szExt[MAX_PATH] = { 0 };
  141. ::GetModuleFileName(g_hModule, g_szCurModulePath, sizeof(g_szCurModulePath) / sizeof(TCHAR));
  142. _tsplitpath_s(g_szCurModulePath, szDrive, szDir, g_szFna, szExt);
  143. _tcscpy_s(g_szCurModulePath, szDrive);
  144. _tcscat_s(g_szCurModulePath, szDir);
  145. // 设置配置文件;
  146. _stprintf_s(g_szConfigFile, _T("%s%s"), g_szCurModulePath, _T("Assit.ini"));
  147. // 读取配置文件;
  148. TCHAR szValue[MAX_PATH] = {0};
  149. GetPrivateProfileString(_T("Windows"), _T("Title"), _T(""), g_szWindowTitle, MAX_PATH, g_szConfigFile);
  150. GetPrivateProfileString(_T("Pipe"), _T("Name"), _T("Assit"), szValue, MAX_PATH, g_szConfigFile);
  151. _stprintf_s(g_szPipeName, _T("\\\\.\\pipe\\%s"), szValue);
  152. GetPrivateProfileString(_T("Process"), _T("Name"), _T("Game.exe"), g_szProcessName, MAX_PATH, g_szConfigFile);
  153. #endif
  154. switch (ul_reason_for_call)
  155. {
  156. case DLL_PROCESS_ATTACH:
  157. {
  158. hThreadProc = CreateThread(NULL, 0, WorkThreadProc, NULL, 0, NULL);
  159. CloseHandle(hThreadProc);
  160. }
  161. break;
  162. case DLL_THREAD_ATTACH:
  163. break;
  164. case DLL_THREAD_DETACH:
  165. break;
  166. case DLL_PROCESS_DETACH:
  167. break;
  168. }
  169. return TRUE;
  170. }