v14 = (int (__cdecl *)(signed int))sub_8048FB6(1);
我被告知这是一个函数指针,但是我不知道它指向的是什么函数。如果有人将我这个绝对模糊的字符串分解成碎片,我将不胜感激。
#1 楼
分配给以下变量的变量:v14 =
将子例程的结果转换为
v14
的类型所需的类型转换:(int (__cdecl *)(signed int))
子例程调用,带有一个参数:
1
:sub_8048FB6(1);
之所以需要类型转换,是因为hexrays不能自动找出该类型的返回类型
sub_8048FB6
是,所以它可能默认为int
,而不是函数指针。现在,类型:
外括号表示类型转换:
调用约定
cdecl
是特定于cpu的,通常在寄存器中有几个参数,其余参数在堆栈上,最后一个参数先推后:(int (__cdecl *)(signed int))
^ ^
它是一个函数指针,由方括号内的
(...*)
表示。 (int (__cdecl *)(signed int))
^^^^^^^
函数返回整数:
(int (__cdecl *)(signed int))
^ ^^
这与在C中声明函数指针相同:
(int (__cdecl *)(signed int))
^^^^^^^^^^^^
如果您想知道返回的是什么函数指针,则必须查看
sub_8048FB6
的内部,以查看它从何处获取返回值。例如,sub_8048FB6
可能看起来像这样:(int (__cdecl *)(signed int))
^^^
在其他地方,返回的函数:
typedef int (*myfunctype)(signed int);
int afunction(signed int arg);
myfunctype fp = afunction;
评论
感谢您的明确答复。我从中了解到,sub_8048FB6(1)调用的返回值实际上提供了函数指针应该指向的函数的地址。函数的某些参数位于堆栈上,而其他参数则可能位于寄存器中,最后确定函数的输入输出类型。我仍然不知道的是,我应该在二进制文件的哪里找到函数的实际代码?
–新手
17年11月3日在20:29
评论
v14如何使用?同时显示两个地方的装配体也许您应该向他提出一个新问题。
@WillemHengeveld好的。我现在就开始。