IPTOR结构,因为Delphi好像并没有定义IMAGE_IMPORT_DESCRIPTOR结构,也许是我没有找到。在我的程序里,自定义了这个结构,为了找到这个结构都快把我累疯了。你也找找吧,如果找到了可要告诉我哦。
type
PIMAGE_IMPORT_DESCRIPTOR = ^
IMAGE_IMPORT_DESCRIPTOR;
IMAGE_IMPORT_DESCRIPTOR = packed record
OriginalFirstThunk : DWORD;
TimeDateStamp : DWORD;
ForwarderChain : DWORD;
Name : DWORD;
FirstThunk : DWORD;
end;
注意,这里也使用了packed 关键字。packed record相当于C 语言中的structure(知道为什么我把packedrecord 称作结构了吧)。
还记得我们前面提到的GetModuleHandle吗?Delphi的帮助里是这么说的:“Parameters lpModuleName Pointsto a null-terminated string that names a Win32 module(either a .DLL or .EXE file)..If this parameter isNULL, GetModuleHandle returns a handle of the fileused to create the calling process.”如果我们把GetModuleHandle的参数设为NULL,哈哈,一切都有了(你有我有全都有)!
为了保证正确地拦截,我们必须穷举P E 文件中的IMAGE_IMPORT_DESCRIPTOR 数组,看是否有我们的M o d u l e (例如USER32.DLL)。如是,则穷举了IMAGE_THUNK_DATA,看是否引入了我们需拦截的函数。在我的程序里, 我穷举了P E 文件中的IMAGE_IMPORT_DESCRIPTOR 数组,并穷举IMAGE_THUNK_DATA,和我们拦截的函数的真正地址比较,如是,则替换它。这样做的好处是我们不必知道我们拦截的函数是从USER32.DLL、GDI32.DLL还是从KERNEL32.DLL中引入的。
唉,说多了让人心烦,也许你早就全知道啦,实在不行,聪明的你读读代码也就全明白了。还是看看关键的截获代码吧,这是PermuteFunction 的终极版本,只需用它代替原版本,程序就全部完成了。关键的代码只有10行哦。
4.关键的代码
(* ------------------------------------------- *)
(* PermuteFunction功能 :用 NewFunc替代 OldFunc *)
(* Windows Me + Delphi 5.0 *)
(* ------------------------------------------ *)
unit APIHook;
interface
uses
Windows, Classes ;
type
PImage_Import_Entry = ^Image_Import_Entry;
Image_Import_Entry = record
Ch