v5 = (*(int (__cdecl **)(int))((char *)&etext + 1))(a1);
请向我解释这一行是什么意思(如果可能,请写出它是从(语言 - c)编译的)
v5 = (*(int (__cdecl **)(int))((char *)&etext + 1))(a1);
请向我解释这一行是什么意思(如果可能,请写出它是从(语言 - c)编译的)
它只是通过函数指针进行的复杂函数调用。
(*(int (__cdecl **)(int))
将给定的数字转换为指向函数指针的指针(请注意**二级函数指针)并取消引用它,因此您最终会得到一个常规函数指针。使用的调用约定是cdecl. 目标函数看起来像:
int __cdecl do_something(int some_arg) { ... }
被转换和解引用的数字然后是etext加 1的地址。所以 atetext + 1是一个地址,它指向另一个指向函数的地址。
然后a5将该函数作为参数调用,将返回值存储在 v5 中。
如果我必须编写一个 C 代码片段,它会是这样的,最后一行是您发布的内容:
typedef int (_cdecl *fptr2)(int); //first degree function pointer typedef
typedef int (_cdecl **fptr1)(int); //second degree function pointer typedef
int _cdecl do_something(int arg)
{
return arg+5;
}
void main()
{
struct
{
char unused; //this is for the etext + 1
fptr2 pp_func; //stores a fptr to a fptr
} etext;
fptr1 func = &do_something; //first degree function pointer
etext.pp_func = &func; //second degree function pointer
(*etext.pp_func)(1337); //the actual call and the equivalent of your line
}
一个更真实的例子可能是etext+1存储一个指向函数指针列表的指针。除此之外,我很少看到二级函数指针。