光通软件 HookApi

HookApi

  • 2022/10/07 20:40:17
  • 作者:传三动力
  • 来源:光通软件

unit ApiHook;

{

2022年10月7日 19:51:01

QQ:781408 }

interface


uses

 Windows;


function HookAPI(DllName, ApiName: PAnsiChar; CallBackFunc: Pointer; out NextHook:

 Pointer): BOOL; stdcall;


function UnHookAPI(var NextHook: Pointer): BOOL; stdcall;


implementation


function HookAPI(DllName, ApiName: PAnsiChar; CallBackFunc: Pointer; out NextHook:

 Pointer): BOOL; stdcall;

asm

       PUSH    ECX

       PUSH    ECX

       PUSH    EBX

       PUSH    EDI

       PUSH    ESI

       XOR     EBX, EBX

       PUSH    [EBP + 8]

       CALL    GetModuleHandleA

       TEST    EAX, EAX

       JE      @@_LEAVE

       PUSH    [EBP + 0CH]

       PUSH    EAX

       CALL    GetProcAddress

       TEST    EAX, EAX

       JE      @@_LEAVE

       MOV     EDI, EAX

       SUB     EAX, 5

       MOV     ESI, EAX

       CMP     [EAX], 90909090H

       JNZ     @@_LEAVE

       LEA     EDX, [EBP - 4]

       PUSH    EDX

       PUSH    40H

       PUSH    20H

       PUSH    EAX

       CALL    VirtualProtect

       TEST    EAX, EAX

       JE      @@_LEAVE

       LEA     EAX, [EDI + 2]

       MOV     EDX, [EBP + 14H]

       MOV     [EDX], EAX

       MOV     BYTE[ESI], 0E9H

       MOV     EAX, [EBP + 10H]

       SUB     EAX, EDI

       MOV     [ESI + 1], EAX

       MOV     WORD[EDI], 0F9EBH

       LEA     EAX, [EBP - 8]

       PUSH    EAX

       PUSH    [EBP - 4]

       PUSH    20H

       PUSH    ESI

       CALL    VirtualProtect

       PUSH    0H

       PUSH    0H

       PUSH    -1

       CALL    FlushInstructionCache

       DEC     EBX


@@_LEAVE:

       MOV     EAX, EBX

       POP     ESI

       POP     EDI

       POP     EBX

       POP     ECX

       POP     ECX

end;


function UnHookAPI(var NextHook: Pointer): BOOL; stdcall;

asm

       PUSH    ECX

       PUSH    ECX

       PUSH    EDI

       PUSH    EBX

       XOR     EBX, EBX

       MOV     EAX, [EBP + 8]

       TEST    EAX, EAX

       JE      @@_LEAVE

       MOV     EDX, [EAX]

       TEST    EDX, EDX

       JE      @@_LEAVE

       AND     [EAX], 0H

       LEA     EDI, [EDX - 7H]

       LEA     EAX, [EBP - 4]

       PUSH    EAX

       PUSH    40H

       PUSH    20H

       PUSH    EDI

       CALL    VirtualProtect

       TEST    EAX, EAX

       JE      @@_LEAVE

       MOV     [EDI], 90909090H

       MOV     [EDI + 3H], $FF8B9090

       LEA     EAX, [EBP - 8]

       PUSH    EAX

       PUSH    [EBP - 4]

       PUSH    20H

       PUSH    EDI

       CALL    VirtualProtect

       PUSH    0H

       PUSH    0H

       PUSH    -1

       CALL    FlushInstructionCache

       DEC     EBX


@@_LEAVE:

       MOV     EAX, EBX

       POP     EBX

       POP     EDI

       POP     ECX

       POP     ECX

end;


{ ***  Demo ****

var

 NextMessageBox: function(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT):

   Integer; stdcall;


function CallBackMessageBox(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;

begin

 Result := NextMessageBox(hWnd, 'hook!!!!', 'hook', 16);

end;



initialization

 HookAPI('user32.dll', 'MessageBoxA', @CallBackMessageBox, @NextMessageBox);


finalization

 UnHookAPI(@NextMessageBox);

}

end.


本文来源:光通软件

人阅读

相关主题

光通软件

© 2019-2021