dllmain.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // dllmain.cpp : 定义 DLL 应用程序的入口点。
  2. #include "stdafx.h"
  3. #include "..\common\CurlClient.h"
  4. //https://docs.microsoft.com/zh-cn/windows/desktop/winmsg/using-hooks
  5. HHOOK ghk_CBT = NULL;
  6. HHOOK ghk_Mouse = NULL;
  7. HHOOK ghk_CallWndProc = NULL;
  8. LRESULT WINAPI CallWndProc(int, WPARAM, LPARAM);
  9. LRESULT WINAPI CBTProc(int, WPARAM, LPARAM);
  10. LRESULT WINAPI DebugProc(int, WPARAM, LPARAM);
  11. LRESULT WINAPI GetMsgProc(int, WPARAM, LPARAM);
  12. LRESULT WINAPI KeyboardProc(int, WPARAM, LPARAM);
  13. LRESULT WINAPI MouseProc(int, WPARAM, LPARAM);
  14. LRESULT WINAPI MessageProc(int, WPARAM, LPARAM);
  15. LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
  16. {
  17. WriteTextLog(_T("CallWndProc"));
  18. if (nCode < 0) // do not process message
  19. return CallNextHookEx(ghk_CallWndProc, nCode, wParam, lParam);
  20. switch (nCode)
  21. {
  22. case HC_ACTION:
  23. break;
  24. default:
  25. break;
  26. }
  27. return CallNextHookEx(ghk_CallWndProc, nCode, wParam, lParam);
  28. }
  29. LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
  30. {
  31. CHAR szBuf[128];
  32. CHAR szCode[128];
  33. static int c = 0;
  34. size_t cch;
  35. HRESULT hResult;
  36. WriteTextLog(_T("CBTProc"));
  37. if (nCode < 0) // do not process message
  38. return CallNextHookEx(ghk_CBT, nCode, wParam,lParam);
  39. switch (nCode)
  40. {
  41. case HCBT_ACTIVATE:
  42. break;
  43. case HCBT_CLICKSKIPPED:
  44. break;
  45. case HCBT_CREATEWND:
  46. break;
  47. case HCBT_DESTROYWND:
  48. break;
  49. case HCBT_KEYSKIPPED:
  50. break;
  51. case HCBT_MINMAX:
  52. break;
  53. case HCBT_MOVESIZE:
  54. break;
  55. case HCBT_QS:
  56. break;
  57. case HCBT_SETFOCUS:
  58. break;
  59. case HCBT_SYSCOMMAND:
  60. break;
  61. default:
  62. break;
  63. }
  64. return CallNextHookEx(ghk_CBT, nCode, wParam, lParam);
  65. }
  66. LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
  67. {
  68. CHAR szBuf[128];
  69. CHAR szMsg[16];
  70. static int c = 0;
  71. size_t cch;
  72. HRESULT hResult;
  73. if (nCode < 0) // do not process the message
  74. return CallNextHookEx(ghk_Mouse, nCode,wParam, lParam);
  75. WriteTextLog(_T("MOUSE - nCode: %d, msg: %s, x: %d, y: %d, %d times "), nCode, szMsg, LOWORD(lParam), HIWORD(lParam), c++);
  76. return CallNextHookEx(ghk_Mouse, nCode, wParam, lParam);
  77. }
  78. BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  79. {
  80. g_hCurModule = hModule;
  81. #if 1 // 获取dll的目录;
  82. TCHAR szDrive[MAX_PATH] = { 0 };
  83. TCHAR szDir[MAX_PATH] = { 0 };
  84. TCHAR szExt[MAX_PATH] = { 0 };
  85. ::GetModuleFileName(g_hCurModule, g_szCurModulePath, sizeof(g_szCurModulePath) / sizeof(TCHAR));
  86. _tsplitpath_s(g_szCurModulePath, szDrive, szDir, g_szFna, szExt);
  87. _tcscpy_s(g_szCurModulePath, szDrive);
  88. _tcscat_s(g_szCurModulePath, szDir);
  89. #endif
  90. #ifdef _DEBUG
  91. Sleep(5000);
  92. #endif
  93. switch (ul_reason_for_call)
  94. {
  95. case DLL_PROCESS_ATTACH:
  96. {
  97. std::thread t([]() {
  98. DWORD dwThreadId = 0;
  99. GetProcInfo(dwThreadId);
  100. if (ghk_CBT == NULL)
  101. {
  102. ghk_CBT = SetWindowsHookEx(WH_CBT, CBTProc, HINSTANCE(0x000604F4), dwThreadId);
  103. if (ghk_CBT == NULL)
  104. WriteTextLog(_T("hook api失败"));
  105. else
  106. WriteTextLog(_T("hook api成功:%ld,%p"), GetLastError(), HINSTANCE(0x000604F4));
  107. }
  108. WriteTextLog(_T("dll已成功注入:【当前线程id=%d, 目标线程id=%d,进程id=%d】"), ::GetCurrentThreadId(), dwThreadId, ::GetCurrentProcessId());
  109. WxInfo wxInfo;
  110. GetWxInfo(wxInfo);
  111. CCurlClient curl;
  112. if (curl.Initialize() == CURLE_OK)
  113. {
  114. std::string strData;
  115. if (curl.Get(wxInfo.strWxSImgAddr, strData) == CURLE_OK)
  116. {
  117. FILE *pf = NULL;
  118. TCHAR szWxImage[MAX_PATH] = { 0 };
  119. _stprintf_s(szWxImage, _T("%s%s\\%s.jpg"), g_szCurModulePath, _T("image"), wxInfo.strWxID.c_str());
  120. pf = _tfopen(szWxImage, _T("w+"));
  121. if (pf)
  122. {
  123. fwrite(strData.c_str(), strData.size(), 1, pf);
  124. fclose(pf);
  125. }
  126. }
  127. }
  128. });
  129. t.detach();
  130. }
  131. break;
  132. case DLL_THREAD_ATTACH:
  133. break;
  134. case DLL_THREAD_DETACH:
  135. break;
  136. case DLL_PROCESS_DETACH:
  137. if (ghk_CBT)
  138. {
  139. if (UnhookWindowsHookEx(ghk_CBT))
  140. WriteTextLog(_T("卸载hook成功"));
  141. }
  142. WriteTextLog(_T("dll已成功卸载"));
  143. break;
  144. default:
  145. break;
  146. }
  147. return TRUE;
  148. }