首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MS Detours 3.0未正确挂接CreateFile win32 API函数

MS Detours 3.0未正确挂接CreateFile win32 API函数
EN

Stack Overflow用户
提问于 2013-01-09 20:44:46
回答 2查看 2.1K关注 0票数 0

我正在尝试使用MS Detour挂钩win32应用编程接口函数" CreateFile“,但是当我使用MS Word打开一个*.doc文件来测试它时,对DLL和字体文件以及MS Word加载的目录的CreateFile调用被重定向到我的绕道函数,但不是针对该*.doc文件,但是当我使用记事本打开一个*.txt文件时,对该*.txt文件的DLL调用会转到我的绕道函数。

我使用以下代码来挂钩CreateFile:

代码语言:javascript
复制
static HANDLE (WINAPI *Real_CreateFile)(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) = CreateFile;

HANDLE WINAPI Routed_CreateFile(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
OutputDebugString(lpFileName);
return Real_CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{
LONG Error;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:

    OutputDebugString(L"Attaching MyDLL.dll");
    OutputDebugString(strInfo);
    DetourRestoreAfterWith();
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)Real_CreateFile, Routed_CreateFile);
    Error = DetourTransactionCommit();

    if (Error == NO_ERROR)
        OutputDebugString(L"Hooked Success");
    else
        OutputDebugString(L"Hook Error");

    break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
    OutputDebugString(L"De-Attaching MyDLL.dll");
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourDetach(&(PVOID&)Real_CreateFile, Routed_CreateFile);
    Error = DetourTransactionCommit();

    if (Error == NO_ERROR)
        OutputDebugString(L"Un-Hooked Success");
    else
        OutputDebugString(L"Un-Hook Error");

    break;
}
return TRUE;
}

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-09 21:47:35

我认为你在这之后遗漏了一个break

代码语言:javascript
复制
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
    break;  // Not interested in thread messages
case DLL_PROCESS_DETACH:

在调用它之前,您是否只是脱离了绕道?也许打开.doc会创建一个新线程,但.txt不会,从而触发此代码路径。

票数 3
EN

Stack Overflow用户

发布于 2013-01-11 00:06:45

看起来你没有正确初始化你的Real_CreateFile函数指针。我猜您正在将它设置为您的模块的CreateFile导入表项。

相反,应将其初始化为GetProcAddress(GetModuleHandle("kernel32"),"CreateFileW");

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14235482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档