找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 2148|回复: 4

HOOK API

[复制链接]
发表于 2009-11-9 03:14:28 | 显示全部楼层 |阅读模式 IP:江苏扬州
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;
发表于 2009-11-9 03:14:29 | 显示全部楼层 IP:江苏扬州
谁把delphi程序发到这来了
回复

使用道具 举报

发表于 2010-2-14 00:05:03 | 显示全部楼层 IP:澳大利亚
。。。苍天之下,厚土之上,竟有如此奇人异士、文人墨客
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 11:36 , Processed in 0.272276 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表