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,标准的破坏列表是。破坏列表可以为空。

IDA设置函数类型的更多相关文章

  1. R语言环境变量的设置 环境设置函数为options()

    环境设置函数为options(),用options()命令可以设置一些环境变量,使用help(options)可以查看详细的参数信息. 1. 数字位数的设置,options(digits=n),n一般 ...

  2. php设置文件类型content-type

    在PHP中可以通过header函数来发送头信息,还可以设置文件的content-type,下面整理了一些常见文件类型对于的content-type值. //date 2015-06-22//定义编码h ...

  3. TypeScript入门三:TypeScript函数类型

    TypeScript函数类型 TypeScript函数的参数 TypeScript函数的this与箭头函数 TypeScript函数重载 一.TypeScript函数类型 在上一篇博客中已经对声明Ty ...

  4. 明显调用的表达式前的括号必须具有(指针)函数类型 编译器错误 C2064

    看到“明显调用的表达式前的括号必须具有(指针)函数类型”这句时我才发现我的语文水平有多烂,怎么看都看不懂,折腾了半天才知道是哪里出了问题. 举个简单的例子 class CTest { void (CT ...

  5. DELPHI设置枚举类型size

    delphi枚举类型长度默认为2个字节(单字),而在C中枚举为4个字节(双字),如果需要跨这两个平台编程,传输结构时会由于数据长度不一造成灾难. 经过查找资料,原来delphi可以通过{$Z+} {$ ...

  6. Swift - 33 - 返回函数类型和函数嵌套

    //: Playground - noun: a place where people can play import UIKit /*---------------------------返回函数类 ...

  7. Swift - 32 - 函数类型

    //: Playground - noun: a place where people can play import UIKit func add(a:Int, b:Int) -> Int { ...

  8. C语言的函数类型

    C语言的函数类型与返回值类型不一致时出现,是以函数类型为标准; 而如果在java与c#语言中上述情况是编译错误的;

  9. 智能合约语言 Solidity 教程系列3 - 函数类型

    Solidity 教程系列第三篇 - Solidity 函数类型介绍. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以 ...

随机推荐

  1. No manual entry for pthread_mutex_init .

    $manpthread_mutex_init No manual entryfor pthread_mutex_init 解决方案: $sudo apt-get install manpages-po ...

  2. SNMP AGENT函数介绍

    http://wenku.baidu.com/view/6a7903a9d1f34693daef3e9f.html 一.  SNMP AGENT在SNMP框架中的位置 1.1 SNMP是被广泛接受并投 ...

  3. 【前端笔记】浅谈js继承

    我们先想想我们用js最后要怎样实现面向对象的编程.事实上我们必须用上原型链这种东西. 我们的父类superType有属性和方法,并且一些能被子类subType继承,一些能被覆盖,但是丝毫不会影响到父类 ...

  4. IEEEXtreme 9.0 - Digit Fun!

    博客中的文章均为 meelo 原创,请务必以链接形式注明 本文地址 Xtreme 9.0 - Digit Fun! 题目来源:第9届IEEE极限编程大赛第1题 Recurrence relations ...

  5. Web APi入门之Self-Host(二)

    这篇来讲讲WebApi的自托管,WebApi可以托管到控制台/winform/服务上,并不是一定要依赖IIS才行. 1.首先新建控制台项目,在通过Nuget搜索Microsoft.AspNet.Web ...

  6. js的浮点(小数)数+-*/

    //除法 function accDiv(arg1,arg2){ var t1=0,t2=0,r1,r2; try{t1=arg1.toString().split(".")[1] ...

  7. BFS迷宫搜索路径

    #include<graphics.h> #include<stdlib.h> #include<conio.h> #include<time.h> # ...

  8. linux网络管理----网络命令

    1 Linux网络命令之网络环境查看命令  ifconfig  2 Linux网络命令之网络测试命令  telnet 基本已经被ssh替代了,telnet是明文传递,不安全

  9. 洛谷P1149 火柴棒等式

    题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1.加号与等号 ...

  10. [BZOJ4817][SDOI2017]树点涂色(LCT+DFS序线段树)

    4817: [Sdoi2017]树点涂色 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 692  Solved: 408[Submit][Status ...