// 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" #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(NULL, 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(NULL, 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(NULL, 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_s( (char*)gsmd.ExtraData, 256, 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_s( (char*)gsmd.ExtraData, 256, (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_s( (char*)gsmd.ExtraData, 256, (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; }