Files
HLStock/HookInj/HookInj.cpp
2013-08-01 06:01:05 +00:00

602 lines
15 KiB
C++

// HookInj.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <windows.h>
//#include "CmnHdr.h"
#include <WindowsX.h>
#include <CommCtrl.h>
#include <assert.h>
#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(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;
}