1

这只是一个简单的问题。我一直在阅读附加到子程序的内存地址的东西的源代码,使用DetourAttach(&(PVOID &)BindKeyT, BindKeyD);whereBindKeyT是内存中子程序的地址。我很好奇,(&(PVOID &)英文到底是什么意思?我知道这PVOID是一个 void 指针,但是如何将其转换为可用于附加绕道的函数?

4

3 回答 3

2

Terry Mahaffey 是对的,您传递的是指向函数指针的指针。每当您将指针传递给的函数(在本例中为 DetourAttach)想要返回多个值并且其中一个返回值是指针时,通常都会使用此方法。由于 C/C++ 中的函数只能返回单个值,因此从中获取多个值的唯一方法是通过指针。

一个简单的例子是当一个人希望返回一个指向已分配内存块的指针时。然后可以编写如下函数:

int allocstr(int len, char **retptr)
 {
  char *p = malloc(len + 1); /* +1 for \0 */
  if(p == NULL)
   return 0;
  *retptr = p;
  return 1;
 }

要回答您的另一个问题,即如何设置要用作函数的内存地址,可以这样做:

void* (void * BindKeyT)(const char* key) = actual_BindKeyT;

// actual_BindKeyT is a pointer to a function that will be defined elsewhere, 
// and whose declaration you will include in your project through a header file
// or a dll import

void * BindKeyD(const char* key)
{
    // Code for your hook function
}

DetourAttach(&(PVOID&)BindKeyT, BindKeyD);

(取自http://zenersblog.blogspot.com/2008/04/api-hooking-with-detours-part-1.html

请记住,BindKeyT 和 BindKeyD 的声明应该匹配。

于 2010-03-08T10:39:16.523 回答
1

我脑海中的 C++ 解析器(它不是无错误的)说它是 BindKeyT 的 C 风格转换,指向指向 void 的指针的引用 - (PVOID&) 部分 - 然后取其地址 - 前面的 & . 所以表达式的结果是一个指向函数指针的指针。

于 2010-03-08T07:00:19.243 回答
0

这里有Detours的介绍:api-hooking-with-detours-part-1

于 2010-03-08T07:05:41.693 回答