我正在使用 Detours 挂钩并尝试在二维数组中实现函数指针以DetourAttach
按索引生成。我们拥有什么:
// объявление функции двойника
HIMAGELIST WINAPI MyImageList_Create(
int cx,
int cy,
UINT flags,
int cInitial,
int cGrow
);
// объявление указателя на оригинальную функцию
static HIMAGELIST(WINAPI* actualImageList_Create)(int cx, int cy, UINT flags, int cInitial, int cGrow) = ImageList_Create;
// подключение хука на функцию
DetourAttach(&(PVOID&)actualImageList_Create, MyImageList_Create);
// описание функции двойника
HIMAGELIST WINAPI MyImageList_Create(
int cx,
int cy,
UINT flags,
int cInitial,
int cGrow
)
{
return actualImageList_Create(cx, cy, flags, cInitial, cGrow);
}
这个示例工作正常,但在使用许多函数钩子时不方便。有必要将指向 double 和原始函数的指针放置在二维数组中,以便通过索引连接钩子,如下所示:
DetourAttach(functptr[0][0], functptr[0][1]);
因此,在 double 函数的描述中,也从数组中调用原始函数:索引是这样的:
functptr[0][0](cx, cy, flags, cInitial, cGrow);
需要实施什么:
// объявление функции двойника
HIMAGELIST WINAPI MyImageList_Create(
int cx,
int cy,
UINT flags,
int cInitial,
int cGrow
);
// Объявление целевого массива
PVOID(*functptr[][2]) = { { /*...*/ , (PVOID*)MyImageList_Create} };
// объявление указателя на оригинальную функцию,
// который надо разместить в массиве в первой колонке,
// во второй колонке разместить указатель на функцию двойника
// ...
// подключение хука на функцию
DetourAttach(&(PVOID&)functptr[0][0], functptr[0][1]);
// описание функции двойника
HIMAGELIST WINAPI MyImageList_Create(
int cx,
int cy,
UINT flags,
int cInitial,
int cGrow
)
{
return functptr[0][0](cx, cy, flags, cInitial, cGrow);
}
Detours 说明https://www.codeproject.com/Articles/30140/API-Hooking-with-MS-Detours
这就是我决定执行任务的方式。该代码是从其他人的项目中获取的,因此需要清理和更正一些内容。 DetoursHelper.hpp:
WinHook.cpp:
我没有 Windows,所以我可能搞砸了 Windows typedef 的建模。
特别是,根据enSO 的建议,我们必须确定
在
HIMAGELIST
谷歌浏览后,我这样确定——这就是答案——
我认为首先,为了简化函数二维数组的描述,
functptr[][2]
值得为函数指针定义一个 typedef,我们将这种类型称为 --img_foo_t
。之后我能够编译以下代码(使用您的函数)
请注意将第一个参数传递给 DetourAttach 的更改
(我们实际上是使用函数指针传递变量的地址(如 Detours API Hooking 链接中所述))。
PS 很明显,我使用了 ImageList_Create 和 DetourAttach 函数的存根。