Hook

  SetWindowsHookEx



システムのいろいろな処理を「横取り」するプロシージャをインストールする関数です。特に、システムに存在する
全てのウインドウに対するメッセージ処理を「横取り」する事によって、自前のスパイ処理を行なう事ができます



  システムの横取りには、プロシージャが DLL 内にある必要があります



この DLL の使用は、システム内で1回のみにして下さい

LboxHook.cpp
  
#include "stdafx.h"
#include "LboxHook.h"
#include <lightbox.h>

HINSTANCE hInst;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call) {
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
	}
	
	hInst = (HINSTANCE)hModule;

	return TRUE;
}


// これはエクスポートされた変数の例です。
LBOXHOOK_API int nLboxHook=0;

// これはエクスポートされた関数の例です。
LBOXHOOK_API int fnLboxHook(void)
{
	return 42;
}

// これはエクスポートされたクラスのコンストラクタです。
// クラスの定義については LboxHook.h を参照してください。
CLboxHook::CLboxHook()
{ 
	return; 
}

// SendMessge のフックハンドル
static HHOOK hhk = NULL;
// PostMessge のフックハンドル
static HHOOK hhkPost = NULL;

// *********************************************************
// SendMessge のフック処理
// *********************************************************
LRESULT CALLBACK CallWndRetProc(
  int nCode,
  WPARAM wParam,
  LPARAM lParam
)
{
	if ( nCode < 0 ) {
		return CallNextHookEx( hhk, nCode, wParam, lParam );
	}

	HANDLE hMutex;

	hMutex = OpenMutex(
		SYNCHRONIZE,
		false,
		"LboxHook"
	);
	if ( hMutex != NULL ) {
		WaitForSingleObject(hMutex, INFINITE);

		CWPRETSTRUCT *msg;
		char szClass[512];
		char szTitle[512];

		msg = (CWPRETSTRUCT *)lParam;
		if ( msg->message == WM_COMMAND ) {
			GetClassName( msg->hwnd, szClass, 512 );
			GetWindowText( msg->hwnd, szTitle, 512 );

			LboxInfo Info;
			LboxString LString;
			LboxTextFile Txt;

			Info.TempPath( &LString );
			LString.AddBackslash();
			LString.operator += ("LboxHook.log");

			if( Txt.AppendOpen( &LString ) ) {
				Info.Time( &LString );
				Txt.PutPrintf(
					"%s:"
					"SEND:WM_COMMAND:"
					"%lX:%u:%u:%lu:%s:%s\n",
					LString.szLboxString,
					msg->hwnd,
					LOWORD(msg->wParam),
					HIWORD(msg->wParam),
					lParam,
					szClass,
					szTitle
				);
				Txt.Close();
			}

		}
		ReleaseMutex(hMutex);
	}

	return CallNextHookEx( hhk, nCode, wParam, lParam );

}
// *********************************************************
// PostMessge のフック処理
// *********************************************************
LRESULT CALLBACK GetMsgProc(
  int nCode,
  WPARAM wParam,
  LPARAM lParam
)
{
	if ( nCode < 0 ) {
		return CallNextHookEx( hhkPost, nCode, wParam, lParam );
	}

	HANDLE hMutex;

	hMutex = OpenMutex(
		SYNCHRONIZE,
		false,
		"LboxHook"
	);
	if ( hMutex != NULL ) {
		WaitForSingleObject(hMutex, INFINITE);

		MSG *msg;
		char szClass[512];
		char szTitle[512];

		msg = (MSG *)lParam;
		if ( msg->message == WM_COMMAND ) {
			GetClassName( msg->hwnd, szClass, 512 );
			GetWindowText( msg->hwnd, szTitle, 512 );

			LboxInfo Info;
			LboxString LString;
			LboxTextFile Txt;

			Info.TempPath( &LString );
			LString.AddBackslash();
			LString.operator += ("LboxHook.log");

			if( Txt.AppendOpen( &LString ) ) {
				Info.Time( &LString );
				Txt.PutPrintf(
					"%s:"
					"POST:WM_COMMAND:"
					"%lX:%u:%u:%lu:%s:%s\n",
					LString.szLboxString,
					msg->hwnd,
					LOWORD(msg->wParam),
					HIWORD(msg->wParam),
					lParam,
					szClass,
					szTitle
				);
				Txt.Close();
			}

		}
		ReleaseMutex(hMutex);
	}

	return CallNextHookEx( hhk, nCode, wParam, lParam );

}

