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

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


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

评论

v14如何使用?同时显示两个地方的装配体

也许您应该向他提出一个新问题。

@WillemHengeveld好的。我现在就开始。

#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