我正在尝试通过地址学习一些不同的函数调用方法。
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,挂钩,然后调用这样的函数,如果你知道的话,那个方法在幕后是如何工作的。)
所以要明确一点,我只是要求各种方法来完成这项任务,但列出了一些我在读完它们之后很好奇,等等。
答案 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");
}