您现在的位置:首页 >> 网络通讯 >> 网络通讯 >> 内容

Delphi中拦截其它程序的网络数据封包

时间:2011/9/3 15:13:22 点击:

  核心提示:拦截网络数据封包的方法有三种,一是将网卡设为混杂模式,这次就可以监视到局域网上所有的数据包,二是HOOK目标进程的发送和接收的API函数,第三种方法是自己实现一个代理的DLL.在这里我们使用HOOKA...

拦截网络数据封包的方法有三种,一是将网卡设为混杂模式,这次就可以监视到局域网上所有的数据包,二是HOOK目标进程的发送和接收的API函数,第三种方法是自己实现一个代理的DLL.在这里我们使用HOOK API的方法,这样易于实现,而且也不会得到大量的无用数据(如第一种方法就会监视到所有的网络数据).

下面是一个尽量简化了的API HOOK的模版,原理是利用消息钩子将DLL中的代码注入到目标进程中,再用GetProcAddress得到API函数入口地址,将函数入口址改为自己定义的函数入口,这样就得到了API函数的相应参数,处理完后,再改回真实API函数入口地址,并调用它.

DLL的HOOK代码已经打包

编译这个DLL后,再新建一个程序调用这个DLL的InstallHook并传入目标进程的主窗口句柄就可:
unit fmMain;


interface


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


type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  
var
  Form1: TForm1;
  InstallHook: function (SWindow: THandle):Boolean;stdcall;
  UnHook: procedure;stdcall;
implementation


{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
  ModuleHandle: THandle;
  TmpWndHandle: THandle;
begin
  TmpWndHandle := 0;
  TmpWndHandle := FindWindow(nil, ’目标窗口的标题’);
  if not isWindow(TmpWndHandle) then
  begin
    MessageBox(self.Handle, ’没有找到窗口’, ’!!!’, MB_OK);
    exit;
  end;
  ModuleHandle := LoadLibrary(’Hook.dll’);
  @InstallHook := GetProcAddress(ModuleHandle, ’InstallHook’);
  @UnHook := GetProcAddress(ModuleHandle, ’UnHook’);
  if InstallHook(FindWindow(nil, ’Untitled’)) then
    ShowMessage(’Hook OK’);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  UnHook
end;

end.



迅雷专用高速下载

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号