1. DLL
// Hook.dll
library Hook;
uses
// 콜백 함수
function HookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result:=0;
if Code>=0 then begin
OutputDebugString('눌러졌거나 떼졌거나');
end;
if Result=0 then Result:=CallNextHookEx(gHHOOK, Code, wParam, lParam);
end;
// 실행파일에서 호출할 훅 설치 함수
function StartHook(): Boolean; stdcall;
begin
if gHHOOK=0 then begin
// 후킹하고자 하는 윈도우
gHWND:=FindWindow('클래스', '캡션');
gPID:=0;
gThreadID:=GetWindowThreadProcessID(gHWND, gPID);
gHHOOK:=SetWindowsHookEx(WH_KEYBOARD, @HookProc, hInstance, gThreadId);
end;
end;
// 실행파일에서 호출할 훅 해제 함수
function StopHook(): Boolean; stdcall;
begin
if gHHOOK>0 then begin
UnHookWindowsHookEx(gHHOOK);
gHHOOK:=0;
end;
end;
exports
StartHook name 'StartHook',
StopHook name 'StopHook';
begin
end.
library Hook;
uses
Windows, Messages, SysUtils, Classes, Forms;
{$R *.res}
var
gHHOOK: HHOOK=0;
gHWND: HWND=0;
gThreadID: DWORD;
gPID: DWORD;
{$R *.res}
var
gHHOOK: HHOOK=0;
gHWND: HWND=0;
gThreadID: DWORD;
gPID: DWORD;
// 콜백 함수
function HookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result:=0;
if Code>=0 then begin
OutputDebugString('눌러졌거나 떼졌거나');
end;
if Result=0 then Result:=CallNextHookEx(gHHOOK, Code, wParam, lParam);
end;
// 실행파일에서 호출할 훅 설치 함수
function StartHook(): Boolean; stdcall;
begin
if gHHOOK=0 then begin
// 후킹하고자 하는 윈도우
gHWND:=FindWindow('클래스', '캡션');
gPID:=0;
gThreadID:=GetWindowThreadProcessID(gHWND, gPID);
gHHOOK:=SetWindowsHookEx(WH_KEYBOARD, @HookProc, hInstance, gThreadId);
end;
end;
// 실행파일에서 호출할 훅 해제 함수
function StopHook(): Boolean; stdcall;
begin
if gHHOOK>0 then begin
UnHookWindowsHookEx(gHHOOK);
gHHOOK:=0;
end;
end;
exports
StartHook name 'StartHook',
StopHook name 'StopHook';
begin
end.
2. 실행파일
// 전역변수
var
ghLib: THandle;
StartHook, StopHook: function: Boolean; stdcall;
// 후킹용 DLL 로딩, 관련 함수 로딩
procedure TForm1.FormCreate(Sender: TObject);
begin
ghLib:=LoadLibrary('DLL파일경로');
StartHook:=GetProcAddress(ghLib, 'StartHook');
StopHook:=GetProcAddress(ghLib, 'StopHook');
end;
// 로딩된 DLL 해제
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(ghLib);
end;
// 버튼 클릭시 훅 설치
procedure TForm1.Button1Click(Sender: TObject);
begin
StartHook;
end;
// 버튼 클릭시 훅 해제
procedure TForm1.Button2Click(Sender: TObject);
begin
StopHook;
end;
var
ghLib: THandle;
StartHook, StopHook: function: Boolean; stdcall;
// 후킹용 DLL 로딩, 관련 함수 로딩
procedure TForm1.FormCreate(Sender: TObject);
begin
ghLib:=LoadLibrary('DLL파일경로');
StartHook:=GetProcAddress(ghLib, 'StartHook');
StopHook:=GetProcAddress(ghLib, 'StopHook');
end;
// 로딩된 DLL 해제
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(ghLib);
end;
// 버튼 클릭시 훅 설치
procedure TForm1.Button1Click(Sender: TObject);
begin
StartHook;
end;
// 버튼 클릭시 훅 해제
procedure TForm1.Button2Click(Sender: TObject);
begin
StopHook;
end;
'Delphi' 카테고리의 다른 글
[Delphi] 프로세스ID로 핸들, ThreadID 알아내기 (0) | 2010.04.26 |
---|---|
[Delphi] DLLMain 사용 (0) | 2010.04.22 |
랜덤 문자열 생성 (0) | 2009.10.10 |
[Delphi] PuTTY의 마지막 라인 가져오기 (0) | 2009.09.05 |
[Delphi] Dos 명령어 실행 후 결과를 받아오는 함수 - DLL (0) | 2009.09.05 |