关于Detours的完整翻译 - monkisgod的专栏 - CSDN博客
来源:百度文库 编辑:神马文学网 时间:2024/04/20 13:08:04
最近发现研究Detours技术的人多了起来,为了方便大家交流,打算在最近把东西完整的翻译一下。先列在我的blog上,以防忘记。
没有源代码也能更改应用程序的功能
很多时候我们需要帮助客户改变应用程序跟操作系统或其它SDK的交互方式。这种任务通常需要涉及到源代码。很多情况下虽然是自己的程序,但或许也有一部分的模块没有源代码。 幸运的是,微软研究院的一个团队研发出了Detours SDK用于解决这些问题。 简单的说,Detours允许你创建一个dll用于hook到系统的其它函数中,在被hook了的函数被调用时就会转到去调用你实现的那个函数。
整个流程很简单:
· 下载 detours SDK http://research.microsoft.com/sn/detours/ 然后建立工程。
· 你可以用 Visual Studio命令行的方式编译里面的一个"simple"示例代码工程。
· 创建一个你需要hook的目标API函数原型指针。这个函数指针必须跟需要hook的API函数的参数和返回类型一致,否则会就会出问题。把这个函数指针指向需要hook的API函数地址。在接下来的示例中,将以hook系统API函数CreateFile为例来说明使用方法。
· 你需要实现你自己的API函数相关功能来代替被你hook了的API函数功能。在这个示例中,我们将实现一个我们自己的ModifyCreateFile函数,这个函数里面将直接调用reateFile,仅仅修改一下调用参数而已。
static HANDLE (WINAPI *TrueCreateFile)(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORDdwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORDdwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)= CreateFile;
HANDLE WINAPIModifyCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORDdwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORDdwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
dwFlagsAndAttributes|= FILE_FLAG_WRITE_THROUGH;
returnTrueCreateFile(lpFileName, dwDesiredAccess, dwShareMode,lpSecurityAttributes,
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}
· 你需要在你的dll的dllmain函数里调用相关的Detours库函数。 这些函数将在Dll载人事件 DLL_PROCESS_ATTACH中被执行。在调用DetourAttach函数中,我们传入实际的API地址和我们自己实现的代替API那个函数的地址。剩下的事就由Detours SDK处理了。
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)TrueCreateFile, ModifyCreateFile);
DetourTransactionCommit();
· When the DLL_PROCESS_DETACH happens youwill need to clean up the detour and unhook the real API.
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)TrueCreateFile, ModifyCreateFile);
DetourTransactionCommit();
总之,detours就是这么简单。