定义C宏并将内存地址设置为用c和c ++编写的结构成员

问题描述 投票:0回答:1

我在下面的此宏内的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解决这个问题。

我不明白。

有人可以帮我解决这个问题吗?

谢谢。

c++ c visual-studio dll dll-injection
1个回答
0
投票

VTable [PR]包含一个指向Present()函数的指针,在您正在使用的宏中:

(void *)&hkaddr

当您应该钩住指针指向的地址时,您试图钩住指针的地址。

基本上是钩住&VTable[PR]而不是VTable[PR],只需删除运算符的“&”地址

© www.soinside.com 2019 - 2024. All rights reserved.