IDA Pro 的超复杂函数指针定义

逆向工程 艾达 指针
2021-06-23 07:06:17

我最近一直在调试一个二进制文件,然后我开始反编译一个函数。反编译文件的其中一行是:

v14 = (int (__cdecl *)(signed int))sub_8048FB6(1);

有人告诉我这是一个函数指针,但我不知道它指向什么函数。如果有人详细地将这个绝对模糊的字符串分解成碎片,我将不胜感激。

1个回答

分配给的变量:

v14 = 

将子例程的结果转换为以下类型所需的类型转换v14

(int (__cdecl *)(signed int))

子程序调用,带一个参数1::

sub_8048FB6(1);

需要类型转换,因为 hexrays 没有自动确定返回类型sub_8048FB6什么,所以它可能默认为int,而不是函数指针。


现在的类型:

外括号表示类型转换:

(int (__cdecl *)(signed int))
^                           ^

调用约定cdecl是特定于 cpu 的,通常,寄存器中有几个参数,其余在堆栈中,最后一个参数首先压入:

(int (__cdecl *)(signed int))
      ^^^^^^^

它是一个函数指针,用括号表示 (...*)

(int (__cdecl *)(signed int))
     ^        ^^

一个带一个参数的函数,一个有符号整数:

(int (__cdecl *)(signed int))
                ^^^^^^^^^^^^

函数返回一个整数:

(int (__cdecl *)(signed int))
 ^^^

这与在 C 中声明函数指针相同:

typedef  int (*myfunctype)(signed int);
int afunction(signed int arg);
myfunctype  fp = afunction;

如果您想知道返回的是哪个函数指针,则必须查看内部sub_8048FB6,以查看它从何处获取返回值。

例如,sub_8048FB6可能看起来像这样:

(int (__cdecl *)(signed int)) sub_8048FB6(int a1)
{
     switch(a1) {
        case 1:
            return sub_80123456;
        case 2:
            return sub_80456789;
    }
}

在其他地方,返回的函数:

int sub_80123456(signed int)
{
   …
}

int sub_80456789(signed int)
{
   …
}