我正在逆向源代码,我发现了一个如下所示的函数:
考虑一下:
int examplefn(int x) { return x * 4; }
int (*rtx())(int)
{
return examplefn;
}
好吧,然后我需要创建一个指向
rtx()
的指针函数来执行挂钩,然后我做了这样的事情:
int (*fncptr())(int) = (int(*())(int))0xC0FFEE;
/* 0xC0FFEE it's a sample of the memory address of the function...*/
但是我的编译器没有编译它,然后我尝试这样做:
typedef int(*fnc_t())(int);
// Clearer example pointing to rtx
fnc_t* TRY_2 = (fnc_t*)&rtx;
// then has successfully compiled, ex test...
int main()
{
std::cout << TRY_2()(4) << std::endl; // output: 16 ok.
}
好吧,我进入正题了,如何在不使用
typedef
的情况下进行正确的铸造?
我在网上查遍了,但没有找到任何东西......
为什么要避免使用 typedef?它使代码更容易理解:
using F = int(*)(int); // pointer to function taking int and returning int
using G = F(*)(); // pointer to function taking nothing and returning
// a pointer to function taking int and returning int
我没有时间写,其他人也没有时间阅读和理解。我认为这是一场胜利。
(int(*())(int))
是一个函数类型(与函数 rtx
具有相同的类型)。您的代码尝试声明一个函数,并将一个整数转换为函数。然而你实际上想要处理一个指向这样的函数的指针。
在:
typedef int(*fnc_t())(int);
之后,可以通过在typedef:fnc_t *x;
中将fnc_t
替换为(*x)
来找到int (*(*x)())(int)
的等效项。所以你的代码可能是:
int (*(*fncptr)())(int) = (int(*(*)())(int))0xC0FFEE;
在实际代码中使用一系列
typedef
(或等效的 using
)当然是更好的选择。