IDA Pro > IDA Pro教程 > 技术问题 > IDA Pro设置功能/项目类型(Set function/item type)

IDA Pro设置功能/项目类型(Set function/item type)

发布时间:2023-04-21 14: 04: 24

Action name:SetType

This command allows you to specify the type of the current item.

If the cursor is located on a name,the type of the named item will be edited.Otherwise,the current function type(if there is a function)or the current item type(if it has a name)will be edited.

The function type must be entered as a C declaration.Hidden arguments(like'this'pointer in C++)should be specified explicitly.IDA will use the type information to comment the disassembly with the information about function arguments.It can also be used by the Hex-Rays decompiler plugin for better decompilation.

Here is an example of a function declaration:

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

To delete a type declaration,please enter an empty string.

IDA supports the user-defined calling convention.In this calling convention,the user can explicitly specify the locations of arguments and the return value.For example:

int __usercall func (int x,int y );

denotes a function with 2 arguments:the first argument is passed on the stack(IDA automatically calculates its offset)and the second argument is passed in the ESI register and the return value is stored in the EBX register.Stack locations can be specified explicitly:

int __usercall runtime_memhash <^12.4>(void*p <^0.4>,int q <^4.4>,int r <^8.4>)

There is a restriction for a __usercall function type:all stack locations should be specified explicitly or all are automatically calculated by IDA.General rules for the user defined prototypes are:

-the return value must be in a register.

Exception:stack locations are accepted for the __golang and __usercall calling conventions.

-if the return type is'void',the return location must not be specified

-if the argument location is not specified,it is assumed to be

on the stack;consequent stack locations are allocated for such arguments

-it is allowed to declare nested declarations,for example:

int**__usercall func16 (int*(__usercall*x)

(int,long ,int) );

Here the pointer"x"is passed in the ESI register;

The pointed function is a usercall function and expects its second

argument in the ECX register,its return value is in the EBX register.

The rule of thumb to apply in such complex cases is to specify the

the registers just before the opening brace for the parameter list.

-registers used for the location names must be valid for the current

processor;some registers are unsupported(if the register name is

generated on the fly,it is unsupported;inform us about such cases;

we might improve the processor module if it is easy)

-register pairs can be specified with a colon like

-for really complicated cases this syntax can be used.

IDA also understands the"__userpurge"calling convention.It is the same thing as __usercall,the only difference is that the callee cleans the stack.

The name used in the declaration is ignored by IDA.

If the default calling convention is __golang then explicit specification of stack offsets is permitted.For example:

int __usercall myfunc<^8>(__int64 arg<^0>);

Function declarations may have the __spoils keyword.It is used to specify the list of registers spoiled by the function.The syntax is the following:

int __spoilsfunc(int x);

If the __spoils keyword is present,the specified list overrides the standard spoiled list.For x86,the standard spoiled list is.The list of spoiled registers may be empty.

IDA also understands some attributes in declarations.For example:

__attribute__((format(printf,2,3)))

int myprnt(int id,const char*format,...);

This declaration means that myprnt is a print-like function;the format string is the second argument and the variadic argument list starts at the third argument.

Below is the full list of attributes that can be handled by IDA.Please look up the details in the corresponding compiler help pages.

packed pack structure/union fields tightly,without gaps

aligned specify the alignment

noreturn declare as not returning function

ms_struct use microsoft layout for the structure/union

format possible formats:printf,scanf,strftime,strfmon

The following additional keywords can be used in type declarations:

_BOOL1 a boolean type with explicit size specification(1 byte)

_BOOL2 a boolean type with explicit size specification(2 bytes)

_BOOL4 a boolean type with explicit size specification(4 bytes)

__int8 a integer with explicit size specification(1 byte)

__int16 a integer with explicit size specification(2 bytes)

__int32 a integer with explicit size specification(4 bytes)

__int64 a integer with explicit size specification(8 bytes)

__int128 a integer with explicit size specification(16 bytes)

_BYTE an unknown type;the only known info is its size:1 byte

_WORD an unknown type;the only known info is its size:2 bytes

_DWORD an unknown type;the only known info is its size:4 bytes

_QWORD an unknown type;the only known info is its size:8 bytes

