dllmain.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // dllmain.cpp : 定义 DLL 应用程序的入口点。
  2. #include "stdafx.h"
  3. HMODULE g_hModule = NULL;
  4. HANDLE hThreadProc = NULL;
  5. // 枚举屏幕上的所有顶级窗口
  6. BOOL CALLBACK EnumWndProc(HWND hwnd, LPARAM lParam)
  7. {
  8. TCHAR szLog[MAX_PATH] = {0};
  9. DWORD dwCurrentProcessId = *((DWORD*)lParam);
  10. // 根据进程ID、窗口,获取当前窗口所在线程ID;
  11. DWORD dwWindProcessId = 0;
  12. DWORD dwThreadId = GetWindowThreadProcessId(hwnd, &dwWindProcessId);
  13. #if _MSC_VER >= 1200 && _MSC_VER < 1500
  14. sprintf(szLog, _T("<Injecter> 进程ID=%ld, 窗口进程ID=%ld\n"), dwCurrentProcessId, dwThreadId);
  15. #else
  16. _stprintf_s(szLog, _T("<Injecter> 进程ID=%ld, 窗口进程ID=%ld\n"), dwCurrentProcessId, dwThreadId);
  17. #endif
  18. OutputDebugString(szLog);
  19. if ( dwCurrentProcessId == dwWindProcessId && GetParent(hwnd) == NULL ) // GetParent==Null表示主窗口,本来就是找顶级的,有点多余?;
  20. {
  21. *((HWND*)lParam) = hwnd;
  22. // 回调函数调用SetLastError以获取有意义的错误代码,以返回给EnumWindows的调用方
  23. SetLastError(10086);
  24. // 停止枚举,返回FALSE;
  25. return FALSE;
  26. }
  27. // 继续枚举,返回TRUE;
  28. return TRUE;
  29. }
  30. HWND GetMainWnd()
  31. {
  32. TCHAR szLog[MAX_PATH] = {0};
  33. // 获取当前DLL所在进程ID;
  34. DWORD dwCurrentProcessId = GetCurrentProcessId();
  35. // 枚举该进程窗口;
  36. EnumWindows(EnumWndProc, (LPARAM)&dwCurrentProcessId);
  37. DWORD dwError = GetLastError();
  38. if (dwError == 10086)
  39. {
  40. // 找到窗口句柄;
  41. return (HWND)dwCurrentProcessId;
  42. }
  43. #if _MSC_VER >= 1200 && _MSC_VER < 1500
  44. sprintf(szLog, _T("<Injecter> 进程ID=%ld, 没找到窗口,GetLastError=%ld\n"), dwCurrentProcessId, dwError);
  45. #else
  46. _stprintf_s(szLog, _T("<Injecter> 进程ID=%ld, 没找到窗口,GetLastError=%ld\n"), dwCurrentProcessId, dwError);
  47. #endif
  48. OutputDebugString(szLog);
  49. return NULL;
  50. }
  51. DWORD WINAPI WorkThreadProc(LPVOID lParam)
  52. {
  53. #ifdef _DEBUG
  54. Sleep(20000);
  55. #endif
  56. TCHAR szLog[MAX_PATH] = {0};
  57. TCHAR szWndTitle[MAXBYTE] = {0};
  58. // 获取DLL所在窗口句柄;
  59. HWND hWnd = GetMainWnd();
  60. if ( hWnd == NULL )
  61. {
  62. OutputDebugString(_T("<Injecter> 没有找到窗口句柄"));
  63. FreeLibraryAndExitThread(g_hModule, 0);
  64. return 0;
  65. }
  66. // 得到窗口名称
  67. GetWindowText(hWnd,szWndTitle,sizeof(szWndTitle));
  68. #if _MSC_VER >= 1200 && _MSC_VER < 1500
  69. sprintf(szLog, _T("找到窗口名称:%s\n"), szWndTitle);
  70. #else
  71. _stprintf_s(szLog, _T("找到窗口名称:%s\n"), szWndTitle);
  72. #endif
  73. OutputDebugString(szLog);
  74. //是否名称是计算器
  75. if( 0 == _tcsstr(szWndTitle, _T("计算器")) )
  76. {
  77. OutputDebugString(_T("<Injecter> 找到指定窗口!!!"));
  78. // 2、创建后台线程;
  79. }
  80. else
  81. {
  82. OutputDebugString(_T("<Injecter> 不满足条件,DLL自我卸载!!!"));
  83. // 如果不满足条件,DLL自我卸载;
  84. FreeLibraryAndExitThread(g_hModule, 0);
  85. }
  86. return 0;
  87. }
  88. BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  89. {
  90. g_hModule = hModule;
  91. switch (ul_reason_for_call)
  92. {
  93. case DLL_PROCESS_ATTACH:
  94. {
  95. hThreadProc = CreateThread(NULL, 0, WorkThreadProc, NULL, 0, NULL);
  96. CloseHandle(hThreadProc);
  97. }
  98. break;
  99. case DLL_THREAD_ATTACH:
  100. break;
  101. case DLL_THREAD_DETACH:
  102. break;
  103. case DLL_PROCESS_DETACH:
  104. break;
  105. }
  106. return TRUE;
  107. }