⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hook.pas

📁 千年外挂通用
💻 PAS
字号:
unit hook;

interface

uses
  SysUtils,classes,windows,
  madCodeHook, winsock2,gamepacket, dllform;

function sethook: bool; export;
function endhook: bool; export;
procedure keyboradproc (nCode: Integer; wParam: WPARAM; lParam: LPARAM); stdcall;
procedure exitdll;

var
  oldWSASend:function ( s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD;
            var lpNumberOfBytesSent : DWORD; dwFlags : DWORD;lpOverlapped : LPWSAOVERLAPPED;
            lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;

  oldWSARecv:function ( s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD;
            var lpNumberOfBytesRecvd : DWORD; var lpFlags : DWORD; lpOverlapped : LPWSAOVERLAPPED;
            lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;

var
  idhook : hhook;
  saveexitproc :pointer;

implementation

procedure myrecv (buf:pchar; len:integer);
var
  i,onelen :integer;
  packet_Header :pchar;
begin
  i      := 0;
  onelen := 0;
  packet_header := buf;
  while i < len do
    begin
      if buf[i] = '(' then
        begin
        onelen := 1;
        packet_header := @buf[i] ;
        end;

      if buf[i] = ')' then
        begin
        gamepacketrecv (packet_header,onelen);
        end;
                
      inc (onelen);
      inc (i);    
    end;
end;

procedure mysend (buf:pchar; len:integer);
var
  i,onelen :integer;
  packet_Header :pchar;
begin
  i      := 0;
  onelen := 0;
  packet_header := buf;
  while i < len do
    begin
      if buf[i] = '(' then
        begin
        onelen := 1;
        packet_header := @buf[i] ;
        end;

      if buf[i] = ')' then
        begin
        gamepacketsend (packet_header,onelen);      
        end;
                
      inc (onelen);
      inc (i);    
    end;
end;

function myWSARecv( s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD;
         var lpNumberOfBytesRecvd : DWORD; var lpFlags : DWORD;lpOverlapped : LPWSAOVERLAPPED;
         lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;

begin
  myWSARecv := oldWSARecv(s,lpBuffers,dwBufferCount,lpNumberOfBytesRecvd,lpFlags,lpOverlapped,lpCompletionROUTINE);
  myrecv (lpBuffers.buf,lpNumberOfBytesRecvd);          //收包处理
end;

function myWSASend( s : TSocket; lpBuffers : LPWSABUF; dwBufferCount : DWORD;
         var lpNumberOfBytesSent : DWORD; dwFlags : DWORD;lpOverlapped : LPWSAOVERLAPPED;
         lpCompletionRoutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE ): Integer; stdcall;
begin
  if gamesocket = 0 then gamesocket := s ;              //给sokcet赋值 初始化
  mysend (lpBuffers.buf,lpNumberOfBytesSent);           
  myWSASend := oldWSASend(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,lpOverlapped,lpCompletionROUTINE);
end;


//-------------------------------------------------------------------------------------------
procedure keyboradproc (nCode: Integer; wParam: WPARAM; lParam: LPARAM); stdcall;
var
  hwnd : dword;
  classname : pchar;
begin
  if ncode < 0 then
    begin
    callnexthookex (idhook, ncode, wparam, lparam);
    exit;
    end;
  if ((lparam and $80000000) = 0) and (wparam = $13 ) then  // pause 键
    begin
    hwnd:=getforegroundwindow ();                           //获取当前窗体句柄
    GetMem (classname, 255);
    getclassname (hwnd, classname, 255);
    if strcomp(classname,'TFrmM') = 0 then
      begin
      if dllform1 <> nil then dllForm1.show                 //如果dll窗体加载了就显示
      else begin
        try
        dllForm1 := TdllForm1.CreateParented (hwnd) ;       //dllform创建
        dllForm1.Show;
        HookAPI('ws2_32.dll','WSASend',@myWSASend,@oldWSASend);
        HookAPI('ws2_32.dll','WSARecv',@myWSARecv,@oldWSARecv);
        except
        dllForm1.free;      
        end;
        end;
      end;
      freeMem(classname);
    end;
end;

procedure exitdll;                 
begin
  if idhook <> 0 then
  endhook;                          // 关闭钩子
  exitproc := saveexitproc;         // 恢复退出指针
end;

function sethook: bool; export;
begin
  Result := false;
  if idhook <> 0 then
    exit;
  idhook := Setwindowshookex (WH_KEYBOARD,@keyboradproc,hinstance,0);
  Result := idhook <> 0 ;
end;

function endhook: bool; export;
begin
  if idhook <> 0 then
    begin
    Unhookwindowshookex (idhook);
    idhook := 0;
    end;
  result :=idhook = 0;
end;

end.


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -