システムの横取りには、プロシージャが DLL 内にある必要があります |
|
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;
}
}
}
| |
|
|
|
|
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;
}
| |
|
|
|