From 05748b4582b8d4d0f0ec0ac71a417b4048ad0cf6 Mon Sep 17 00:00:00 2001 From: Edward Jakubowski Date: Wed, 28 May 2014 23:23:15 -0400 Subject: [PATCH] Updates to Message hooking to fix changes in filtering and added new custom filters --- native/MsgHook/MsgHook.cpp | 24 +++++++++++++-- native/MsgHook/MsgHookTest.aps | Bin 54880 -> 55012 bytes native/MsgHook/MsgHookTest.rc | Bin 11554 -> 11872 bytes native/MsgHook/MsgHookWindow.cpp | 50 +++++++++++++++++++------------ native/MsgHook/MsgLookup.h | 3 ++ native/MsgHook/bin/MsgHook32.dll | Bin 78336 -> 79360 bytes native/MsgHook/bin/MsgHook64.dll | Bin 80896 -> 81920 bytes native/MsgHook/resource.h | Bin 3744 -> 4020 bytes 8 files changed, 56 insertions(+), 21 deletions(-) diff --git a/native/MsgHook/MsgHook.cpp b/native/MsgHook/MsgHook.cpp index 2999281..20149a7 100644 --- a/native/MsgHook/MsgHook.cpp +++ b/native/MsgHook/MsgHook.cpp @@ -32,8 +32,28 @@ LRESULT CALLBACK CwpHookProc(int nCode, WPARAM wParam, LPARAM lParam) Event.dwHookType = WH_CALLWNDPROC; memset((void *)&Event.wParamStr, '\0', sizeof(TCHAR) * 25); memset((void *)&Event.lParamStr, '\0', sizeof(TCHAR) * 25); - //if (cwps->message == WM_SETTEXT && cwps->lParam != 0) - // _tcscpy_s(Event.lParamStr, 25, (const wchar_t*)Event.lParam); + bool errorFlg = false; + if (cwps->message == WM_SETTEXT && cwps->lParam != 0 && cwps->wParam == 0) + { + if (IsWindowUnicode(Event.hWnd)) + { + _tcsncpy_s(Event.lParamStr, 25, (const wchar_t*)Event.lParam, _TRUNCATE); + } + else + { + int asciiSize = (int)strlen((const char*)Event.lParam); + int unicodeSize = (int)_tcslen((const wchar_t*)Event.lParam); + if (unicodeSize > asciiSize) + _tcsncpy_s(Event.lParamStr, 25, (const wchar_t*)Event.lParam, _TRUNCATE); + else + { + int tstrLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)cwps->lParam, (int)strlen((LPCSTR)cwps->lParam), NULL, 0); //get t len + if (tstrLen > 24) + tstrLen = 24; + MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)cwps->lParam, (int)strlen((LPCSTR)cwps->lParam), Event.lParamStr, tstrLen); // convert char to tchar + } + } + } BOOL bRes = (BOOL)SendMessage(pData->g_hWnd, WM_COPYDATA, 0, (LPARAM)(VOID*)&CDS); // ask the controlling program if the hook should be passed } diff --git a/native/MsgHook/MsgHookTest.aps b/native/MsgHook/MsgHookTest.aps index 1bcb0dbca1cac1c4e2f43e18b02fd8bdc97adf1d..ab709a62832d9828070044f0db8e70f9efb66a19 100644 GIT binary patch delta 433 zcmXw#-z$S*6vxl=ye~CdLz(o*HYp^vEs0zRlb@}v#)VvPVba7DuKdV_{3uDjDY;sS zTyVi|T#yT)y=C&gn+qk1m0a=%@J#KgQ>X9e^qf!U?O6FZQMTH-s-JeWnOG3(rV8ec zotQQ`1}y`%-XU*)u+Q)FcJ-3S?Qs)l#3+}#+q1+M?931kanxI!IkF*&om$>6*$8$t z7b}Y0Xo^}T)BmRs3(Qd)Rg;;%6{6qYCGyfNP16iTXacYIHq$<}QUh7(Cw7^*Ql!*^ zUd5eO9O`ynU5Mubfj3=cQ%LI$-dK(=r-0K?In|)ju=6z+np^_IhROm684g}D3N0iM zl_QPg_zIU=8Bxn*X1O9O4-dMHuSL)l5!;4p4lHJg1^I@Jm#jit5onPpx{*az_$3-U zgE$jdl0Unzv68g2C=QYietw7WowQ756w)#ni$lbvWlH6{arDGR?ubhCsbNo(rZU}n iKqAqcW0psn$4jaVx2a-wA-g)ZjKZfne)NdENAU+XkCgJM2xh=CH@oXt0 zvq?nQwvKTkWA4=QA4L?NpB4-5kFV+OQLm$MOY~Re*BsXRw)~DDJg~M0yE!X;BwM77pJXnXjT!Wq0P^tuq+a zFs(6IAu7XTkZmK^=6#*$_X)EDTa=L;IP$8C>#i~;d?1b@gRF;~r$QOtKJ#$FG0L5e mk5^wA53E@j5BB7whtzOgY~ggcAt^xaEspjuCYJ*=0`&(+A8E}1 diff --git a/native/MsgHook/MsgHookTest.rc b/native/MsgHook/MsgHookTest.rc index 45f391262a137414781b584cf4336c72f4607aab..8aaa3ec606cfcb751ffccfe8fa3493c1013cc5d3 100644 GIT binary patch delta 130 zcmZ1!^&n=0mBQo;avYQMq?ELs8A=(78A=%P8FCq{7?c=v7(5wV7@Qg6fjE>Qm?4D0 zpTQT%_F(Xy{8uuN--y8&sKyKkbr?(-3??he2v5$F)lfxN?F-cB4wN?ps)DFC1@cT8 LOg9TE2=W2|V5Jzc delta 12 TcmaD5vnXnVmBQu<#TPsPCvpXY diff --git a/native/MsgHook/MsgHookWindow.cpp b/native/MsgHook/MsgHookWindow.cpp index cd7ed7b..7d975b9 100644 --- a/native/MsgHook/MsgHookWindow.cpp +++ b/native/MsgHook/MsgHookWindow.cpp @@ -29,18 +29,20 @@ const int txtboxSpacing = 2; bool filterWmCommand = true; bool filterWmNotify = false; +bool filterCustom = false; bool filterAbove = false; //#define MAX_TEST_SIZE 100 //TCHAR targetClassname[MAX_TEST_SIZE] = _T("Notepad"); TCHAR targetClassname[MAX_TEST_SIZE] = _T("WordPadClass"); +TCHAR targetHwndStr[MAX_TEST_SIZE] = _T(""); TCHAR testWmSettextL[MAX_TEST_SIZE] = _T("This is a test"); TCHAR testWmSettextW[MAX_TEST_SIZE] = _T("0"); TCHAR testWmCommandL[MAX_TEST_SIZE] = _T("0"); TCHAR testWmCommandW[MAX_TEST_SIZE] = _T("1"); -TCHAR targetHwndStr[MAX_TEST_SIZE] = _T(""); +TCHAR customMsgStr[MAX_TEST_SIZE] = _T("WM_SETTEXT"); const int hotkeyIdOffset = 0; const int pauseHotKey = 'P'; //P @@ -75,12 +77,12 @@ void AppendText(HWND txtHwnd, LPCTSTR newText) void InitMsgFiltersAndLookup() { - if (!filterWmCommand && !filterAbove && !filterWmNotify) + if (!filterWmCommand && !filterAbove && !filterWmNotify && !filterCustom) InitializeMsgLookup(); else { - int allowList[3]; - for (int i = 0; i < 3; i ++) + int allowList[4]; + for (int i = 0; i < 4; i ++) allowList[i] = -1; if (filterWmCommand) { @@ -95,7 +97,20 @@ void InitMsgFiltersAndLookup() } //if (filterAbove) // allowList[0] = WM_COMMAND; - InitializeMsgLookup(allowList, 3); + if (filterCustom && _tcslen(customMsgStr) > 0) + { + InitializeMsgLookup(); //initialize full msg list and do reverse lookup based on custom filter string + for (int x = 0; x < MAX_MSG_LOOKUP; x++) + { + if (_tcscmp(customMsgStr, MSG_LOOKUP[x]) == 0) { + TCHAR tmp[100]; + _stprintf_s(tmp, _T("filtering on %s (%d)\r\n"), customMsgStr, x); + AppendText(txtbox, tmp); + allowList[3] = x; + } + } + } + InitializeMsgLookup(allowList, 4); } } @@ -178,8 +193,10 @@ bool OnCopyData(COPYDATASTRUCT* pCopyDataStruct) // WM_COPYDATA lParam will have } if (_tcscmp(msgName, _T("")) != 0) { + TCHAR msgHwndClassname[20]; + GetClassName(Event.hWnd, msgHwndClassname, 20); TCHAR tmp[200]; - _stprintf_s(tmp, _T("hwnd: %ld, msg: %s (%ld), wparam: '%s'[%ld], lparam: '%s'{%ld}\r\n"), Event.hWnd, msgName, Event.nCode, Event.wParamStr, Event.wParam, Event.lParamStr,Event.lParam); + _stprintf_s(tmp, _T("hwnd: %ld (%s), msg: %s (%ld), wparam: '%s'[%ld], lparam: '%s'{%ld}\r\n"), Event.hWnd, msgHwndClassname, msgName, Event.nCode, Event.wParamStr, Event.wParam, Event.lParamStr,Event.lParam); AppendText(txtbox, tmp); } } @@ -458,12 +475,14 @@ INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) SendDlgItemMessage(hDlg, IDC_CHECK_NOT, BM_SETCHECK, BST_CHECKED, 0); if (filterAbove) SendDlgItemMessage(hDlg, IDC_CHECK_ABO, BM_SETCHECK, BST_CHECKED, 0); + if (filterCustom) + SendDlgItemMessage(hDlg, IDC_CUSTOMCHK, BM_SETCHECK, BST_CHECKED, 0); SendDlgItemMessage(hDlg, IDC_WMCOMW, WM_SETTEXT, 0 , (LPARAM)testWmCommandW); SendDlgItemMessage(hDlg, IDC_WMCOML, WM_SETTEXT, 0 , (LPARAM)testWmCommandL); SendDlgItemMessage(hDlg, IDC_WMSETW, WM_SETTEXT, 0 , (LPARAM)testWmSettextW); SendDlgItemMessage(hDlg, IDC_WMSETL, WM_SETTEXT, 0 , (LPARAM)testWmSettextL); SendDlgItemMessage(hDlg, IDC_HWND, WM_SETTEXT, 0 , (LPARAM)targetHwndStr); - + SendDlgItemMessage(hDlg, IDC_CUSTOMMSG, WM_SETTEXT, 0 , (LPARAM)customMsgStr); } return (INT_PTR)TRUE; @@ -476,19 +495,12 @@ INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) GetDlgItemText(hDlg, IDC_WMSETW, testWmSettextW, MAX_TEST_SIZE); GetDlgItemText(hDlg, IDC_WMSETL, testWmSettextL, MAX_TEST_SIZE); GetDlgItemText(hDlg, IDC_HWND, targetHwndStr, MAX_TEST_SIZE); + GetDlgItemText(hDlg, IDC_CUSTOMMSG, customMsgStr, MAX_TEST_SIZE); // check filter options - if (SendDlgItemMessage(hDlg, IDC_CHECK_CMD, BM_GETCHECK, 0, 0) == BST_CHECKED) // the hard way - filterWmCommand = true; - else - filterWmCommand = false; - if (IsDlgButtonChecked(hDlg, IDC_CHECK_NOT) == BST_CHECKED) // the easy way - filterWmNotify = true; - else - filterWmNotify = false; - if (IsDlgButtonChecked(hDlg, IDC_CHECK_ABO) == BST_CHECKED) - filterAbove = true; - else - filterAbove = false; + filterWmCommand = (SendDlgItemMessage(hDlg, IDC_CHECK_CMD, BM_GETCHECK, 0, 0) == BST_CHECKED); // the hard way + filterWmNotify = (IsDlgButtonChecked(hDlg, IDC_CHECK_NOT) == BST_CHECKED);// the easy way + filterAbove = (IsDlgButtonChecked(hDlg, IDC_CHECK_ABO) == BST_CHECKED); + filterCustom = (IsDlgButtonChecked(hDlg, IDC_CUSTOMCHK) == BST_CHECKED); InitMsgFiltersAndLookup(); } diff --git a/native/MsgHook/MsgLookup.h b/native/MsgHook/MsgLookup.h index f8413b3..e432123 100644 --- a/native/MsgHook/MsgLookup.h +++ b/native/MsgHook/MsgLookup.h @@ -20,7 +20,10 @@ void InitializeMsgLookup(int allowList[], int allowSize) if (allowList[a] == i) allowFlg = true; if (!allowFlg) + { + memset((void *)&MSG_LOOKUP[i], '\0', sizeof(TCHAR) * MAX_MSG_NAME); //blank it continue; + } switch (i) { case WM_NULL: _tcscpy_s(MSG_LOOKUP[i], _T("WM_NULL")); break; diff --git a/native/MsgHook/bin/MsgHook32.dll b/native/MsgHook/bin/MsgHook32.dll index e08c44d255c45e91ab25acf685cc234066437892..c5b0807a91991960c7482c3d255d5aac2f44d200 100644 GIT binary patch delta 12910 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 delta 11978 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 I&bn^;A0Ft06951J delta 13496 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 diff --git a/native/MsgHook/resource.h b/native/MsgHook/resource.h index 8f5c0a298fbc95ab63d6316f99cbe8d5ecf7d921..efdecfc5992a4f26a71d9d84340847c1b0238831 100644 GIT binary patch delta 122 zcmZ1=yG4G(CXUG)m{|m!8A2I?8A2HR8GIR>89W%gCo?jsPrks&!e}`8KZ_zSLe`fd tcyb|&CP=Bda_=iY$XWOfOhokV|^;M1&