按地址调用函数

时间:2011-05-13 18:12:34

标签: c++ function-pointers

我正在尝试通过地址学习一些不同的函数调用方法。

bool gl_draw_text(uint x, uint y, uint color, uint alpha, char *fmt);

这个功能正是我所说的。以下是我现在称之为的方式。 (它工作正常。)

static void glDrawText(char* text, int x, int y)
{
DWORD func = 0x10057970;

__asm
{
    push text
    push 255
    push 14
    push y
    push x
    call dword ptr [func]
    }
}

我想要使用的方法就是这个。

void Hack()
{
    bool (draw*)(uint, uint, uint, uint, char*);
    draw = 0x10057970;
    (draw)(20, 20, 14, 255, "Text");
}

但是,我不知道如何正确地将地址转换为函数以使其工作\ compile。 ?

还有一种使用虚函数的方法,我很好奇该方法是如何工作的。 (我也可以使用MS Detours,挂钩,然后调用这样的函数,如果你知道的话,那个方法在幕后是如何工作的。)

所以要明确一点,我只是要求各种方法来完成这项任务,但列出了一些我在读完它们之后很好奇,等等。

2 个答案:

答案 0 :(得分:6)

你总是可以施放:

typedef bool (*funcptr)(uint, uint, uint, uint, char*);

funcptr draw = (funcptr)0x10057970;

或在C ++中:

funcptr draw = reinterpret_cast<funcptr>(0x10057970);

然而,这是完全未定义的行为。

此外,通常情况下,没有什么可以阻止编译器移动目标函数,或者甚至在没有看到它被显式调用时完全消除它。

答案 1 :(得分:2)

此代码编译(参见http://ideone.com/celq1):

typedef unsigned int uint ;
int main()
{
    bool (*draw)(uint, uint, uint, uint, const char*);
    draw = reinterpret_cast<bool (*)(uint, uint, uint, uint, const char*)>(0x10057970);
    draw(20, 20, 14, 255, "Text");
}

但当然不会运行:-)
PS我将char*更改为const char*以摆脱编译器警告。看起来const char*就像你想要的那样,但这对于这个想法并不重要。

编辑添加:事实上,即使是这样编译,如果你想给你的朋友留下深刻印象:

typedef unsigned int uint ;
int main()
{
    reinterpret_cast<bool (*)(uint, uint, uint, uint, const char*)>(0x10057970)
      (20, 20, 14, 255, "Text");
}