MS Detours - DetourAttach 失败

Posted

技术标签:

【中文标题】MS Detours - DetourAttach 失败【英文标题】:MS Detours - DetourAttach fails 【发布时间】:2019-05-25 13:44:01 【问题描述】:

在这里感觉很愚蠢,但为什么这段代码在 Visual 中给我一个语法错误 Studio 什么时候尝试编译它?

    DetourAttach(&(PVOID&)true_create_file, create_file);

编译器抱怨(在 PVOID 之后加下划线)

错误(活动)E0018 预期为 ')'

代码实际上是从 Detours example page 复制而来的。我假设这是因为我的包含文件具有 .c 扩展名,因此被 VS 编译为 C,而示例具有 .cpp 扩展名并被编译为 C++。

我不完全确定所有演员阵容中发生了什么。为什么 C 编译器不喜欢它,我如何让它编译这一行?

下面是完整的代码清单:

#include <Windows.h>
#include "detours.h"
#pragma comment(lib, "detours.lib")

static HANDLE(WINAPI *true_create_file) (LPCSTR file, DWORD access,
    DWORD share, LPSECURITY_ATTRIBUTES sec, DWORD disp, DWORD flags,
    HANDLE tmpl) = CreateFileA;

HANDLE WINAPI create_file(LPCSTR file, DWORD access, DWORD share,
    LPSECURITY_ATTRIBUTES sec, DWORD disp, DWORD flags, HANDLE tmpl) 


int hook_create_file() 
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    /* syntax error */
    DetourAttach(&(PVOID&)true_create_file, create_file);
    DetourTransactionCommit();

PVOID 定义为

typedef void *PVOID;

【问题讨论】:

使用(void**)&amp;true_create_file 它有效,谢谢。你能解释一下为什么上面的代码会出现语法错误吗? @user3700562 因为 C 中不存在引用 如果您想使用 C++ 和 C++ 编译器,则 (1) 重命名源文件,或 (2) 添加命令行选项 /Tp/TP。另请参阅 MSDN 上的 /Tc, /Tp, /TC, /TP (Specify Source File Type)。 【参考方案1】:

&amp;(PVOID&amp;) 部分:首先将参数转换为对指向 void 的指针的引用,然后获取该指针的地址。正如注释所指出的,您将其编译为 C,但 C 中不存在引用操作。因此编译器将“&”识别为取地址,但后面只有“)”,然后得到 expected a ')' 错误。

因为PVOID&amp; 在这里没有意义,只是为了增加可读性。你可以在这里使用PVOID而不是PVOID&amp;

DetourAttach(&(PVOID)true_create_file, create_file);

您还可以从here 获取DetourAttach 函数详细信息。

【讨论】:

以上是关于MS Detours - DetourAttach 失败的主要内容,如果未能解决你的问题,请参考以下文章

MS Detours 2.1 - 出栈

MS Detours库,绕行非win api函数

DetourAttach 成功,但没有挂钩功能 :(

如何使用 DetourAttach() 指向十六进制函数的指针?

MS绕道MakeFile错误

Detours 3.0 钩子 GetProcAddresss()