IMPORT].VirtualAddress;
if RVA = 0 then exit;
ImportDesc := pointer(integer(Dos)+RVA);
While(ImportDesc^.Name<>0) do
begin
DLL := PChar(Integer(Dos) + ImportDesc^.Name);
PermuteAddrInModule(GetModuleHandle(PChar(DLL)),
OldFunc,NewFunc);
Func := Pointer(Integer(DOS) + ImportDesc.LookupTable);
While Func^ <> nil do
begin
f := TrueFunctionAddress(Func^);
if f = OldFunc then
begin
WriteProcesSMemory(GetCurrentProcess,Func,
@NewFunc,4,written);
If Written > 0 then Inc(Result);
end;
Inc(Func);
end;
Inc(ImportDesc);
end;
end;
begin
IsDone := TList.Create;
try
Result := PermuteAddrInModule(GetModuleHandle(nil),
OldFunc,NewFunc);
finally
IsDone.Free;
end;
end;
end.
我们测试一下。运行TRY2..怎么,又失败了?天啊!(我蒙上眼睛)不要这么悲观嘛!我们不要在Delphi的编译环境下运行它们。不必关闭Delphi,我们来到资源管理器,找到刚才编译好的TRY2.exe,再运行它。怎么样,成功了吧?我想,这就是大多数人没有用Delphi编写成功API Hook 的原因吧。不过,你知道其中的原因吗?就算是留给你的作业题了。再测试一下。我们发现TRY2运行时本进程就会挂上钩子,而TESTTRY需要运行TRY2中的BUTTON1后才挂上钩子,这是对的。因为TRY2运行时就会加载TRYDLL.D L L ,而其他的进程需要S e t W i n d o w s H o o k E x(WH_GETMESSAGE, @GetMsgProc, HInstance, 0)运行后才会加载TRYDLL.DLL。
一切OK!怎么样?用它编了什么好程序也让我分享分享哦。