试试easyhook吧,因为这几天除了我手边没有Windows机器。以下只是调用流程(就像我几年前所做的那样,通过Detours将软件的套接字绑定端口更改为不同的端口)
关于 Hook CreateFileW:
easyhook 的 wiki中的示例正是我们想要的。
CreateFileHook = LocalHook.Create(
LocalHook.GetProcAddress("kernel32.dll", "CreateFileW"),
new DCreateFile(CreateFile_Hooked),
this);
在CreateFile_Hooked
你可以改变参数InFileName
,然后调用真正的CreateFileW
static IntPtr CreateFile_Hooked(
String InFileName,
UInt32 InDesiredAccess,
UInt32 InShareMode,
IntPtr InSecurityAttributes,
UInt32 InCreationDisposition,
UInt32 InFlagsAndAttributes,
IntPtr InTemplateFile)
{
// FIGURE OUT THE FILE NAME THAT YOU WANT HERE
// IF the InFileName is not your Document name "My.doc", then call orignal CreateFile
// with all the parameter unchanged.
// call original API...
return CreateFile(
YOUR_CHANGED_FILE_NAME_HERE,
InDesiredAccess,
InShareMode,
InSecurityAttributes,
InCreationDisposition,
InFlagsAndAttributes,
InTemplateFile);
}
通话流程:
将标题更改为“My_Document_2012_11_29”后,然后挂钩 Word 进程的 CreateFileW。例如,当 InFileName 为“My.doc”时,您应将其更改为“My_Document_2012_11_29”。
因为这是在 Word 过程中完成的,所以 Detoured 函数不知道“My.doc”是否映射到“My_Document_2012_11_29”。获取此映射信息的方法有很多,一种是将此映射信息保存到应用程序中的已知文件中,然后在 Detoured 函数中读取该文件。