HookAPI函数

unit dllMain;
{*********************************************************
程序:    HookAPI函数
作者:    sunsjw
Blog:   http://www.kao8.cn/blog.asp?name=sunsjw
**********************************************************}
interface
uses
   SysUtils,Windows,Winsock,Graphics,tlHelp32,madCodeHook;
type
   //要HOOK的API函数定义
   TSockSendProc = function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
   TSockRecvProc = function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
   TMsgBoxProc = function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
//--------------------函数声明---------------------------  
function Sun_Send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
function Sun_Recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
function Sun_Box(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
procedure Hook;stdcall;export;
procedure UnHook;stdcall;export;
var
   //用来保存原来函数的地址
   sunSend: TSockSendProc;
   sunRecv: TSockRecvProc;
   sunMsg: TMsgBoxProc;
   i: Integer;
  
implementation
function Sun_Box(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
var
   strTemp: string;
begin
   strTemp := '珊瑚虫:sunsjw';
   Result := sunMsg(hWnd,lpText,pchar(strTemp),uType);
end;
{---------------------------------------}
{函数功能:Recv函数的HOOK
{函数参数:同Recv
{函数返回值:integer
{---------------------------------------}
function Sun_Recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
   //在这里要对接收的数据Buf进行处理
   //暂时不处理了,随便响一声吧。
   MessageBeep(0);
   //调用直正的Send函数
   Result := sunRecv(s,Buf,len, flags);
end;
{---------------------------------------}
{函数功能:Send函数的HOOK
{函数参数:同Send
{函数返回值:integer
{---------------------------------------}
function Sun_Send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
   DeskDC: HDC;
   Can: TCanvas;
   str: string;
   found: boolean;
   Hand,CurrHand: THandle;
   lppe: TProcessEntry32;
begin
   DeskDC := GetDC(0);
   Can := TCanvas.Create;
   Can.Handle := DeskDC;
   CurrHand := GetCurrentProcessID();
   Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
   lppe.dwSize := sizeof(lppe);
   found := Process32First(Hand,lppe);
   while found do
   begin
     if lppe.th32ProcessID=CurrHand then
     begin
       str := lppe.szExeFile;
       found := false;
     end
     else
       found := Process32Next(Hand,lppe);
   end;
   try
     Inc(i);
     Can.TextOut(0,0,str+':正在发送数据...');
   finally
     Can.Free;
     ReleaseDC(0,DeskDC);
   end;
   Result := sunSend(s,Buf,len, flags);
end;
{------------------------------------}
{过程功能:HookAPI
{过程参数:无
{------------------------------------}
procedure Hook;
begin
   HookAPI('ws2_32.dll','send',@Sun_Send,@sunSend);
   HookAPI('ws2_32.dll','recv',@Sun_Recv,@sunRecv);
   HookAPI('user32.dll','MessageBoxA',@sun_Box,@sunMsg);
end;
{------------------------------------}
{过程功能:取消HOOKAPI
{过程参数:无
{------------------------------------}
procedure UnHook;
begin
   UnHookAPI(@sunSend);
   UnHookAPI(@sunRecv);
   UnHookAPI(@sunMsg);
end;
end.

//调用
unit callMain;
interface
uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls,madCodeHook;
type
   TForm1 = class(TForm)
     Button1: TButton;
     Button2: TButton;
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
var
   Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
   //把我们的函数注放到其它进程中
   InjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES,'hookMsg.dll');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
   UninjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES,'hookMsg.dll');
end;
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值