分享
 
 
 

Delphi中Hook技术全接触

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

看到有的兄弟说Delphi下的Hook不好做,所以在下把每个Hook都在Delphi做了一下,觉得没啥问题,而且处理的方法较新颖,拿来让兄弟们探讨,关于hook问题,有不懂的问我就行,不过有的Hook我只做了个框架,没有具体实用作用,要做的兄弟自已完善就行了,呵呵,代码在下面,自已看啦..........

-------------------------------------------

我的联系方法:

oicq; 10772919

e-mail: njhhack@21cn.com

homepage: hotsky.363.net

--------------------------------------------

----------这是*.dll中的单元---------------

unit HookProc;

interface

uses windows,messages,sysutils;

const

HTName:array[1..13] of pchar=(

'CALLWNDPROC','CALLWNDPROCRET','CBT','DEBUG','GETMESSAGE','JOURNALPLAYBACK',

'JOURNALRECORD','KEYBOARD','MOUSE','MSGFILTER','SHELL','SYSMSGFILTER','FOREGROUNDIDLE'

);

function CallWndProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function CallWndRetProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function CBTProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function DebugProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function JournalPlaybackProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function JournalRecordProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function KeyboardProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function MouseProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function MessageProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function ShellProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function SysMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

function ForegroundIdleProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

implementation

procedure SaveInfo(k:integer;str:string);stdcall;

var

f:textfile;

WorkPath:string;

begin

WorkPath:=ExtractFilePath(ParamStr(0));

assignfile(f,WorkPath+'Records.txt');

if fileexists(WorkPath+'Records.txt')=false then rewrite(f)

else append(f);

//if strcomp(pchar(str),pchar('#13#10'))=0 then writeln(f,'')

//else write(f,str);

writeln(f,HTName[k]+'----'+str);

closefile(f);

end;

function CallWndProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

var

pcs:TCWPSTRUCT;

begin

pcs:=TCWPSTRUCT(PCWPSTRUCT(lParam)^);

if nCode>=0 then

begin

if pcs.message=wm_lbuttonup then

SaveInfo(1,format('hwnd=%x',[pcs.hwnd]));

end;

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function CallWndRetProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function CBTProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function DebugProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

var

pcs:TMSG;

begin

pcs:=TMSG(PMSG(lParam)^);

if nCode>=0 then

begin

if pcs.message=wm_lbuttonup then

SaveInfo(5,format('hwnd=%x',[pcs.hwnd]));

end;

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function JournalPlaybackProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function JournalRecordProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function KeyboardProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function MouseProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function MessageProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function ShellProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function SysMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

//

function ForegroundIdleProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

begin

Result:=CallNextHookEx(0,nCode,wParam,lParam);

end;

end.

--------这是*.dll主程序------------------

library DemoHook;

uses

windows,messages,sysutils,

HookProc in 'HookProc.pas';

{$r *.res}

const

HookMemFileName='DllHookMemFile.DTA';

HTName:array[1..13] of pchar=(

'CALLWNDPROC','CALLWNDPROCRET','CBT','DEBUG','GETMESSAGE','JOURNALPLAYBACK',

'JOURNALRECORD','KEYBOARD','MOUSE','MSGFILTER','SHELL','SYSMSGFILTER','FOREGROUNDIDLE'

);

type

