From 81e8241fe53b47bd0ef504488167c530b2d552ac Mon Sep 17 00:00:00 2001 From: mjjo Date: Sat, 20 Jul 2013 23:24:08 +0000 Subject: [PATCH] --- HookInj/HookInj.cpp | 620 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 620 insertions(+) create mode 100644 HookInj/HookInj.cpp diff --git a/HookInj/HookInj.cpp b/HookInj/HookInj.cpp new file mode 100644 index 0000000..a8246ee --- /dev/null +++ b/HookInj/HookInj.cpp @@ -0,0 +1,620 @@ +// HookInj.cpp : Defines the entry point for the DLL application. +// + +#include "stdafx.h" + +#include +//#include "CmnHdr.h" +#include +#include +#include + +#define HOOKINJLIBAPI __declspec(dllexport) +#include "HookInj.h" +//#include "Resource.h" + +/* nonstandard extension 'single line comment' was used */ +#pragma warning(disable:4001) + +// unreferenced formal parameter +#pragma warning(disable:4100) + +// Note: Creating precompiled header +#pragma warning(disable:4699) + +// function not inlined +#pragma warning(disable:4710) + +// unreferenced inline function has been removed +#pragma warning(disable:4514) + +// assignment operator could not be generated +#pragma warning(disable:4512) + +#ifdef _X86_ +#define DebugBreak() _asm { int 3 } +#endif + +////////////////////////////// chINRANGE Macro //////////////////////////////// + + +// This macro returns TRUE if a number is between two others +#define chINRANGE(low, Num, High) (((low) <= (Num)) && ((Num) <= (High))) + + +//////////////////////////////// chDIMOF Macro //////////////////////////////// + + +// This macro evaluates to the number of elements in an array. +#define chDIMOF(Array) (sizeof(Array) / sizeof(Array[0])) + +/////////////////////////// Quick MessageBox Macro //////////////////////////// + + +inline void chMB(PCSTR s) { + char szTMP[128]; + GetModuleFileNameA(NULL, szTMP, chDIMOF(szTMP)); + MessageBoxA(GetActiveWindow(), s, szTMP, MB_OK); +} + + +//////////////////////////// Assert/Verify Macros ///////////////////////////// + + +inline void chFAIL(PSTR szMsg) { + chMB(szMsg); + DebugBreak(); +} + + +// Put up an assertion failure message box. +inline void chASSERTFAIL(LPCSTR file, int line, PCSTR expr) { + char sz[128]; + wsprintfA(sz, "File %s, line %d : %s", file, line, expr); + chFAIL(sz); +} + + +// Put up a message box if an assertion fails in a debug build. +#ifdef _DEBUG +#define chASSERT(x) if (!(x)) chASSERTFAIL(__FILE__, __LINE__, #x) +#else +#define chASSERT(x) +#endif + +/////////////////////////////////////////////////////////////////////////////// +#ifdef _DEBUG +// This function forces the debugger to be invoked +void ForceDebugBreak() { + __try { DebugBreak(); } + __except(UnhandledExceptionFilter(GetExceptionInformation())) { } +} +#else +#define ForceDebugBreak() +#endif + +#ifdef _DEBUG +VOID DbgPrintf(LPTSTR fmt, ...); +#else +VOID DbgPrintf(LPTSTR fmt, ...) { } +#endif + +#ifdef _DEBUG +VOID DbgPrintf( LPTSTR fmt, ... ) +{ + va_list marker; + TCHAR szBuf[256]; + + va_start(marker, fmt); + wvsprintf(szBuf, fmt, marker); + va_end(marker); + + OutputDebugString(szBuf); + OutputDebugString(TEXT("\r\n")); +} +#endif + + +#pragma data_seg("Shared") +DWORD g_dwThreadIdMainWnd = 0; +HWND g_hMainWnd = NULL; + +HWND g_hWnd1 = NULL; +BOOL g_bFirstTime_Wnd1 = FALSE; +HHOOK g_hHookGetMessage_Wnd1 = NULL; + +HWND g_hWnd2= NULL; +BOOL g_bFirstTime_Wnd2= FALSE; +HHOOK g_hHookGetMessage_Wnd2= NULL; + +HWND g_hWnd3= NULL; +BOOL g_bFirstTime_Wnd3= FALSE; +HHOOK g_hHookGetMessage_Wnd3 = NULL; +#pragma data_seg() + +// Instruct the linker to make the Shared section +// readable, writable, and shared. +#pragma comment(linker, "/section:Shared,rws") + +/////////////////////////////////////////////////////////////////////////////// +// Forward references +LRESULT CALLBACK GetMsgProc_Wnd1(INT hc, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK Proc_Wnd1( HWND, UINT, WPARAM, LPARAM ); + +LRESULT CALLBACK GetMsgProc_Wnd2(INT hc, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK Proc_Wnd2( HWND, UINT, WPARAM, LPARAM ); + +LRESULT CALLBACK GetMsgProc_Wnd3(INT hc, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK Proc_Wnd3( HWND, UINT, WPARAM, LPARAM ); + +/////////////////////////////////////////////////////////////////////////////// +// Nonshared variables +HINSTANCE g_hinstDll = NULL; + +WNDPROC g_wpOld_Wnd1 = NULL; +WNDPROC g_wpOld_Wnd2 = NULL; +WNDPROC g_wpOld_Wnd3 = NULL; + +SPYMSGDATA gsmd; +COPYDATASTRUCT gcds = { 0, sizeof(SPYMSGDATA), &gsmd }; + +/////////////////////////////////////////////////////////////////////////////// +// DLL Entry point. +BOOL APIENTRY DllMain( HINSTANCE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved + ) +{ + switch (ul_reason_for_call) { + + case DLL_PROCESS_ATTACH: + // DLL is attaching to the address space of the current process. + g_hinstDll = hModule; + break; + + case DLL_THREAD_ATTACH: + // A new thread is being created in the current process. + break; + + case DLL_THREAD_DETACH: + // A thread is exiting cleanly. + break; + + case DLL_PROCESS_DETACH: + // The calling process is detaching the DLL from its address space. + break; + } + return(TRUE); +} + +/////////////////////////////////////////////////////////////////////////////// + +BOOL WINAPI HAPI_InstallHook( HWND hMainWnd, + HWND hWnd1, + HWND hWnd2, + HWND hWnd3 ) +{ + DbgPrintf( "HAPI_InstallHook : Start" ); + + g_dwThreadIdMainWnd = GetCurrentThreadId(); + + g_hMainWnd = hMainWnd; + + g_hWnd1 = hWnd1; + g_hWnd2 = hWnd2; + g_hWnd3 = hWnd3; + + BOOL fOk = FALSE; + DWORD _dwThreadId; + if( ::IsWindow(hWnd1) ) + { + _dwThreadId = GetWindowThreadProcessId( hWnd1, NULL ); + + if (_dwThreadId != 0) + { + chASSERT(g_hHookGetMessage_Wnd1 == NULL); + if (!g_hHookGetMessage_Wnd1) + { + if (!(g_hHookGetMessage_Wnd1 = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)GetMsgProc_Wnd1, + g_hinstDll, _dwThreadId))) + { + return FALSE; + } + } + + DbgPrintf( "HAPI_InstallHook : g_hHookGetMessage_Wnd1" ); + + g_bFirstTime_Wnd1 = TRUE; + fOk = PostThreadMessage(_dwThreadId, WM_NULL, 0, 0); + } + } + + if( ::IsWindow(hWnd2) ) + { + _dwThreadId = GetWindowThreadProcessId( hWnd2, NULL ); + + if (_dwThreadId != 0) + { + chASSERT(g_hHookGetMessage_Wnd2 == NULL); + if (!g_hHookGetMessage_Wnd2) + { + if (!(g_hHookGetMessage_Wnd2 = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)GetMsgProc_Wnd2, + g_hinstDll, _dwThreadId))) + { + return FALSE; + } + } + + DbgPrintf( "HAPI_InstallHook : g_hHookGetMessage_Wnd2" ); + + g_bFirstTime_Wnd2 = TRUE; + fOk = PostThreadMessage(_dwThreadId, WM_NULL, 0, 0); + } + } + + if( ::IsWindow(hWnd3) ) + { + _dwThreadId = GetWindowThreadProcessId( hWnd3, NULL ); + + if (_dwThreadId != 0) + { + chASSERT(g_hHookGetMessage_Wnd3 == NULL); + if (!g_hHookGetMessage_Wnd3) + { + if (!(g_hHookGetMessage_Wnd3 = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)GetMsgProc_Wnd3, + g_hinstDll, _dwThreadId))) + { + return FALSE; + } + } + + DbgPrintf( "HAPI_InstallHook : g_hHookGetMessage_Wnd3" ); + + g_bFirstTime_Wnd3 = TRUE; + fOk = PostThreadMessage(_dwThreadId, WM_NULL, 0, 0); + } + } + + return(fOk); +} + +BOOL WINAPI HAPI_UninstallHook( ) +{ + BOOL fOk = FALSE; + + if (g_hHookGetMessage_Wnd1) + { + DbgPrintf( "HAPI_UninstallHook : g_hHookGetMessage_Wnd1" ); + + g_bFirstTime_Wnd1 = FALSE; + + SendMessage( g_hWnd1, WM_APP, APP_UNSUBCLASSING, APP_UNSUBCLASSING ); + + fOk = UnhookWindowsHookEx(g_hHookGetMessage_Wnd1); + if( !fOk ) + { + DWORD dwError = GetLastError(); + DbgPrintf( "UnhookWindowsHookEx :1 Error(%d)", dwError ); + } + else + g_hHookGetMessage_Wnd1 = NULL; + } + + if (g_hHookGetMessage_Wnd2) + { + DbgPrintf( "HAPI_UninstallHook : g_hHookGetMessage_Wnd2" ); + + g_bFirstTime_Wnd2 = FALSE; + + SendMessage( g_hWnd2, WM_APP, APP_UNSUBCLASSING, APP_UNSUBCLASSING ); + + fOk = UnhookWindowsHookEx(g_hHookGetMessage_Wnd2); + if( !fOk ) + { + DWORD dwError = GetLastError(); + DbgPrintf( "UnhookWindowsHookEx :2 Error(%d)", dwError ); + } + else + g_hHookGetMessage_Wnd2 = NULL; + } + + if (g_hHookGetMessage_Wnd3) + { + //CloseHandle(hFile); + + DbgPrintf( "HAPI_UninstallHook : g_hHookGetMessage_Wnd3" ); + + g_bFirstTime_Wnd3 = FALSE; + + SendMessage( g_hWnd3, WM_APP, APP_UNSUBCLASSING, APP_UNSUBCLASSING ); + + fOk = UnhookWindowsHookEx(g_hHookGetMessage_Wnd3); + if( !fOk ) + { + DWORD dwError = GetLastError(); + DbgPrintf( "UnhookWindowsHookEx :3 Error(%d)", dwError ); + } + else + g_hHookGetMessage_Wnd3 = NULL; + } + + return(fOk); +} + +//////////////////////////////////////////////////////////////////////////////////////// +void InitSubClass_Wnd1( ) +{ + g_wpOld_Wnd1 = (WNDPROC)SetWindowLong( g_hWnd1, GWL_WNDPROC, (LONG)Proc_Wnd1 ); +} +LRESULT CALLBACK GetMsgProc_Wnd1( INT hc, WPARAM wParam, LPARAM lParam ) +{ + LPMSG pMsg = (LPMSG)lParam; +// DbgPrintf( "GetMsgProc_Wnd1 : %d,%d", pMsg->wParam, pMsg->lParam ); + + if( g_bFirstTime_Wnd1 ) + { + g_bFirstTime_Wnd1 = FALSE; + InitSubClass_Wnd1( ); + } + + return CallNextHookEx(g_hHookGetMessage_Wnd1, hc, wParam, lParam); +} + +//////////////////////////////////////////////////////////////////////////////////////// +void InitSubClass_Wnd2( ) +{ + g_wpOld_Wnd2 = (WNDPROC)SetWindowLong( g_hWnd2, GWL_WNDPROC, (LONG)Proc_Wnd2 ); +} +LRESULT CALLBACK GetMsgProc_Wnd2( INT hc, WPARAM wParam, LPARAM lParam ) +{ + LPMSG pMsg = (LPMSG)lParam; +// DbgPrintf( "GetMsgProc_Wnd2 : %d,%d", pMsg->wParam, pMsg->lParam ); + + if( g_bFirstTime_Wnd2 ) + { + g_bFirstTime_Wnd2 = FALSE; + InitSubClass_Wnd2( ); + } + + return CallNextHookEx(g_hHookGetMessage_Wnd2, hc, wParam, lParam); +} + +//////////////////////////////////////////////////////////////////////////////////////// +void InitSubClass_Wnd3( ) +{ + g_wpOld_Wnd3 = (WNDPROC)SetWindowLong( g_hWnd3, GWL_WNDPROC, (LONG)Proc_Wnd3 ); +} +LRESULT CALLBACK GetMsgProc_Wnd3( INT hc, WPARAM wParam, LPARAM lParam ) +{ + LPMSG pMsg = (LPMSG)lParam; +// DbgPrintf( "GetMsgProc_Wnd3 : %d,%d", pMsg->wParam, pMsg->lParam ); + + if( g_bFirstTime_Wnd3 ) + { + g_bFirstTime_Wnd3 = FALSE; + InitSubClass_Wnd3( ); + } + + return CallNextHookEx(g_hHookGetMessage_Wnd3, hc, wParam, lParam); +} + +//////////////////////////////////////////////////////////////////////////////////////// +// KOSDAQ ƼĿ. +LRESULT CALLBACK Proc_Wnd1( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + LRESULT lResult = CallWindowProc( g_wpOld_Wnd1, hwnd, msg, wParam, lParam ); + switch( msg ) + { + case LVM_INSERTITEM: + { + DbgPrintf( "LVM_INSERTITEM " ); + } + break; + case LVM_SETITEM: + { + DbgPrintf( "LVM_SETITEM " ); + LPLVITEM pItem = (LPLVITEM) lParam; + + memset( &gsmd, NULL, sizeof(SPYMSGDATA) ); + + gsmd.wParam = wParam; + gsmd.lParam = lParam; + strcpy( (char*)gsmd.ExtraData, pItem->pszText ); + + gcds.dwData = UM_HOOKOK_WND1; + + DbgPrintf("Proc_Wnd1 Sending Message hwnd:%8.8x msg:%d", hwnd, msg); + SendMessage(g_hMainWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&gcds); + } + break; + + case WM_APP : + { + UINT nW = (UINT)wParam; + UINT nL = (UINT)lParam; + if( nW == APP_UNSUBCLASSING && nL == APP_UNSUBCLASSING ) + { + DbgPrintf( "Proc_Wnd1 : SetWindowLong" ); + g_wpOld_Wnd1 = (WNDPROC)SetWindowLong( hwnd, GWL_WNDPROC, (LONG)g_wpOld_Wnd1 ); + } + } + break; + case WM_DESTROY : + ::PostMessage( g_hMainWnd, WM_HOOKMSG_TARGETAPP_DESTORYED, UM_HOOKOK_WND1, 0 ); + break; + default: + break; + } + return lResult; +} + +//////////////////////////////////////////////////////////////////////////////////////// +// NewsPlus. +LRESULT CALLBACK Proc_Wnd2( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + LRESULT lResult = CallWindowProc( g_wpOld_Wnd2, hwnd, msg, wParam, lParam ); + + if(msg == 132 || msg == 32 || msg == 675 || msg == 512) + ; + else + DbgPrintf("Message : %d",msg); + /* + static int nCheck = -1; + static char szMessage[256]; + + switch( msg ) + { + case LVM_INSERTITEM: + { + DbgPrintf( "LVM_INSERTITEM " ); + nCheck = 0; // Check Start. + } + break; + case LVM_SETITEM: + { + if( nCheck >= 0 ) + { + ++nCheck; + + if( nCheck == 2 ) // Á¾¸ñÄÚµå. + { + DbgPrintf( "LVM_SETITEM 2" ); + LPLVITEM pItem = (LPLVITEM) lParam; + memset( szMessage, NULL, 256 ); + int nLen = strlen( pItem->pszText ); + if( nLen == 6 ) + strcpy( szMessage, pItem->pszText ); + else + nCheck = -1; // Á¾¸ñÄÚµå ±æÀ̰¡ ¸ÂÁö¾Ê¾Æ¼­ üũī¿îÆ®¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. + } + else if( nCheck == 4 ) // ŸÀÌÆ². + { + DbgPrintf( "LVM_SETITEM 4" ); + LPLVITEM pItem = (LPLVITEM) lParam; + strcat( szMessage, pItem->pszText ); + + memset( &gsmd, NULL, sizeof(SPYMSGDATA) ); + + gsmd.wParam = wParam; + gsmd.lParam = lParam; + strcpy( (char*)gsmd.ExtraData, szMessage ); + + gcds.dwData = UM_HOOKOK_WND2; + + DbgPrintf("Proc_Wnd2 Sending Message hwnd:%8.8x msg:%d", hwnd, msg); + SendMessage(g_hMainWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&gcds); + + nCheck = -1; // üũī¿îÆ®¸¦ ´Ù½Ã ÃʱâÈ­ÇÑ´Ù. + } + } + } + break; + + case WM_APP : + { + UINT nW = (UINT)wParam; + UINT nL = (UINT)lParam; + if( nW == APP_UNSUBCLASSING && nL == APP_UNSUBCLASSING ) + { + DbgPrintf( "Proc_Wnd2 : SetWindowLong" ); + g_wpOld_Wnd2 = (WNDPROC)SetWindowLong( hwnd, GWL_WNDPROC, (LONG)g_wpOld_Wnd2 ); + } + } + break; + case WM_DESTROY : + ::PostMessage( g_hMainWnd, WM_HOOKMSG_TARGETAPP_DESTORYED, UM_HOOKOK_WND2, 0 ); + break; + default: + break; + } + */ + return lResult; +} + +//////////////////////////////////////////////////////////////////////////////////////// +// 7121. +LRESULT CALLBACK Proc_Wnd3( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + LRESULT lResult = CallWindowProc( g_wpOld_Wnd3, hwnd, msg, wParam, lParam ); + + //~! + /* 2005.8.18 + Áß¿äÇÑ Á¤º¸´Â Çìµå¶óÀΰú Á¾¸ñ¸í µÎ°¡Áö·Î °¡Á¤ÇÑ´Ù. + µû¶ó¼­ LVM_SETITEM ¸Þ½ÃÁö¸¸ ÈÄÅ·ÇÏ¸é µÇ¸ç + SubItemÀÌ 2À̸é Çìµå¶óÀÎ + SubItemÀÌ 3À̸é Á¾¸ñ¸íÀÌ´Ù + */ + +// hFile=CreateFile("d:\\NewsLog.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); +// DWORD dwWritten; + + switch( msg ) + { + + /* + case LVM_INSERTITEM: + case LVM_SETITEM: + { + LPLVITEM pLvitem = (LPLVITEM)lParam; + DbgPrintf("[Juno] : [%d,%d]%s",pLvitem->iItem,pLvitem->iSubItem,pLvitem->pszText); + WriteFile(hFile,pLvitem->pszText,strlen(pLvitem->pszText),&dwWritten,NULL); + WriteFile(hFile,"\n",2,&dwWritten,NULL); + } + break; + */ + +// case LVM_INSERTITEM: + case LVM_SETITEM: + { + LPLVITEM pLvitem = (LPLVITEM)lParam; + + DbgPrintf("[Juno] : [%d,%d]%s",pLvitem->iItem,pLvitem->iSubItem,pLvitem->pszText); + + if(pLvitem->iSubItem != 1 && pLvitem->iSubItem != 2 && pLvitem->iSubItem != 3) + break; + + gsmd.wParam = MSG_LIST_SET_ITEM; + gsmd.lParam = pLvitem->iSubItem; + strcpy( (char*)gsmd.ExtraData, (char*)pLvitem->pszText); + + gcds.dwData = UM_HOOKOK_WND3; + + DbgPrintf("Proc_Wnd3 Sending Message hwnd:%8.8x msg:%d", hwnd, msg); + SendMessage(g_hMainWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&gcds); + } + break; + + case LB_INSERTSTRING: + { + memset( &gsmd, NULL, sizeof(SPYMSGDATA) ); + + gsmd.wParam = wParam; + gsmd.lParam = lParam; + strcpy( (char*)gsmd.ExtraData, (char*)lParam); + + gcds.dwData = UM_HOOKOK_WND3; + + DbgPrintf("Proc_Wnd3 Sending Message hwnd:%8.8x msg:%d", hwnd, msg); + SendMessage(g_hMainWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&gcds); + } + break; + case WM_APP : + { + UINT nW = (UINT)wParam; + UINT nL = (UINT)lParam; + if( nW == APP_UNSUBCLASSING && nL == APP_UNSUBCLASSING ) + { + DbgPrintf( "Proc_Wnd3 : SetWindowLong" ); + g_wpOld_Wnd3 = (WNDPROC)SetWindowLong( hwnd, GWL_WNDPROC, (LONG)g_wpOld_Wnd3 ); + } + } + break; + case WM_DESTROY : + ::PostMessage( g_hMainWnd, WM_HOOKMSG_TARGETAPP_DESTORYED, UM_HOOKOK_WND3, 0 ); + break; + default: + break; + } + return lResult; +} +