关于hook的问题,高手请进!

oioioi-090 2004-08-16 04:48:26
最近写了一个监控鼠标键盘的hook程序
遇到以下问题:
dll写好后,写了一个exe程序调用,但是只有鼠标在form的区域内才能进行监控,鼠标移到
form区域外无论鼠标键盘都不能监控到,想问一下怎么实现全局的监控?
...全文
207 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
手指风 2004-08-17
  • 打赏
  • 举报
回复
楼主碰到和我一样的问题了,我也不知道怎么解决。可能我想要用到内存映射,对于发送的话是发到数据库吗?我想先在dll里写到文本里,在读出来更新到数据库该行的吧,如果是用socket也应该简单的吧
fei19790920 2004-08-17
  • 打赏
  • 举报
回复
其实这样的HOOK是不需要写在DLL中的,如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
Procedure Hook(En: Boolean = true);
public
{ Public declarations }
end;

var
Form1: TForm1;
hHook: LongWord;
xy: TPoint;

implementation

{$R *.dfm}
Function HookProc(iCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
Begin

Result := 0;
If(peventmsg(lparam)^.message = WM_LBUTTONDOWN) Or
(peventmsg(lparam)^.message = WM_LBUTTONUP) Or
(peventmsg(lparam)^.message = WM_LBUTTONDBLCLK) Or
(peventmsg(lparam)^.message = WM_MOUSEMOVE) Or
(peventmsg(lparam)^.message = WM_RBUTTONDOWN) Or
(peventmsg(lparam)^.message = WM_RBUTTONUP) Or
(peventmsg(lparam)^.message = WM_RBUTTONDBLCLK) Or
(peventmsg(lparam)^.message = WM_MBUTTONDOWN) Or
(peventmsg(lparam)^.message = WM_MBUTTONUP) Or
(peventmsg(lparam)^.message = WM_MBUTTONDBLCLK)
Then
Begin
GETCURSORPOS(XY);
form1.Caption := IntToStr(XY.x) + ' ' + IntToStr(XY.y);
End;
Result := CallNextHookEx(hHook, iCode, wParam, lParam);

End;


procedure TForm1.Button1Click(Sender: TObject);
begin
Hook;

end;

procedure TForm1.Hook(En: Boolean);
begin
If En Then
hHook := SetwindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0)
Else
UnHookWindowsHookEx(hHook);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Hook(false);

end;

end.
zizzzz 2004-08-17
  • 打赏
  • 举报
回复
可以先写到记事本中,然后下次运行时把记事本数据提交到数据库,然后清空!
zhu_yi 2004-08-17
  • 打赏
  • 举报
回复
已搞定,改写了一个控件, 感谢fei19790920(饭桶的马甲(抵制日货))

unit ZTimer;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;

type
TZTimer = class(TTimer)
private
function GetIdleTime: Longint;
procedure SetIdleTime(const Value: Longint);
protected
{ Protected declarations }
public
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
property IdleTime: Longint read GetIdleTime write SetIdleTime;
published

end;

procedure Register;

implementation

var
Instances: integer;
ElapsedTime: Longint;
hHook: LongWord;

procedure Register;
begin
RegisterComponents('Z', [TZTimer]);
end;

Function HookProc(iCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
Begin
Result := 0;
If(peventmsg(lparam)^.message = WM_LBUTTONDOWN) Or
(peventmsg(lparam)^.message = WM_LBUTTONUP) Or
(peventmsg(lparam)^.message = WM_LBUTTONDBLCLK) Or
(peventmsg(lparam)^.message = WM_MOUSEMOVE) Or
(peventmsg(lparam)^.message = WM_RBUTTONDOWN) Or
(peventmsg(lparam)^.message = WM_RBUTTONUP) Or
(peventmsg(lparam)^.message = WM_RBUTTONDBLCLK) Or
(peventmsg(lparam)^.message = WM_MBUTTONDOWN) Or
(peventmsg(lparam)^.message = WM_MBUTTONUP) Or
(peventmsg(lparam)^.message = WM_KEYDOWN)

Then ElapsedTime := GetTickCount;
Result := CallNextHookEx(hHook, iCode, wParam, lParam);

End;

procedure Hook(En: Boolean);
begin
If En Then
hHook := SetwindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0)
Else
UnHookWindowsHookEx(hHook);

end;
{ TZTimer }

constructor TZTimer.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
hook(true);
end;

destructor TZTimer.Destroy;
begin
Hook(false);
inherited;
end;

function TZTimer.GetIdleTime: Longint;
begin
Result := GetTickCount - ElapsedTime;
end;

procedure TZTimer.SetIdleTime(const Value: Integer);
begin
ElapsedTime := GetTickCount + Value;
end;

end.
zhu_yi 2004-08-17
  • 打赏
  • 举报
回复
必须写到dll里,要不就无法实现全局监控,我试过了!
oioioi-090 2004-08-16
  • 打赏
  • 举报
回复
我试着在dll里声明adoconnection和adotable,然后直接写数据库,一直编译不了,不知哪位也遇到过同样困难?
其实我要实现的功能也很简单,就是监控客户端电脑是否使用,如果隔一段时间不碰键盘鼠标(就跟屏保一样),就将结束时间发送给服务器,然后就可以减去开始使用时间来算得客户端实际使用电脑时间!
希望大家帮忙解决!
oioioi-090 2004-08-16
  • 打赏
  • 举报
