位置:首页 > 应用软件 > IDA Pro设置功能/项目类型(Set function/item type)

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

时间:2026-10-29  |  作者:深海捕梦者  |  阅读:0

IDA Pro中的设置功能/项目类型(Set function/item type)该如何操作?如果各位同学对此仍有疑惑,不妨跟随小编一起来详细了解一下,为您梳理解决思路!

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

若光标位于某个标识符上,系统将进入该命名项类型的编辑界面;否则将默认编辑当前所在函数的类型(若存在函数),或带有名称的当前项类型。

函数类型需严格遵循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。面对如此复杂的声明,通用技巧是将

寄存器标注紧跟在参数列表的大括号前。

- 声明所用的寄存器须符合当前CPU指令集规范,部分动态生成的名称可能无效(如遇此类报错请及时反馈,以便团队评估后优化处理器核心库)。

- 寄存器对可通过冒号组合,格式参照。

- 遇极端复杂场景时,建议直接套用此语法格式。

IDA内置了“__userpurge”调用约定。该约定

整体机制同__usercall,唯一差异在于

函数执行完毕后由被调用方主动回收

堆栈空间。此外,IDA会直接忽略声明文本中填写的函数名。

若环境默认调用约定设为__golang,

则允许手动写入堆栈偏移值。演示代码如下:

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

函数声明允许附加__spoils关键字,旨在罗列该函数执行后将被覆盖的寄存器清单。语法范式如下:

int __spoils func(int x);

一旦加入__spoils关键字,其声明的清单将取代默认的覆盖表。针对x86架构,

默认覆盖表通常包含三个寄存器。

若函数不改动任何寄存器,该列表置空即可。

IDA同样能够识别声明内的附加属性修饰符。例如:

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

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

此举告知系统,myprnt属于打印类函数;

其中的format是第二个参数,可变参数组

将从第三个参数起展开。下文罗列了IDA全面支持的属性清单,详细参数说明请参考配套编译器手册。

packed:使结构体/联合体字段紧密靠拢,剔除间隙。

aligned:配置数据对齐策略。

noreturn:标识永不返回的函数。

ms_struct:调用微软规范排版结构体或联合体。

format:涵盖的格式化类型有printf、scanf、strftime及strfmon。

拓展至类型声明阶段,下列关键字同样适用:

_BOOL1代表固定1字节精度的布尔型。

_BOOL2代表固定2字节精度的布尔型。

_BOOL4代表固定4字节精度的布尔型。

__int8代表固定1字节精度的整型。

__int16代表固定2字节精度的整型。

__int32代表固定4字节精度的整型。

__int64代表固定8字节精度的整型。

__int128代表固定16字节精度的整型。

_BYTE为未知具体含义的类型,仅知占用1字节。

_WORD为未知具体含义的类型,仅知占用2字节。

_DWORD为未知具体含义的类型,仅知占用4字节。

_QWORD为未知具体含义的类型,仅知占用8字节。

_OWORD为未知具体含义的类型,仅知占用16字节。

_TBYTE:占10字节的双精度浮点值。

_UNKNOWN:完全未知的类型。

__pure:纯函数标记,表示该函数始终返回相同结果,且

不会对外部可见内存产生任何修改。

__noreturn:标记函数为永不返回状态。

__usercall:自定义调用约定(详见上文)。

__userpurge:自定义调用约定(详见上文)。

__spoils:显式声明会被覆盖的寄存器(详见上文)。

__hidden:隐藏参数标记,指代源码中被隐去的

形参(例如C++类方法中隐式的“this”指针)。

__return_ptr:指向返回值的指针,隐含隐藏特性。

__struct_ptr:原本为结构体类型的参数。

__array_ptr:原本为数组类型的参数。

__unused:未实际使用的函数参数。

__cppobj:遵循C++风格的结构体定义,其内存排布依赖此关键字。

__ptr32:显式声明指针长度为32位。

__ptr64:显式声明指针长度为64位。

