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


1

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

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

有人告诉我,这是一个函数指针,但我不知道什么功能,有指向。如果有人把这个绝对模糊的字符串分解为细节,我会很感激。

  0

是如何被使用V14?同时在两个地方同时显示程序集 03 11月. 172017-11-03 11:06:37

  0

也许你应该用他的问题开始一个新的问题。 05 11月. 172017-11-05 12:31:02

  0

@WillemHengeveld好的。我现在就会。 05 11月. 172017-11-05 19:26:17

6

变量被分配给:

v14 = 

将结果转换的子程序来的v14类型所需要的类型转换:

(int (__cdecl *)(signed int)) 

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

sub_8048FB6(1); 

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


现在类型:

外括号表示一个类型转换:

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

调用约定cdecl取决于具体的CPU,通常,在寄存器中几个参数,剩下的就堆栈,最后一个参数先推:

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

这是一个func重刑指针,由括号(...*)

(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_8; 
     case 2: 
      return sub_80456789; 
    } 
} 

和其他地方返回的功能:

int sub_8(signed int) 
{ 
    … 
} 

int sub_80456789(signed int) 
{ 
    … 
} 
  0

感谢您的明确回应。我从中理解的是,sub_8048FB6(1)调用的返回值实际上提供了函数指针应该指向的函数的地址。某些函数的参数位于堆栈上,而其他函数的参数可能位于寄存器中,最后确定该函数的输入输出类型。我仍然不知道在二进制文件中,我应该找到函数的实际代码? 03 11月. 172017-11-03 20:29:50