十六进制射线输出中的一条难以理解的线

逆向工程 六线谱
2021-06-22 11:00:41
v5 = (*(int (__cdecl **)(int))((char *)&etext + 1))(a1);

请向我解释这一行是什么意思(如果可能,请写出它是从(语言 - c)编译的)

1个回答

它只是通过函数指针进行的复杂函数调用。

(*(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存储一个指向函数指针列表的指针。除此之外,我很少看到二级函数指针。