回复
还有,如何将鼠标运动的信息传到服务器上,好像只能写道本地文件里!
oioioi-090 2004-08-16
  • 打赏
  • 举报
回复
我就是写的dll
然后再程序里面调用该dll
比如点击button后调用hook,但只有鼠标点击在该form上才有响应!
luke5678 2004-08-16
  • 打赏
  • 举报
回复
学习!!
ly_liuyang 2004-08-16
  • 打赏
  • 举报
回复
这样的例子网上有很多的
kaguo 2004-08-16
  • 打赏
  • 举报
回复
如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。根据需要,我们采用的是在DLL中实现Hook的方式。

1.新建一个导出两个函数的DLL文件,在hookproc.pas中定义了钩子具体实现过
程。代码如下:
library keyspy;
uses
windows, messages, hookproc in 'hookproc.pas';
exports
setkeyhook,
endkeyhook;
begin
nexthookproc:=0;
procsaveexit:=exitproc;
exitproc:=@keyhookexit;
end.

2.在Hookproc.pas中实现了钩子具体过程:
unit hookproc;
interface
uses
Windows, Messages, SysUtils, Controls, StdCtrls;
var
nexthookproc:hhook;
procsaveexit:pointer;
function keyboardhook(icode:integer;wparam:wparam;
lparam:lparam):lresult;stdcall;export;
function setkeyhook:bool;export;//加载钩子
function endkeyhook:bool;export;//卸载钩子
procedure keyhookexit;far;
const
afilename='c:\debug.txt';//将键盘输入动作写入文件中
var
debugfile:textfile;
implementation
function keyboardhookhandler(icode:integer;wparam:wparam;
lparam:lparam):lresult;stdcall;export;
begin
if icode< 0 then
begin
result:=callnexthookex(hnexthookproc,icode,wparam,lparam);
exit;
end;
assignfile(debugfile,afilename);
append(debugfile);
if getkeystate(vk_return)< 0 then
begin
writeln(debugfile,'');
write(debugfile,char(wparam));
end
else
write(debugfile,char(wparam));
closefile(debugfile);
result:=0;
end;
function endkeyhook:bool;export;
begin
if nexthookproc< > 0 then begin
unhookwindowshookex(nexthookproc);
nexthookproc:=0;
messagebeep(0); end;
result:=hnexthookproc=0;
end;
procedure keyhookexit;far;
begin
if nexthookproc< > 0 then endkeyhook;
exitproc:=procsaveexit; end;
end.
看雪学堂经典整理, 【专题四】Rootkit的学习与研究 Rootkit是什么?估计很多朋友并不明白,简单的说,Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。Rootkit通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。技术是双刃剑,我们研究它的目的在于,透过我们的研究,用这项技术来保护我们的系统,使我们的系统更加健壮,充分发挥这个技术的正面应用。 对于ROOTKIT专题的研究,主要涉及的技术有如下部分: 1. 内核hook 对于hook,从ring3有很多,ring3到ring0也有很多,根据api调用环节递进的顺序,在每一个环节都有hook的机会,可以有int 2e或者sysenter hook,ssdt hook,inline hook ,irp hook,object hook,idt hook等等。在这里,我们逐个介绍。 1)object hook 2)ssdt hook 3)inline-hook 4)idt hook 5)IRP hook 6)SYSENTER hook 7)IAT HOOK 8)EAT HOOK 2. 保护模式篇章第一部分: ring3进ring0之门 1)通过调用门访问内核 2)通过中断门访问内核 3)通过任务门访问内核 4)通过陷阱门访问内核 3。保护模式篇章第二部分:windows分页机制 1)windows分页机制 4。保护模式篇章第三部分:直接访问硬件 1)修改iopl,ring3直接访问硬件 2)追加tss默认I/O许可位图区域 3)更改tss I/O许可位图指向 5。detour 修改函数执行路径,可用于对函数的控制流程进行重定路径。 1)detour补丁 6. 隐身术 1)文件隐藏 2)进程隐藏 3)注册表键值隐藏 4)驱动隐藏 5)进程中dll模块隐藏 6)更绝的隐藏进程中的dll模块,绕过IceSword的检测 7)端口隐藏 7。ring0中调用ring3程序 1) apc方式 2) deviceiocontrol 方式 8。进程线程监控 1)监控进程创建 2)杀线程 3)保护进程和屏蔽文件执行 9。其他 1)获取ntoskrnl.exe模块地址的几种办法 2)驱动感染技术扫盲 3)shadow ssdt学习笔记 4)高手进阶windows内核定时器之一 5)高手进阶windows内核定时器之二 6)运行期修改可执行文件的路径和Command Line 7)查找隐藏驱动 8)装载驱动的几种办法 9)内核中注入dll的一种流氓方法 10)另一种读写进程内存空间的方法 11)完整驱动感染代码 12)Hook Shadow SSDT 13)ring0检测隐藏进程 对于rootkit的研究,涉及到的内容比较多,需要在充分学习理解这些技术的前提下,透过目前网络上出现的一些rootkit病毒,木马来进行分析,做到活学活用。因此,对于本版块的思路很清晰,首先是基础技术理论的研究,由于目前windows还是主流的操作系统,因此,我们主要研究windows下的rootkit,这个课题是一个长期的,对这个课题感兴趣的朋友,欢迎大家一起参与讨论。 声明: 转贴请注明看雪学院。

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