Hook.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "stdafx.h"
  2. #include "define.h"
  3. #include "Hook.h"
  4. #include "zpzDll.h"
  5. #include "Detours/detours.h"
  6. #include "Detours/detver.h"
  7. #include <algorithm>
  8. extern bool g_isWork;
  9. extern HWND g_hWnd;
  10. extern char g_sComNum[MAX_PATH];
  11. extern wchar_t g_wsComNum[MAX_PATH];
  12. extern char g_data[MAX_DATA_LENGTH];
  13. extern int data_length;
  14. //这个是打开COM1的hport
  15. HANDLE g_hPort = NULL;
  16. static HANDLE (WINAPI * Real_CreateFileW)(
  17. __in LPCWSTR lpFileName,
  18. __in DWORD dwDesiredAccess,
  19. __in DWORD dwShareMode,
  20. __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  21. __in DWORD dwCreationDisposition,
  22. __in DWORD dwFlagsAndAttributes,
  23. __in_opt HANDLE hTemplateFile
  24. ) = CreateFileW;
  25. static HANDLE(WINAPI * Real_CreateFileA)(
  26. __in LPCSTR lpFileName,
  27. __in DWORD dwDesiredAccess,
  28. __in DWORD dwShareMode,
  29. __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  30. __in DWORD dwCreationDisposition,
  31. __in DWORD dwFlagsAndAttributes,
  32. __in_opt HANDLE hTemplateFile
  33. ) = CreateFileA;
  34. static BOOL(WINAPI * Real_WriteFile)(
  35. __in HANDLE hFile,
  36. __in_bcount_opt(nNumberOfBytesToWrite) LPCVOID lpBuffer,
  37. __in DWORD nNumberOfBytesToWrite,
  38. __out_opt LPDWORD lpNumberOfBytesWritten,
  39. __inout_opt LPOVERLAPPED lpOverlapped
  40. ) = WriteFile;
  41. HANDLE WINAPI Mine_CreateFileW(
  42. __in LPCWSTR lpFileName,
  43. __in DWORD dwDesiredAccess,
  44. __in DWORD dwShareMode,
  45. __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  46. __in DWORD dwCreationDisposition,
  47. __in DWORD dwFlagsAndAttributes,
  48. __in_opt HANDLE hTemplateFile
  49. )
  50. {
  51. HANDLE hPort = Real_CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
  52. if (g_isWork == false)
  53. {
  54. return hPort;
  55. }
  56. std::wstring wsFileName = lpFileName;
  57. std::transform(wsFileName.begin(), wsFileName.end(), wsFileName.begin(), ::toupper);
  58. if (wsFileName.find(g_wsComNum) != wsFileName.npos)
  59. {
  60. //打开的是目标端口
  61. if (hPort != INVALID_HANDLE_VALUE)
  62. {
  63. //成功打开端口,保存端口句柄,开始监听
  64. g_hPort = hPort;
  65. }
  66. }
  67. return hPort;
  68. }
  69. HANDLE WINAPI Mine_CreateFileA(
  70. __in LPCSTR lpFileName,
  71. __in DWORD dwDesiredAccess,
  72. __in DWORD dwShareMode,
  73. __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  74. __in DWORD dwCreationDisposition,
  75. __in DWORD dwFlagsAndAttributes,
  76. __in_opt HANDLE hTemplateFile
  77. )
  78. {
  79. HANDLE hPort = Real_CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
  80. if (g_isWork == false)
  81. {
  82. return hPort;
  83. }
  84. std::string FileName = lpFileName;
  85. std::transform(FileName.begin(), FileName.end(), FileName.begin(), ::toupper);
  86. if (FileName.find(g_sComNum) != FileName.npos)
  87. {
  88. //打开的是目标端口
  89. if (hPort != INVALID_HANDLE_VALUE)
  90. {
  91. //成功打开端口,保存端口句柄,开始监听
  92. g_hPort = hPort;
  93. }
  94. }
  95. return hPort;
  96. }
  97. BOOL WINAPI Mine_WriteFile(
  98. __in HANDLE hFile,
  99. __in_bcount_opt(nNumberOfBytesToWrite) LPCVOID lpBuffer,
  100. __in DWORD nNumberOfBytesToWrite,
  101. __out_opt LPDWORD lpNumberOfBytesWritten,
  102. __inout_opt LPOVERLAPPED lpOverlapped
  103. )
  104. {
  105. BOOL ret = Real_WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
  106. if (g_isWork == false)
  107. {
  108. return ret;
  109. }
  110. if (hFile == g_hPort)
  111. {
  112. //捕捉到一条客显消息,先把消息内容截取下来
  113. DWORD nWirten = nNumberOfBytesToWrite;
  114. if (nWirten > MAX_DATA_LENGTH)
  115. {
  116. //消息太长了,忽略掉
  117. return ret;
  118. }
  119. memcpy_s(g_data + data_length, nWirten, (char*)lpBuffer, nWirten);
  120. data_length += nWirten;
  121. //再发一个消息通知插件,去读取消息
  122. ::PostMessage(g_hWnd, WM_HOOK_MESSAGE, 0, 0);
  123. }
  124. return ret;
  125. }
  126. void Hook()
  127. {
  128. LONG error;
  129. DetourRestoreAfterWith();
  130. DetourTransactionBegin();
  131. DetourUpdateThread(GetCurrentThread());
  132. DetourAttach(&(PVOID&)Real_CreateFileW, Mine_CreateFileW);
  133. DetourAttach(&(PVOID&)Real_CreateFileA, Mine_CreateFileA);
  134. DetourAttach(&(PVOID&)Real_WriteFile, Mine_WriteFile);
  135. error = DetourTransactionCommit();
  136. if (error == NO_ERROR) {
  137. printf("echofx" DETOURS_STRINGIFY(DETOURS_BITS) ".dll:"
  138. " Detoured Echo().\n");
  139. }
  140. else {
  141. printf("echofx" DETOURS_STRINGIFY(DETOURS_BITS) ".dll:"
  142. " Error detouring Echo(): %d\n", error);
  143. }
  144. }
  145. void UnHook()
  146. {
  147. LONG error;
  148. DetourTransactionBegin();
  149. DetourUpdateThread(GetCurrentThread());
  150. DetourDetach(&(PVOID&)Real_CreateFileW, Mine_CreateFileW);
  151. DetourDetach(&(PVOID&)Real_CreateFileA, Mine_CreateFileA);
  152. DetourDetach(&(PVOID&)Real_WriteFile, Mine_WriteFile);
  153. error = DetourTransactionCommit();
  154. printf("echofx" DETOURS_STRINGIFY(DETOURS_BITS) ".dll:"
  155. " Removed Echo() (result=%d)\n", error);
  156. fflush(stdout);
  157. }