_OWORD an unknown type;the only known info is its size:16 bytes

_TBYTE 10-byte floating point value

_UNKNOWN no info is available

__pure pure function:always returns the same value and does not

modify memory in a visible way

__noreturn function does not return

__usercall user-defined calling convention;see above

__userpurge user-defined calling convention;see above

__spoils explicit spoiled-reg specification;see above

__hidden hidden function argument;this argument was hidden in the

source code(e.g.'this'argument in c++methods is hidden)

__return_ptr pointer to return value;implies hidden

__struct_ptr was initially a structure value

__array_ptr was initially an array

__unused unused function argument

__cppobj a c++style struct;the struct layout depends on this keyword

__ptr32 explicit pointer size specification(32 bits)

__ptr64 explicit pointer size specification(64 bits)

__shifted shifted pointer declaration

__high high level prototype(does not explicitly specify

hidden arguments like'this',for example)

this keyword may not be specified by the user but

IDA may use it to describe high level prototypes

 

以下为中文翻译

操作名称:SetType

此命令允许您指定当前项的类型。

如果光标位于名称上,则将编辑命名项的类型。否则,将编辑当前函数类型(如果有函数)或当前项类型(如果它有名称)。

函数类型必须以C声明的形式输入。

应显式指定隐藏参数(如C++中的“this”指针)。IDA将使用类型信息用函数参数的信息来注释反汇编。Hex Rays反编译器插件也可以使用它来进行更好的反编译。

下面是函数声明的示例:int main(int argc,const char*argv[]);

要删除类型声明,请输入一个空字符串。

IDA支持用户定义的调用约定。在这个调用约定中,用户可以显式指定参数的位置和返回值。例如:int __usercall func (int x,int y );

表示一个有两个参数的函数:第一个参数在堆栈上传递(IDA自动计算其偏移量),第二个参数在ESI寄存器中传递,返回值存储在EBX寄存器中。可以显式指定堆栈位置:int __usercall runtime_memhash <^12.4>(void*p <^0.4>,int q <^4.4>,int r <^8.4>)_

_usercall有限制函数类型:所有堆栈位置都

应该明确指定,或者由IDA自动计算。用户定义原型的一般规则是:-返回值必须在寄存器中。异常:__golang和__usercall调用约定接受堆栈位置。

-如果返回类型为“void”,则不得指定返回位置

-如果未指定参数位置,则假定它

在堆栈上;结果堆栈位置被分配给这样的参数

-允许声明嵌套声明,例如:int**__usercall func16 (int*(__usercall*x)

(int,long ,int) );

在这里,指针“x”是在ESI寄存器中传递的;指向函数是一个用户调用函数

,它的第二个参数在ECX寄存器中,它的返回值在EBX寄存器中。在这种复杂的情况下,经验法则是在参数列表的左大括号之前指定寄存器

用于位置名称的寄存器必须对当前处理器有效;有些寄存器不受支持(如果寄存器名是动态生成的,则不受支持;请告知我们此类情况;如果很容易,我们可能会改进处理器模块)

-寄存器对可以用类似于的冒号指定

-对于非常复杂的情况,可以使用此语法。

IDA还理解“__userpurge”调用约定。它

与__usercall相同,唯一的区别是

被调用者清理

堆栈。IDA忽略声明中使用的名称。

如果默认调用约定是__golang,则

允许显式指定堆栈偏移量。例如:int __usercall myfunc<^8>(__int64 arg<^0>);

函数声明可能包含__proports关键字。它用于指定被函数破坏的寄存器列表。语法如下:int __prets<eax,bh>func(int x);

如果存在__destroys关键字,则指定的列表将覆盖标准

损坏的列表。对于x86,标准的损坏列表是

损坏寄存器的列表可能是空的。

IDA也理解声明中的一些属性。例如:__attribute__((format(printf,2,3)))int myprnt(int id,const char*format,…);

这个声明意味着myprnt是一个类似打印的函数;

formatstring是第二个参数,可变

参数列表从第三个参数开始。下面是IDA可以处理的属性的完整列表。请在相应的编译器帮助页中查找详细信息。压缩包结构/联合字段紧密,没有对齐的间隙指定对齐noreturn声明为不返回函数

