IDA设置函数类型

http://www.2cto.com/shouce/ida/1361.htm

 

Action name: SetType

该命令允许你指定当前条目类型。

如果光标处在函数内部,那么函数类型将会被编辑,否则当前条目的类型将被编辑。在这种情况下当前条目必须有一个名字。

函数类型必须按照C定义输入。IDA将会使用类型信息改进反汇编。

这里是一个函数定义的例子:

        int main(int argc, const char *argv[]);

为了删除类型定义,请输入空字符串。

IDA支持用户定义的调用规则。在调用规则中用户可以显式指定参数位置和返回值。例如:

        int __usercall func<ebx>(int x, int y<esi>);

表示函数有两个参数:第一个参数传递给堆栈,第二个参数传递给ESI寄存器并且返回值保存在EBX寄存器中。对于用户定义原型通常的规则是:

  - 返回值必须在寄存器中。
  - 如果返回类型是"void",返回位置不能指定。
  - 如果参数位置没有指定,那么就默认在堆栈上。堆栈位置随之分配。
  - 当前IDA不能检查寄存器大小,但是推荐指定正确的寄存器大小(例如,对于字符类型使用AL寄存器)
  - 允许使用嵌套定义例如:
    int **__usercall func16<eax>(int *(__usercall *x)<ebx>
                                (int, long<ecx>, int)<esi>);
在这里指针 "x" 被传递给ESI寄存器; 指向的函数是一个用户定义调用类型的函数,第二个参数为ECX寄存器,返回值在EBX寄存器中。 这样复杂的规则,应用在打开参数列表时指定寄存器这种情况下。
  
   - 寄存器作为位置名时必须对当前处理器有效。一些寄存器不被支持(如果一些寄存器名
     不被支持请通知我们。如果可行我们会改进寄存器模型。
  - 通过 <edx:eax>这样的克隆可以指定寄存器对。

IDA 同样可以理解 "__userpurge" 调用方式。这种方式同 __usercall一致, 唯一不同的是这种调用会清空堆栈。

用户定义的名称将被IDA忽略。

函数定义可以使用__spoils关键词。该选项用于指定被函数破坏的寄存器列表。语法如下:

   int __spoils<eax, bh> func(int x);

如果使用__spoils关键词,指定的列表将覆盖标准的破坏列表。对于X86,标准的破坏列表是<eax, edx, ecx>。破坏列表可以为空。

 

http://zhiwei.li/text/2010/01/ida%E8%AE%BE%E7%BD%AE%E5%87%BD%E6%95%B0%E7%B1%BB%E5%9E%8B/

 

在函数定义处单击右键,使用“设置函数类型(set function type)”功能, (或者 使用快捷键 “Y”)来编辑函数定义(采用C declaration),这样所有调用到这个函数的地方都会在入栈的参数后面加上其对应的变量注释。

如果有RTTI, 似乎是按照C++的mangle来
函数类型必须按照C定义输入。IDA将会使用类型信息改进反汇编。

IDA支持用户定义的调用规则。在调用规则中用户可以显式指定参数位置和返回值。例如:
int __usercall func(int x, int y);
表示函数有两个参数:第一个参数传递给堆栈,第二个参数传递给ESI寄存器并且返回值保存在EBX寄存器中。对于用户定义原型通常的规则是:
1)返回值必须在寄存器中。
2)如果返回类型是”void”,返回位置不能指定。
3)如果参数位置没有指定,那么就默认在堆栈上。堆栈位置随之分配。
4) 当前IDA不能检查寄存器大小,但是推荐指定正确的寄存器大小(例如,对于字符类型使用AL寄存器)
5) 允许使用嵌套定义例如:
int **__usercall func16(int *(__usercall *x)
(int, long, int));
在这里指针 “x” 被传递给ESI寄存器;
指向的函数是一个用户定义调用类型的函数,第二个参数为ECX寄存器,返回值在EBX寄存器中。

这样复杂的规则,应用在打开参数列表时指定寄存器这种情况下。
6) 寄存器作为位置名时必须对当前处理器有效。一些寄存器不被支持(如果一些寄存器名不被支持请通知我们。如果可行我们会改进寄存器模型。
7) 通过 这样的克隆可以指定寄存器对。

IDA 同样可以理解 “__userpurge” 调用方式。这种方式同 __usercall一致, 唯一不同的是这种调用会清空堆栈。 用户定义的名称将被IDA忽略。

函数定义可以使用__spoils关键词。该选项用于指定被函数破坏的寄存器列表。语法如下:
int __spoils func(int x);
如果使用__spoils关键词,指定的列表将覆盖标准的破坏列表。对于X86,标准的破坏列表是。破坏列表可以为空。

 

posted @ 2013-09-25 21:20  IAmAProgrammer  阅读(2892)  评论(0编辑  收藏  举报