我最近一直在调试一个二进制文件,然后我开始反编译一个函数。反编译文件的其中一行是:
v14 = (int (__cdecl *)(signed int))sub_8048FB6(1);
有人告诉我这是一个函数指针,但我不知道它指向什么函数。如果有人详细地将这个绝对模糊的字符串分解成碎片,我将不胜感激。
我最近一直在调试一个二进制文件,然后我开始反编译一个函数。反编译文件的其中一行是:
v14 = (int (__cdecl *)(signed int))sub_8048FB6(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)
{
…
}