ms_struct使用microsoft布局进行结构/联合

格式可能的格式:printf,scanf,strftime,strfmon

以下附加关键字可用于类型声明:_BOOL1具有显式大小规范的布尔类型(1字节)

_BOOL2具有显式尺寸规范的布尔型

(2字节具有显式大小规范(2个字节)__int32具有显式尺寸规范(4个字节)的整数__int64具有显式长度规范(8个字节)__ int128具有显式宽度规范(16个字节)_BYTE为未知类型;唯一已知的信息是其大小:1字节_WORD是未知类型;唯一已知的信息是它的大小:2字节_DWORD是未知类型;唯一已知的信息是它的大小:4字节_QWORD是未知类型;唯一已知的信息是它的大小:8字节

_OWORD是未知类型;唯一已知的信息是它的大小:16字节_TBYTE 10字节浮点值_UNKNOWN没有可用的信息__pure纯函数:总是返回相同的值,并且不以

可见的方式修改内存__noreturn函数不返回

__usercall用户定义的调用约定;参见上面的

__userpurge用户定义调用约定;见上文

__destroys显式损坏的reg规范;请参阅上面的__hidden隐藏函数参数;此参数隐藏在

源代码中(例如,c++方法中的“this”参数隐藏)

__return_ptr指向返回值的指针;暗示隐藏的

__struct_ptr最初是一个结构值

__array_ptr初始是一个数组

__未使用的未使用函数参数

__cppobj是一个c++风格的结构;结构布局依赖于此关键字

__ptr32显式指针大小规范(32位)__ptr64显式指针尺寸规范(64位)__shifted shifted pointer declaration

__high high level prototype(

例如,不显式指定像“this”这样的隐藏参数)此关键字可能不是由用户,但IDA可以使用它来描述高级原型

展开阅读全文

标签:idaida反汇编工具

读者也访问过这里:
邀请您进入交流群 点击扫码
400-8765-888 kefu@makeding.com

专业销售为您服务

欢迎添加好友,了解更多IDA优惠信息,领逆向工程学习资料礼包1份!
热门文章
exe反编译工具哪个好?反编译能力强的工具盘点
随着软件技术的发展,exe(可执行文件)已经成为了电脑、手机等多个平台上的主要软件运行格式,而对于exe文件的反编译也成为了逆向工程中不可缺少的一个步骤。本文将介绍一些常用的exe反编译工具,并评价其优缺点,帮助读者选择合适的工具。
2023-04-12
idapro怎么改为中文
IDA Pro是一款功能强大的反汇编和反编译工具,广泛应用于逆向工程和软件开发领域。在使用IDA Pro时,如果我们不习惯英文界面,可以将其改为中文界面。本文将介绍IDA Pro怎么改为中文界面。IDA Pro界面改成中文主要有两种方法,下面是详细介绍。
2023-04-19
c++反编译工具有哪些
反编译C++代码的工具一般是针对可执行文件和库文件的反汇编和逆向分析工具。本文将给大家介绍c++反编译工具有哪些的内容。市面说的c++反编译工具有很多,下面介绍几款使用认识较多的软件。
2023-04-23
ida怎么查找字符串 ida字符串窗口快捷键
在数字化时代,逆向工程作为解密软件和分析程序的关键技术,正日益受到广泛关注。在逆向分析的过程中,IDA(Interactive DisAssembler)是一款备受推崇的工具,它为逆向工程师们提供了强大的功能和灵活的操作。本文将带您深入探讨如何在IDA中查找字符串,优化字符串窗口的使用,并探讨IDA如何将变量转换成字符串,帮助您更加熟练地驾驭这一工具,为逆向分析的世界增添一抹精彩。
2023-09-27
ida如何转伪代码 ida伪代码怎么看
IDA Pro是一款常用的反汇编和反编译工具,可以帮助我们分析二进制文件的实现细节和执行过程,以便更好地理解程序的执行过程和逻辑。在进行逆向工程的过程中,我们经常需要将反汇编结果转换为伪代码,以便更好地进行分析和修改。本文将介绍如何使用IDA Pro转换为伪代码,并简单讲解ida伪代码怎么看。
2023-04-14
最新文章
IDA Pro调试dll该怎么开始 IDA Pro调试dll加载时机怎么判断
在IDA里调DLL,最容易走偏的一点,是把“打开DLL文件”和“调试DLL”当成一回事。按Hex-Rays官方文档的口径,IDA支持调试Windows应用和DLL,也支持附加到已经在运行的进程;调试前还需要在【Debugger】里的【Process options...】配置Application、Directory和Input file这几个路径。与此同时,调试期里还有专门的【Module list】窗口,用来显示当前进程已经加载的所有模块。也就是说,调DLL的核心不是单独把DLL跑起来,而是先找到会加载它的宿主进程,再让IDA把“当前IDB对应的模块”和“运行中的模块实例”对上。
2026-05-14
IDA Pro调试exe时从哪下手 IDA Pro调试exe入口点怎么确认
在合法授权的自有样本上用IDA Pro调试exe时,最容易走偏的地方,不是不会下断点,而是一开始就扎进某个复杂函数里,结果入口、线程、模块加载顺序都没看清。按Hex-Rays官方文档,比较稳的起手方式是先选对调试器,再在Debugger options里把启动时的暂停点设好,然后从入口点、函数视图、字符串和交叉引用这几层往下看,而不是一上来就满工程乱翻。
2026-05-14
IDA Pro调试器连不上目标怎么办 IDA Pro调试器类型应该怎么选
很多人用IDA Pro动态调试时,表面上看问题是“连不上”,真正根子往往有两层。一层是调试链路根本没配通,比如远程调试服务器没启动、主机地址没填、路径写成了本机路径、端口或防火墙没放行;另一层是调试器类型一开始就选错了,比如明明是gdbserver目标,却还在用本地Windows或Linux调试器。Hex-Rays官方文档把这件事分得很清楚,IDA需要先在【Debugger】【Select debugger】里选对调试器,再到【Debugger options】或【Process options】里补齐连接细节。
2026-05-11
IDA Pro动态调试教程怎么看 IDA Pro动态调试教程断点该下在哪里
很多人学IDA Pro动态调试,最容易走偏的地方不是不会点菜单,而是把“看教程”和“下断点”分成了两件互不相干的事。Hex-Rays官方教程其实已经把主线给出来了,先选调试器,再加断点,再启动进程,然后单步、看寄存器、看内存、看调用关系;而断点放得准不准,直接决定你后面看到的是关键状态,还是一堆无效停顿。官方文档也明确说明,IDA支持本地和远程调试,支持软件断点、硬件断点和页断点,而且这些断点的触发时机和适用场景并不一样。
2026-05-11
IDA Pro逆向教程适合新手吗 IDA Pro逆向教程先练哪些样本
从Hex-Rays官方资料来看,IDA的确是可以给新手入门用的,而且官方文档本身就专门做了【Getting Started】和【Basic Usage】这类内容,明确写着“New to IDA”以及“disassemble your first binary file”。官方甚至直接提醒,加载文件时对新手来说,先接受默认loader和processor type往往是一个好策略。也就是说,IDA不是只能给老手用,但它更适合“刚开始学逆向、愿意从小样本一步步练”的新手,而不适合一上来就拿复杂系统级样本硬啃。
2026-05-11
IDA Pro使用教程先学什么 IDA Pro使用教程练习顺序怎么安排
很多人一开始学IDA Pro,最容易走偏的地方,不是软件太难,而是上来就想学插件、脚本、调试和反编译细节,结果基础导航和阅读能力没打稳。按Hex-Rays当前官方资料,给新手的起步路径其实很明确,先从Basic Usage和界面基础开始,先熟悉反汇编窗口、函数视图和伪代码窗口这几块最常用区域,再继续学交叉引用、字符串、类型和调试。官方最近的Starter培训说明也强调,新手阶段更适合先掌握structured、practical的基础工作流,而不是一开始就追高级主题。
2026-05-11

通过微信咨询我们

欢迎添加好友,了解更多IDA优惠信息,领取逆向工程学习资料礼包1份!

读者也喜欢这些内容: