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,标准的破坏列表是。破坏列表可以为空。
IDA设置函数类型的更多相关文章
- R语言环境变量的设置 环境设置函数为options()
环境设置函数为options(),用options()命令可以设置一些环境变量,使用help(options)可以查看详细的参数信息. 1. 数字位数的设置,options(digits=n),n一般 ...
- php设置文件类型content-type
在PHP中可以通过header函数来发送头信息,还可以设置文件的content-type,下面整理了一些常见文件类型对于的content-type值. //date 2015-06-22//定义编码h ...
- TypeScript入门三:TypeScript函数类型
TypeScript函数类型 TypeScript函数的参数 TypeScript函数的this与箭头函数 TypeScript函数重载 一.TypeScript函数类型 在上一篇博客中已经对声明Ty ...
- 明显调用的表达式前的括号必须具有(指针)函数类型 编译器错误 C2064
看到“明显调用的表达式前的括号必须具有(指针)函数类型”这句时我才发现我的语文水平有多烂,怎么看都看不懂,折腾了半天才知道是哪里出了问题. 举个简单的例子 class CTest { void (CT ...
- DELPHI设置枚举类型size
delphi枚举类型长度默认为2个字节(单字),而在C中枚举为4个字节(双字),如果需要跨这两个平台编程,传输结构时会由于数据长度不一造成灾难. 经过查找资料,原来delphi可以通过{$Z+} {$ ...
- Swift - 33 - 返回函数类型和函数嵌套
//: Playground - noun: a place where people can play import UIKit /*---------------------------返回函数类 ...
- Swift - 32 - 函数类型
//: Playground - noun: a place where people can play import UIKit func add(a:Int, b:Int) -> Int { ...
- C语言的函数类型
C语言的函数类型与返回值类型不一致时出现,是以函数类型为标准; 而如果在java与c#语言中上述情况是编译错误的;
- 智能合约语言 Solidity 教程系列3 - 函数类型
Solidity 教程系列第三篇 - Solidity 函数类型介绍. 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以 ...
随机推荐
- python3.X和python2.7的区别
1.python3.X将thread模块修改为_thread
- ASP.NET中的状态保持
1.ASP.NET中的状态保持解决方案 2.常用的状态报保持方式 view state ASP.Net的.aspx页面特有,页面级的,就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式(b ...
- python基础(10)--模块
模块(module) 模块,用一坨代码实现了某个功能的代码集合 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来 ...
- PHP安全编程:register_globals的安全性
如果你还能记起早期Web应用开发中使用C开发CGI程序的话,一定会对繁琐的表单处理深有体会.当PHP的register_globals配置选项打开时,复杂的原始表单处理不复存在,公用变量会自动建立.它 ...
- apache、nginx、php、mysql 编译参数查询
nginx编译参数查看:/usr/local/nginx/sbin/nginx -V apache编译参数查看:cat /usr/local/apache2/build/config.nice mys ...
- JS函数学习
=============数学函数========== 1.Math.random()为取随机数0~1之间的:0可以取到,1取不到 alert(Math.random()); 2.Math.PI为3. ...
- day3 作业
文件操作用户很广泛,我们经常对文件进行操作: global log 127.0.0.1 local2 daemon maxconn log 127.0.0.1 local2 info defaults ...
- Linux下文件特殊权限
SUIDSUID表示在所有者的位置上出现了s在一个命令的所有者的权限上如果出现了s,当其他人在执行该命令的时候将具有所有者的权限.SUID权限仅对二进制文件有效 SGID表示在组的位置上出现了s如果一 ...
- 06 java 基础:java 循环 递归
1 递归实现 1 + 2 +3 +4 +5 + .... +100 public static int addSum(int num){ if(num == 1) return 1; return n ...
- Dockerfile 备份
dotnet core app FROM microsoft/dotnet:1.1.0-runtime WORKDIR /mvcApp COPY ./out . ENTRYPOINT ["d ...