extern "C" { 
// *********************************************************
// システムフックのインストール
// *********************************************************
LBOXHOOK_API void Initialize( void )
{
	if ( hhk == NULL ) {
		// ミューテックス作成
		CreateMutex(
			NULL,
			false,
			"LboxHook"
		);

		// システムフックの実装
		hhk = SetWindowsHookEx(
			WH_CALLWNDPROCRET,
			CallWndRetProc,
			hInst,
			0				
		);
		hhkPost = SetWindowsHookEx(
			WH_GETMESSAGE,
			GetMsgProc,
			hInst,
			0				
		);
	}
}

// *********************************************************
// システムフック解放
// *********************************************************
LBOXHOOK_API void End( void )
{
	if ( hhk != NULL ) {
		UnhookWindowsHookEx( hhk );
		hhk = NULL;
	}
	if ( hhkPost != NULL ) {
		UnhookWindowsHookEx( hhkPost );
		hhkPost = NULL;
	}
}
}
  



  LboxHook の呼び出し

  
typedef void (*LPFUNC1)( void );
typedef void (*LPFUNC2)( void );

HINSTANCE lib;
LPFUNC1 Initialize;
LPFUNC2 End;
// *********************************************************
// フックのロード
// *********************************************************
void LoadHook( HWND hWnd )
{
	lib = LoadLibrary( "LboxHook.dll" );
	if ( lib == NULL ) {
		MessageBox( hWnd, "dll のロードに失敗しました", "", MB_OK );
		return;
	}

	Initialize = (LPFUNC1)GetProcAddress( lib, "Initialize" );
	if ( Initialize == NULL ) {
		FreeLibrary( lib );
		lib = NULL;
		MessageBox( hWnd, "Initialize のロードに失敗しました", "", MB_OK );
		return;
	}
	End = (LPFUNC2)GetProcAddress( lib, "End" );
	if ( End == NULL ) {
		FreeLibrary( lib );
		lib = NULL;
		MessageBox( hWnd, "End のロードに失敗しました", "", MB_OK );
		return;
	}

	Initialize( );
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR szHello[MAX_LOADSTRING];
	LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

	switch( message ) 
	{
		case WM_CREATE:
			LoadHook( hWnd );
			break;

		case WM_COMMAND:
			wmId    = LOWORD(wParam); 
			wmEvent = HIWORD(wParam); 
			// メニュー選択の解析:
			switch( wmId ) 
			{
				case IDM_ABOUT:
					DialogBox(
					   hInst,
					   (LPCTSTR)IDD_ABOUTBOX,
					   hWnd,
					   (DLGPROC)About
					);
				   break;
				case IDM_EXIT:
				   DestroyWindow( hWnd );
				   break;
				default:
					return DefWindowProc(
						hWnd,
						message,
						wParam,
						lParam
					);
			}
			break;
		case WM_PAINT:
			hdc = BeginPaint (hWnd, &ps);
			// TODO: この位置に描画用のコードを追加してください...
			RECT rt;
			GetClientRect( hWnd, &rt );
			DrawText( hdc, szHello, strlen(szHello), &rt, DT_CENTER );
			EndPaint( hWnd, &ps );
			break;
		case WM_DESTROY:
			if ( lib != NULL ) {
				End();
				FreeLibrary( lib );
			}
			PostQuitMessage( 0 );
			break;
		default:
			return DefWindowProc( hWnd, message, wParam, lParam );
   }
   return 0;
}
  



  横取り情報を元に、他のウインドウのメニューを実行する

  
LboxDlg *Dlg;
// バージョン情報ボックス用メッセージ ハンドラ
LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
	switch( message ) {
		case WM_INITDIALOG:
			Dlg = new LboxDlg( hDlg );
			return TRUE;

		case WM_COMMAND:
			if( LOWORD(wParam) == IDOK
				|| LOWORD(wParam) == IDCANCEL ) {
				delete Dlg;
				EndDialog(hDlg, LOWORD(wParam));
				return TRUE;
			}
			if( LOWORD(wParam) == IDC_BUTTON1 ) {
				LboxString Class;
				LboxString Id;
				HWND hTarget;

				Dlg->EditGetText( IDC_EDIT1, &Class );
				Dlg->EditGetText( IDC_EDIT2, &Id );
				hTarget = FindWindow( Class.szLboxString, NULL );
				if ( hTarget != NULL ) {
					PostMessage(
						hTarget,
						WM_COMMAND,
						MAKEWPARAM((DWORD)(Id.Atoi()),0),
						0
					);
				}
			}
			break;
	}
	return FALSE;
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