📄 hook.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 + -