THookProc = function(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;

PShared=^TShared;

THook = record

HookHand:HHook;

HookType:integer;

HookProc:THookProc;

end;

TShared = record

Hook:array [0..16] of THook;

Father,Self:integer;

Count:integer;

hinst:integer;

end;

TWin = record

Msg:TMsg;

wClass:TWndClass;

hMain:integer;

end;

var

MemFile:THandle;

Shared:PShared;

Win:TWin;

wmhook:integer;

procedure SaveInfo(k:integer;str:string);stdcall;

var

f:textfile;

WorkPath:string;

begin

WorkPath:=ExtractFilePath(ParamStr(0));

assignfile(f,WorkPath+'Records.txt');

if fileexists(WorkPath+'Records.txt')=false then rewrite(f)

else append(f);

//if strcomp(pchar(str),pchar('#13#10'))=0 then writeln(f,'')

//else write(f,str);

writeln(f,HTName[k]+'----'+str);

closefile(f);

end;

procedure InitHookData;

var k:integer;

begin

with Shared^ do

begin

for k:=0 to 14 do Hook[k].HookHand:=0;

//

Hook[0].HookType:=WH_CALLWNDPROC;

Hook[0].HookProc:=@CallWndProc;

//

Hook[1].HookType:=WH_CALLWNDPROCRET;

Hook[1].HookProc:=@CallWndRetProc;

//

Hook[2].HookType:=WH_CBT;

Hook[2].HookProc:=@CBTProc;

//

Hook[3].HookType:=WH_DEBUG;

Hook[3].HookProc:=@DebugProc;

//

Hook[4].HookType:=WH_GETMESSAGE;

Hook[4].HookProc:=@GetMsgProc;

//

Hook[5].HookType:=WH_JOURNALPLAYBACK;

Hook[5].HookProc:=@JournalPlaybackProc;

//

Hook[6].HookType:=WH_JOURNALRECORD;

Hook[6].HookProc:=@JournalRecordProc;

//

Hook[7].HookType:=WH_KEYBOARD;

Hook[7].HookProc:=@KeyboardProc;

//

Hook[8].HookType:=WH_MOUSE;

Hook[8].HookProc:=@MouseProc;

//

Hook[9].HookType:=WH_MSGFILTER;

Hook[9].HookProc:=@MessageProc;

//

Hook[10].HookType:=WH_SHELL ;

Hook[10].HookProc:=@ShellProc;

//

Hook[11].HookType:=WH_SYSMSGFILTER;

Hook[11].HookProc:=@SysMsgProc;

//

Hook[12].HookType:=WH_FOREGROUNDIDLE;

Hook[12].HookProc:=@ForegroundIdleProc;

end;

end;

function SetHook(fSet:boolean;HookId:integer):bool;stdcall;

begin

with shared^ do

if fSet=true then

begin

if Hook[HookId].HookHand=0 then

begin

Hook[HookId].HookHand:=SetWindowsHookEx(Hook[HookId].HookType,Hook[HookId].HookProc,hinstance,0);

if Hook[HookId].HookHand<>0 then Result:=true

else Result:=false;

end else Result:=true;

end else

begin

if Hook[HookId].HookHand<>0 then

begin

if UnhookWindowsHookEx(Hook[HookId].HookHand)=true then

begin

Hook[HookId].HookHand:=0;

Result:=true;

end else Result:=false;

end else Result:=true;

end;

end;

procedure Extro;

begin

UnmapViewOfFile(Shared);

CloseHandle(MemFile);

end;

function WindowProc(hWnd,Msg,wParam,lParam:longint):LRESULT; stdcall;

var k:integer;

begin

Result:=DefWindowProc(hWnd,Msg,wParam,lParam);

case Msg of

wm_destroy:

begin

for k:=0 to 12 do SetHook(False,k);

postmessage(findwindow('WinHook',nil),wm_destroy,0,0);

ExitThread(0);

end;

end;

if msg=wmhook then

begin

if wparam>0 then

begin

if sethook(true,wparam-1)=true then postmessage(findwindow('WinHook',nil),wmhook,wparam,0);

end else

begin

if sethook(false,-wparam-1)=true then postmessage(findwindow('WinHook',nil),wmhook,wparam,0);

end;

end;

end;

procedure run;stdcall;

//var k:integer;

begin

win.wClass.lpfnWndProc:= @WindowProc;

win.wClass.hInstance:= hInstance;

win.wClass.lpszClassName:='WideHook';

RegisterClass(win.wClass);

win.hmain:=CreateWindowEx(ws_ex_toolwindow,win.wClass.lpszClassName,'WideHook',WS_CAPTION,0,0,1,1,0,0,hInstance,nil);

FillChar(Shared^,SizeOf(TShared),0);

shared^.self:=win.hmain;

shared^.hinst:=hinstance;

InitHookData;

wmhook:=registerwindowmessage(pchar('wm_hook'));

while(GetMessage(win.Msg,win.hmain,0,0))do

begin

TranslateMessage(win.Msg);

DispatchMessage(win.Msg);

end;

end;

procedure DllEntryPoint(fdwReason:DWORD);

begin

case fdwReason of

DLL_PROCESS_DETACH:

Extro;

end;

end;

exports run;

begin

//建立内存映象文件,用来保存全局变量

MemFile:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TShared),HookMemFileName);

Shared:=MapViewOfFile(MemFile,FILE_MAP_WRITE,0,0,0);

DLLProc:=@DllEntryPoint;

end.

---------这是*.exe主程序---------------------------

Program WinHook;

uses windows,messages,sysutils;

{$r *.res} //使用资源文件

const

HTName:array[1..13] of pchar=(

'CALLWNDPROC','CALLWNDPROCRET','CBT','DEBUG','GETMESSAGE','JOURNALPLAYBACK',

'JOURNALRECORD','KEYBOARD','MOUSE','MSGFILTER','SHELL','SYSMSGFILTER','FOREGROUNDIDLE'

);

type

TWin = record

Msg:TMsg;

wClass:TWndClass;

hMain:integer;

hbut,hlab:array[1..16] of integer;

hLib:integer;

HookStat:array[1..16] of bool;

end;

var

Win:TWin; //结构变量

wmhook:integer;

WorkPath:string;

hRun:procedure;stdcall;

//

procedure runhookfun;

begin

win.hlib:=loadlibrary(pchar(WorkPath+'DemoHook.dll'));

if win.hlib=0 then messagebox(win.hmain,'error','',0);

hrun:=GetProcAddress(win.hlib,'run');

if @hrun<>nil then hrun;

end;

procedure runhook;

var tid:integer;

begin

createthread(nil,0,@runhookfun,nil,0,tid);

end;

function WindowProc(hWnd,Msg,wParam,lParam:longint):LRESULT; stdcall;

var k:integer;

begin

case Msg of

WM_SYSCOMMAND:

begin

case wparam of

SC_CLOSE:

begin

if findwindow('WideHook','WideHook')<>0 then postmessage(findwindow('WideHook','WideHook'),wm_destroy,0,0);

end;//showwindow(hwnd,sw_hide);

SC_MINIMIZE:;//showwindow(hwnd,sw_hide);

SC_MAXIMIZE:;

SC_DEFAULT:;

SC_MOVE:;

SC_SIZE:;

//else

//Result := DefWindowProc(hwnd, uMsg, wParam, lParam);

end;

exit;

end;

wm_command:

begin

for k:=1 to 13 do

begin

if (lparam=win.hbut[k]) and ((k=6) or (k=7)) then break;

if lparam=win.hbut[k] then

begin

if win.HookStat[k]=false then postmessage(findwindow('WideHook','WideHook'),wmhook,k,0)

else postmessage(findwindow('WideHook','WideHook'),wmhook,-k,0);

end;

end;

end;

wm_destroy:

begin

freelibrary(win.hlib);

halt;

end;

end;

if msg=wmhook then

begin

if wparam>0 then

begin

setwindowtext(win.hbut[wparam],pchar('stop'));

win.HookStat[wparam]:=true;

end else

begin

setwindowtext(win.hbut[-wparam],pchar('start'));

win.HookStat[-wparam]:=false;

end;

end;

Result:=DefWindowProc(hWnd,Msg,wParam,lParam);

end;

//主程序的执行函数

procedure run;stdcall;

var k:integer;

begin

if findwindow('WinHook',nil)<>0 then exit;

win.wClass.hInstance:= hInstance;

with win.wclass do

begin

hIcon:= LoadIcon(hInstance,'MAINICON');

hCursor:= LoadCursor(0,IDC_ARROW);

hbrBackground:= COLOR_BTNFACE+1;

Style:= CS_PARENTDC;

lpfnWndProc:= @WindowProc;

lpszClassName:='WinHook';

end;

RegisterClass(win.wClass);

win.hmain:=CreateWindow(win.wClass.lpszClassName,'Delphi Hook Demo 2001',WS_VISIBLE or WS_OVERLAPPEDWINDOW,0,0,240,450,0,0,hInstance,nil);

for k:=1 to 13 do

begin

win.hbut[k]:=CreateWindow('BUTTON','Start',WS_VISIBLE or WS_CHILD,10,10+30*(k-1),50,24,win.hmain,0,hInstance,nil);

win.hlab[k]:=CreateWindow('STATIC',HTName[k],WS_VISIBLE or WS_CHILD,70,10+30*(k-1)+4,150,24,win.hmain,0,hInstance,nil);

win.HookStat[k]:=false;

end;

WorkPath:=ExtractFilePath(ParamStr(0));

runhook;

wmhook:=registerwindowmessage(pchar('wm_hook'));

while(GetMessage(win.Msg,win.hmain,0,0)) do

begin

TranslateMessage(win.Msg);

DispatchMessage(win.Msg);

end;

end;

begin

run; //开始运行主程序

end.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有