| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- #include "stdafx.h"
- #include "define.h"
- #include "Hook.h"
- #include "zpzDll.h"
- #include "Detours/detours.h"
- #include "Detours/detver.h"
- extern HWND g_hWnd;
- extern char g_data[MAX_DATA_LENGTH];
- extern int data_length;
- //这个是打开COM1的hport
- HANDLE g_hPort = NULL;
- static HANDLE (WINAPI * Real_CreateFileW)(
- __in LPCWSTR lpFileName,
- __in DWORD dwDesiredAccess,
- __in DWORD dwShareMode,
- __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- __in DWORD dwCreationDisposition,
- __in DWORD dwFlagsAndAttributes,
- __in_opt HANDLE hTemplateFile
- ) = CreateFileW;
- static HANDLE(WINAPI * Real_CreateFileA)(
- __in LPCSTR lpFileName,
- __in DWORD dwDesiredAccess,
- __in DWORD dwShareMode,
- __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- __in DWORD dwCreationDisposition,
- __in DWORD dwFlagsAndAttributes,
- __in_opt HANDLE hTemplateFile
- ) = CreateFileA;
- static BOOL(WINAPI * Real_WriteFile)(
- __in HANDLE hFile,
- __in_bcount_opt(nNumberOfBytesToWrite) LPCVOID lpBuffer,
- __in DWORD nNumberOfBytesToWrite,
- __out_opt LPDWORD lpNumberOfBytesWritten,
- __inout_opt LPOVERLAPPED lpOverlapped
- ) = WriteFile;
- HANDLE WINAPI Mine_CreateFileW(
- __in LPCWSTR lpFileName,
- __in DWORD dwDesiredAccess,
- __in DWORD dwShareMode,
- __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- __in DWORD dwCreationDisposition,
- __in DWORD dwFlagsAndAttributes,
- __in_opt HANDLE hTemplateFile
- )
- {
- HANDLE hPort = Real_CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
- std::wstring wsFileName = lpFileName;
- if (wsFileName.find(L"COM1") != wsFileName.npos || wsFileName.find(L"com1") != wsFileName.npos)
- {
- //打开的是目标端口
- if (hPort != INVALID_HANDLE_VALUE)
- {
- //成功打开端口,保存端口句柄,开始监听
- g_hPort = hPort;
- }
- }
- return hPort;
- }
- HANDLE WINAPI Mine_CreateFileA(
- __in LPCSTR lpFileName,
- __in DWORD dwDesiredAccess,
- __in DWORD dwShareMode,
- __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- __in DWORD dwCreationDisposition,
- __in DWORD dwFlagsAndAttributes,
- __in_opt HANDLE hTemplateFile
- )
- {
- HANDLE hPort = Real_CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
- std::string FileName = lpFileName;
- if (FileName.find("COM1") != FileName.npos || FileName.find("com1") != FileName.npos)
- {
- //打开的是目标端口
- if (hPort != INVALID_HANDLE_VALUE)
- {
- //成功打开端口,保存端口句柄,开始监听
- g_hPort = hPort;
- }
- }
- return hPort;
- }
- BOOL WINAPI Mine_WriteFile(
- __in HANDLE hFile,
- __in_bcount_opt(nNumberOfBytesToWrite) LPCVOID lpBuffer,
- __in DWORD nNumberOfBytesToWrite,
- __out_opt LPDWORD lpNumberOfBytesWritten,
- __inout_opt LPOVERLAPPED lpOverlapped
- )
- {
- BOOL ret = Real_WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
- if (hFile == g_hPort)
- {
- //捕捉到一条客显消息,先把消息内容截取下来
- DWORD nWirten = nNumberOfBytesToWrite;
- if (nWirten > MAX_DATA_LENGTH)
- {
- //消息太长了,忽略掉
- return ret;
- }
- memcpy_s(g_data + data_length, nWirten, (char*)lpBuffer, nWirten);
- data_length += nWirten;
- //再发一个消息通知插件,去读取消息
- ::PostMessage(g_hWnd, WM_HOOK_MESSAGE, 0, 0);
- }
-
- return ret;
- }
- void Hook()
- {
- LONG error;
- DetourRestoreAfterWith();
- DetourTransactionBegin();
- DetourUpdateThread(GetCurrentThread());
- DetourAttach(&(PVOID&)Real_CreateFileW, Mine_CreateFileW);
- DetourAttach(&(PVOID&)Real_CreateFileA, Mine_CreateFileA);
- DetourAttach(&(PVOID&)Real_WriteFile, Mine_WriteFile);
- error = DetourTransactionCommit();
- if (error == NO_ERROR) {
- printf("echofx" DETOURS_STRINGIFY(DETOURS_BITS) ".dll:"
- " Detoured Echo().\n");
- }
- else {
- printf("echofx" DETOURS_STRINGIFY(DETOURS_BITS) ".dll:"
- " Error detouring Echo(): %d\n", error);
- }
- }
- void UnHook()
- {
- LONG error;
- DetourTransactionBegin();
- DetourUpdateThread(GetCurrentThread());
- DetourDetach(&(PVOID&)Real_CreateFileW, Mine_CreateFileW);
- DetourDetach(&(PVOID&)Real_CreateFileA, Mine_CreateFileA);
- DetourDetach(&(PVOID&)Real_WriteFile, Mine_WriteFile);
- error = DetourTransactionCommit();
- printf("echofx" DETOURS_STRINGIFY(DETOURS_BITS) ".dll:"
- " Removed Echo() (result=%d)\n", error);
- fflush(stdout);
- }
|