我在下面的此宏内的hook_t-> addr地址有问题:
微距:
#define HOOK1(library, funcname, hkaddr ) {L###library, #funcname, (void *)&hkaddr, \
&New_##funcname, (void **) &Old_##funcname}
结构:(具有11个元素)
typedef struct _hook_t {
const wchar_t *library;
const char *funcname;
// instead of a library/funcname combination, an address can be given
// as well (this address has more priority than library/funcname)
void *addr;
// pointer to the new function
void *new_func;
// "function" which jumps over the trampoline and executes the original
// function call
void **old_func;
// allow hook recursion on this hook?
// (see comments @ hook_create_pre_trampoline)
int allow_hook_recursion;
// this hook has been performed
int is_hooked;
unsigned char tramp[128];
unsigned char pre_tramp[150];
unsigned char store_exc[128];
unsigned char hook_data[32];
} hook_t;
数据类型:
hook_t
hook_t的数组:
static hook_t g_hooks[] = {
HOOK1( 0, Present, VTable[ PR ] )
};
现在,我通过其他两个功能创建一个pD3D设备,并将Present的地址加载到VTable [PR]位置。 VTable [PR]位置对当前文件具有全局作用域。使用:(静态DWORD VTable [4] = {0};)。
当我使用printf()时,我可以为VTable获得此地址6D93A064 [PR]。
现在VTable [PR]在全局中。
因此,当我在g_hooks []数组内调用HOOK1(0,Present,VTable [PR])时。 VTable [PR]中应具有6D93A064。
所以当它到达宏时:
#define HOOK1(library, funcname, hkaddr ) {L###library, #funcname, (void *)&hkaddr, \
&New_##funcname, (void **) &Old_##funcname}
hkaddr应该是6D93A064,应该将其加载到结构位置addr中:
typedef struct _hook_t {
const wchar_t *library;
const char *funcname;
void *addr;
因为我正在使用的数组的类型为hook_t。
但是当我要打印f()时,hook_t-> addr(地址)...其13D21814。
应该是6D93A064。
为什么地址错误13D21814?我不明白我现在已经在键盘上b了大约6个小时,试图通过Visual Studio和ollydbg解决这个问题。
我不明白。
有人可以帮我解决这个问题吗?
谢谢。
VTable [PR]包含一个指向Present()函数的指针,在您正在使用的宏中:
(void *)&hkaddr
当您应该钩住指针指向的地址时,您试图钩住指针的地址。
基本上是钩住&VTable[PR]
而不是VTable[PR]
,只需删除运算符的“&”地址