Hook.cpp 4.3 KB

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