我正在使用 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