C++ 按地址调用函数

C++ 按地址调用函数,c++,function-pointers,C++,Function Pointers,我正在尝试学习几种通过地址调用函数的不同方法 bool gl_draw_text(uint x, uint y, uint color, uint alpha, char *fmt); 这个函数就是我调用的。下面是我现在的称呼。(而且效果很好。) 我想用的方法就是这个 void Hack() { bool (draw*)(uint, uint, uint, uint, char*); draw = 0x10057970; (draw)(20, 20, 14, 255,

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

bool gl_draw_text(uint x, uint y, uint color, uint alpha, char *fmt);
这个函数就是我调用的。下面是我现在的称呼。(而且效果很好。)

我想用的方法就是这个

void Hack()
{
    bool (draw*)(uint, uint, uint, uint, char*);
    draw = 0x10057970;
    (draw)(20, 20, 14, 255, "Text");
}
但是,我不知道如何正确地将地址强制转换为函数,使其工作\编译

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

所以说得清楚一点,我只是想问一下完成这项任务的各种方法,但在阅读了这些方法之后,我列出了一些我很好奇的方法,等等。

你可以随时选择:

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

funcptr draw = (funcptr)0x10057970;
或者在C++中:

funcptr draw = reinterpret_cast<funcptr>(0x10057970);
funcptr draw=reinterpret_cast(0x10057970);
然而,这是完全未定义的行为

另外,一般来说,没有什么可以阻止编译器移动目标函数,或者如果没有看到显式调用它,甚至完全删除它。

此代码编译(请参阅):


它不工作,还是不编译?一般来说,当你重新编译时,甚至当你再次运行同一个程序时,函数的实际地址都会改变。@Neil,这不是魔术,它是一个真实函数的真实地址@aramadia,就像我说的,这是一个铸造问题。@TheMonster我的观点是,你怎么知道那是函数的地址?因为我知道?不知道为什么重要,你应该相信我的话。但是,如果你真的必须知道的话。我知道它是地址,因为我正在破解一个游戏,这个函数是破解同一个游戏的另一个DLL的一部分,我认识编写其他DLL的人,他们告诉我可以找到它的偏移量,我调试了.exe,检查过了,果然找到了。@TheMonster我为什么要相信你的话?DLL可以很容易地加载到另一个地址,这取决于无数的东西。好吧,这个地址存在于一个我正在破解的.exe中,我应该提到这一点。(它实际上是另一个DLL的一部分,应该在将来的某个时候添加到导出表中,但现在,我必须这样访问它。或者写我自己的,GL文本是有点痛苦自己做。)谢谢你,顺便说一句,我会尝试一下您无意中采用了Monster的非常规语法,使用了
(funcptr*)
而不是
(*funcptr)
。我希望你使用的编译器不是那么非常规,以至于接受它!我见过星号(无效星号)等等,。但是,正如我所提到的,我从未听过你的建议,我在某处读到过关于这种方法的文章,但我很好奇如何用地址来实现它。(我有我的理由,它应该工作得很好,这个功能哪儿也去不了,相信我,它已经存在好几天了。)我真的不明白为什么这会被提高投票率,因为它并没有真正解决这个问题,而且承认它引用了UB。@Neil:你所有的负面评论都激发了我对它的投票。你在这里吃什么?谢谢,这正是我想要的-编译,并按预期工作。
funcptr draw = reinterpret_cast<funcptr>(0x10057970);
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");
}
typedef unsigned int uint ;
int main()
{
    reinterpret_cast<bool (*)(uint, uint, uint, uint, const char*)>(0x10057970)
      (20, 20, 14, 255, "Text");
}