IDA Pro设置功能/项目类型(Set function/item type)
时间:2026-10-29 | 作者:深海捕梦者 | 阅读:0IDA Pro中的设置功能/项目类型(Set function/item type)该如何操作?如果各位同学对此仍有疑惑,不妨跟随小编一起来详细了解一下,为您梳理解决思路!
此命令允许您为当前项指定具体的类型。
若光标位于某个标识符上,系统将进入该命名项类型的编辑界面;否则将默认编辑当前所在函数的类型(若存在函数),或带有名称的当前项类型。
函数类型需严格遵循C语言声明语法录入。隐藏参数(例如C++中的“this”指针)必须显式补充。IDA会依据此类信息在反汇编窗口自动添加关于函数参数的注释,同时Hex-Rays反编译插件也能调用该数据以获得更优的反编译效果。
以下为函数声明示例:
int main(int argc, const char* argv[]);
如需清除已设类型,直接输入空字符串即可。
IDA兼容用户自定义调用约定,允许手动指定参数传递位置与返回值去向。示例如下:
int __usercall func
上述代码定义了一个双参函数:首参走堆栈(偏移由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, long
此处表明指针“x”经由ESI寄存器传入;
被指向的目标函数属于用户调用类型,
要求其第二参数传入ECX,返回值存于EBX。面对如此复杂的声明,通用技巧是将
寄存器标注紧跟在参数列表的大括号前。
- 声明所用的寄存器须符合当前CPU指令集规范,部分动态生成的名称可能无效(如遇此类报错请及时反馈,以便团队评估后优化处理器核心库)。
- 寄存器对可通过冒号组合,格式参照
- 遇极端复杂场景时,建议直接套用此语法格式。
IDA内置了“__userpurge”调用约定。该约定
整体机制同__usercall,唯一差异在于
函数执行完毕后由被调用方主动回收
堆栈空间。此外,IDA会直接忽略声明文本中填写的函数名。
若环境默认调用约定设为__golang,
则允许手动写入堆栈偏移值。演示代码如下:
int __usercall myfunc<^8>(__int64 arg<^0>);
函数声明允许附加__spoils关键字,旨在罗列该函数执行后将被覆盖的寄存器清单。语法范式如下:
int __spoils
一旦加入__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
上述代码定义了一个双参函数:首参走堆栈(偏移由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, long
此处表明指针“x”经由ESI寄存器传入;被指向的目标函数属于用户调用类型,
要求其第二参数传入ECX,返回值存于EBX。面对如此复杂的声明,通用技巧是将
寄存器标注紧跟在参数列表的大括号前。
声明所用的寄存器须符合当前CPU指令集规范,部分动态生成的名称可能无效(如遇此类报错请及时反馈,以便团队评估后优化处理器核心库)。
- 寄存器对可通过冒号组合,格式参照
- 遇极端复杂场景时,建议直接套用此语法格式。
IDA内置了“__userpurge”调用约定。该约定
整体机制同__usercall,唯一差异在于
函数执行完毕后由被调用方主动回收
堆栈空间。此外,IDA会直接忽略声明文本中填写的函数名。
若环境默认调用约定设为__golang,
则允许手动写入堆栈偏移值。演示代码如下:int __usercall myfunc<^8>(__int64 arg<^0>);
函数声明允许附加__spoils关键字,旨在罗列该函数执行后将被覆盖的寄存器清单。语法范式如下:int __spoils
一旦加入__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)详解,更多实用教程欢迎持续关注收藏!
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- IDA配置java环境怎么设置 IDA配置java环境后反编译仍报错怎么排查
- 时间:2026-10-29
-
- IDA Pro导出二进制轨迹(Export binary trace)
- 时间:2026-10-29
-
- IDA Pro调试android为什么总连不上设备 IDA Pro调试android时环境配置该核对哪些项
- 时间:2026-10-29
-
- IDA Pro怎么设置中文界面 IDA Pro中文设置后部分界面仍为英文如何解决
- 时间:2026-10-29
-
- 二进制代码反编译工具有哪些 二进制代码反编译教程
- 时间:2026-10-29
-
- IDA逆向BIN文件时如何识别函数边界 IDA逆向BIN文件时交叉引用缺失怎么办
- 时间:2026-10-29
-
- IDA Pro动态调试DLL怎么捕获模块加载 IDA Pro模块加载后断点没有触发是什么原因
- 时间:2026-10-29
-
- ida怎么查找字符串 ida字符串窗口快捷键
- 时间:2026-10-29
精选合集
更多大家都在玩
热门话题
大家都在看
更多-
- GraphPad折线图怎么加误差线 GraphPad折线图误差线不显示怎么解决
- 时间:2026-10-29
-
- 配对t检验的适用条件 配对t检验spss步骤
- 时间:2026-10-29
-
- Foxit eSign签合同有法律效力吗 Foxit eSign电子合同怎么打印出来
- 时间:2026-10-29
-
- hyperDENT怎么分析材料的化学属性 hyperDENT如何根据材料的属性优化修复体的质量
- 时间:2026-10-29
-
- SPSS成分矩阵怎么看 SPSS成分矩阵怎么确定有几个成分
- 时间:2026-10-29
-
- Mac装Win11步骤 Mac虚拟机的Win11会卡吗
- 时间:2026-10-29
-
- 用FL Studio怎么设置采样率和位深度 用FL Studio如何去除音频中的混响
- 时间:2026-10-29
-
- 在Mac中怎么把文件写入U盘
- 时间:2026-10-29