__shifted:位移指针声明。

__high:高层级原型声明(不强制显式写出

例如“this”等隐藏参数)。

注:用户不可手动指定此关键字,但

IDA内部可能会利用它来辅助描述高级别原型。

以下为对应中文说明:

命令名称: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。面对如此复杂的声明,通用技巧是将

寄存器标注紧跟在参数列表的大括号前。

声明所用的寄存器须符合当前CPU指令集规范,部分动态生成的名称可能无效(如遇此类报错请及时反馈,以便团队评估后优化处理器核心库)。

- 寄存器对可通过冒号组合,格式参照。

- 遇极端复杂场景时,建议直接套用此语法格式。

IDA内置了“__userpurge”调用约定。该约定

整体机制同__usercall,唯一差异在于

函数执行完毕后由被调用方主动回收

堆栈空间。此外,IDA会直接忽略声明文本中填写的函数名。

若环境默认调用约定设为__golang,

则允许手动写入堆栈偏移值。演示代码如下:int __usercall myfunc<^8>(__int64 arg<^0>);

函数声明允许附加__spoils关键字,旨在罗列该函数执行后将被覆盖的寄存器清单。语法范式如下:int __spoils func(int x);

一旦加入__spoils关键字,其声明的清单将取代默认的覆盖表。针对x86架构,

默认覆盖表通常包含三个寄存器。

若函数不改动任何寄存器,该列表置空即可。

IDA同样能够识别声明内的附加属性修饰符。例如:

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

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

此举告知系统,myprnt属于打印类函数;

其中的format是第二个参数,可变参数组

将从第三个参数起展开。下文罗列了IDA全面支持的属性清单,详细参数说明请参考配套编译器手册。packed:使结构体/联合体字段紧密靠拢,剔除间隙。aligned:配置数据对齐策略。noreturn:标识永不返回的函数。

ms_struct:调用微软规范排版结构体或联合体。

format:涵盖的格式化类型有printf、scanf、strftime及strfmon。

拓展至类型声明阶段,下列关键字同样适用:_BOOL1代表固定1字节精度的布尔型。

_BOOL2代表固定2字节精度的布尔型。

_BOOL4代表固定4字节精度的布尔型。

__int8代表固定1字节精度的整型。

__int16代表固定2字节精度的整型。

__int32代表固定4字节精度的整型。

__int64代表固定8字节精度的整型。

__int128代表固定16字节精度的整型。

_BYTE为未知具体含义的类型,仅知占用1字节。

_WORD为未知具体含义的类型,仅知占用2字节。

_DWORD为未知具体含义的类型,仅知占用4字节。

_QWORD为未知具体含义的类型,仅知占用8字节。

_OWORD为未知具体含义的类型,仅知占用16字节。

_TBYTE:占10字节的双精度浮点值。

_UNKNOWN:完全未知的类型。

__pure:纯函数标记,表示该函数始终返回相同结果,且

不会对外部可见内存产生任何修改。

__noreturn:标记函数为永不返回状态。

__usercall:自定义调用约定(详见上文)。

__userpurge:自定义调用约定(详见上文)。

__spoils:显式声明会被覆盖的寄存器(详见上文)。

__hidden:隐藏参数标记,指代源码中被隐去的

形参(例如C++类方法中隐式的“this”指针)。

__return_ptr:指向返回值的指针,隐含隐藏特性。

__struct_ptr:原本为结构体类型的参数。

__array_ptr:原本为数组类型的参数。

__unused:未实际使用的函数参数。

__cppobj:遵循C++风格的结构体定义,其内存排布依赖此关键字。

__ptr32:显式声明指针长度为32位。

__ptr64:显式声明指针长度为64位。

__shifted:位移指针声明。

__high:高层级原型声明(不强制显式写出

以上便是小编为您整理的IDA Pro设置功能/项目类型(Set function/item type)详解,更多实用教程欢迎持续关注收藏!

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多