封装delphi Hook Api


本文整理自网络,侵删。

  封装delphi Hook Api 
unit uApiHook;

interface

uses
   SysUtils, Windows, TlHelp32;

type
   PJmpCode = ^TJmpCode;
   TJmpCode = packed record
JmpCode: BYTE;
Address: Pointer;
MovEAX: Array [0..2] of BYTE;
   end;

type
   TApiHookInfo = class
   private
FCS:TRTLCriticalSection;
FJmpCode: PJmpCode;
FOldProc: PJmpCode;
FLoadLib: Boolean;
FDllHandle: THandle;
FHookFun: Pointer;
m_hProc: DWORD;
FOldPoint: Cardinal;
FbHook: Boolean;
procedure SetPageWrite;
procedure SetPageReadOnly;
   public
FAddr: Pointer;
constructor Create;
destructor Destroy; override;
function init(ADllName, AFunName: string; ANewFunPointer: Pointer):Boolean;
procedure Lock;
procedure UnLock;
procedure Hook;
procedure UnHook;
   end;

implementation

{ TApiHookInfo }

procedure TApiHookInfo.SetPageWrite;
begin
   if Win32PlatForm = VER_PLATFORM_WIN32_NT   then //判断是不是NT.
VirtualProtect(FAddr, $F, PAGE_EXECUTE_READWRITE, FOldPoint);
end;

procedure TApiHookInfo.SetPageReadOnly;
begin
   if Win32PlatForm = VER_PLATFORM_WIN32_NT   then //判断是不是NT.
VirtualProtect(FAddr, $F, FOldPoint, FOldPoint);
end;

constructor TApiHookInfo.Create;
begin
   InitializeCriticalSection(FCS);
   New(FJmpCode);
   New(FOldProc);
   FLoadLib := False;
   FDllHandle := 0;
   FHookFun := nil;
   FbHook := False;
end;

destructor TApiHookInfo.Destroy;
begin
   if FbHook then
UnHook;
   if FLoadLib then
FreeLibrary(FDllHandle);
   Dispose(FJmpCode);
   Dispose(FOldProc);
   DeleteCriticalSection(FCS);
   inherited;
end;

procedure TApiHookInfo.Hook;
var
   dwSize: Cardinal;
begin
   SetPageWrite;
   WriteProcessMemory(m_hProc, FAddr, FJmpCode, 8, dwSize);
   FbHook := True;
   SetPageReadOnly;
end;

function TApiHookInfo.init(ADllName, AFunName: string;
   ANewFunPointer: Pointer):Boolean;
var
   dwSize: DWORD;
begin
FDllHandle := GetModuleHandle(PChar(ADllName));
if FDllHandle = 0 then
   begin
FDllHandle := LoadLibrary(PChar(ADllName));
if FDllHandle = 0 then
begin
Result := False;
   Exit;
end
else
FLoadLib := True;
   end;
   //函数地址
FAddr := GetProcAddress(FDllHandle, PChar(AFunName));
if (FAddr = nil) then
   begin
Result := False;
Exit;
   end;
   //当前进程
m_hProc := GetCurrentProcess();

if (m_hProc = 0) then
   begin
Result := False;
Exit;
   end;
   //读当前进程中函数地址
   SetPageWrite;
   FJmpCode^.JmpCode := $B8;
   FJmpCode^.MovEAX[0] := $FF;
   FJmpCode^.MovEAX[1] := $E0;
   FJmpCode^.MovEAX[2] := 0;
   ReadProcessMemory(m_hProc, FAddr, FOldProc, 8, dwSize);
   FJmpCode^.Address := ANewFunPointer;
   WriteProcessMemory(m_hProc, FAddr, FJmpCode, 8, dwSize);
   SetPageReadOnly;
   Result := True;
end;

procedure TApiHookInfo.Lock;
begin
   EnterCriticalSection(FCS);
end;

procedure TApiHookInfo.UnHook;
var
   dwSize: DWORD;
begin
   SetPageWrite;
   WriteProcessMemory(m_hProc, FAddr, FOldProc, 8, dwSize);
   FbHook := False;
   SetPageReadOnly;
end;

procedure TApiHookInfo.UnLock;
begin
   LeaveCriticalSection(FCS);
end;

end.


使用方法:
var
   g_OpenProcess: TApiHookInfo;

function MyOpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall;
begin
   g_OpenProcess.Lock;
   try
g_OpenProcess.UnHook;
try
   //你自己的一些代码
   Result := OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
   //你自己的一些代码
finally
   g_OpenProcess.Hook;
end;
   finally
g_OpenProcess.UnLock;
   end;
end;

procedure HookApi;
begin
   g_OpenProcess.init('kernel32.dll', 'OpenProcess', @MyOpenProcess);
end;

procedure UnHookAPI;
begin
   g_OpenProcess.Free;
end;

相关阅读 >>

Delphi 将程序加裁到启动项

Delphi 判断奇数偶数

Delphi firedac tfdconnection连接mysql数据库

Delphi中获取光标句柄代码(包含获取当前线程id)

Delphi百度网盘真实地址解析

Delphi如何在tmemo控件光标当前位置插入字符串

Delphi utf8乱码问题

Delphi随机字符(密码生成)函数

Delphi实现身份证号码15到18位升位算法

Delphi xe 7 mediaplayer 在安卓里放不出声音

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...