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

最新文章

  1. git详解
  2. SharePoint 2013 版本功能对比
  3. iOS面试题总结 (二)
  4. Linear Algebra lecture3 note
  5. SWAP空间不足,如何进行添加
  6. context是什么意思
  7. You must install &#39;hg&#39; on your build machine
  8. (转载)Cocos2dx-OpenGL ES 2.0教程:你的第一个三角形(1)
  9. silverlight中DataGrid数据高亮显示
  10. zookeeper 集群 Cannot open channel to X at election address Error contacting service. It is probably not running.
  11. 值得IT运维人员警示的“一件事儿”
  12. Java---软件试用次数(Properties类的简单使用)
  13. noip 2009 细胞分裂
  14. 洛谷-三连击(升级版)-BOSS战-入门综合练习1
  15. AC_CONFIG_HEADER
  16. html js获取URL传参
  17. 百度纯CSS生成菜单
  18. python之魔法方法介绍
  19. es6的解构赋值用途
  20. 廖雪峰Java2面向对象编程-5包和classpath-1包package

热门文章

  1. 【bzoj4293】【PA2015】Siano
  2. 003_循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别
  3. 微信开发,调用js-SDK接口
  4. sendEmail实现邮件报警
  5. [ python ] 全局和局部作用域变量的引用
  6. EnumSet基本用法
  7. ASP.NET Core 上传大文件无法接收的问题
  8. java网络编程三次握手四次挥手
  9. 防范XSS跨站
  10. Oracle数据库(64位) 及 PLSQL(64位)的组合安装【第一篇】