行业解决方案查看所有行业解决方案
IDA 用于解决软件行业的关键问题。
发布时间: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
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,long
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 __spoils
If the __spoils keyword is present,the specified list overrides the standard spoiled list.For x86,the standard spoiled list is
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
表示一个有两个参数的函数:第一个参数在堆栈上传递(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寄存器中。在这种复杂的情况下,经验法则是在参数列表的左大括号之前指定寄存器
用于位置名称的寄存器必须对当前处理器有效;有些寄存器不受支持(如果寄存器名是动态生成的,则不受支持;请告知我们此类情况;如果很容易,我们可能会改进处理器模块)
-寄存器对可以用类似于
-对于非常复杂的情况,可以使用此语法。
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可以使用它来描述高级原型
展开阅读全文
︾
读者也喜欢这些内容:
如何使用IDA软件反编译功能提取程序中的变量信息 IDA软件反汇编功能如何快速定位关键函数
在逆向工程领域,IDA Pro软件以其强大的反编译和反汇编功能成为众多工程师和安全研究人员的重要工具。对于逆向分析而言,能够准确提取程序中的变量信息和迅速定位关键函数是至关重要的。本文将深入探讨“如何使用IDA软件反编译功能提取程序中的变量信息 IDA软件反汇编功能如何快速定位关键函数”,全面介绍IDA Pro的核心功能及其应用技巧,帮助用户高效开展逆向工程任务。...
阅读全文 >
IDA怎么修改字符串内容?IDA修改后怎么保存?
在软件开发和逆向工程领域,IDA Pro是一种极其强悍的工具,广泛用于程序剖析、调试和修改。它不仅支持多种处理器架构,还提供了大量的作用,以适应高档讲解的必须。本文将围绕ida怎么修改字符串内容,ida修改后怎么保存这一主题,详细描述怎样在IDA中更改字符串内容,及其修改后的存放方式。此外,我们还将探讨IDA转变的应用场景,帮助读者更深入地了解IDA的实际应用价值。...
阅读全文 >
IDA查找字符串快捷键 IDA怎么搜索关键字?
在众多逆向工程和代码分析工具中,IDA(Interactive DisAssembler)无疑是最受欢迎和最强大的之一。它提供了一系列的功能,使得分析复杂的软件成为可能,而对于许多安全研究员和逆向工程师来说,掌握IDA的使用技巧是基本技能之一。特别是在查找特定字符串和搜索关键字方面,IDA提供了快捷有效的方法。本文将深入探讨ida查找字符串快捷键,ida怎么搜索关键字,以及IDA支持的系统范围,旨在帮助用户更加高效地利用IDA进行逆向工程任务。...
阅读全文 >
ida查找函数被引用位置 ida函数窗口找不到
在当今信息安全和软件开发领域,IDA Pro的重要性不言而喻。作为一款领先的逆向工程工具,IDA Pro不仅帮助安全研究人员深入挖掘恶意软件的秘密,还使得软件开发人员能够更好地理解程序的内部运作机制。本文将进一步深入探讨如何在IDA中有效查找函数的被引用位置,解决在使用过程中遇到的函数窗口找不到的问题,并全面分析IDA在逆向工程中的核心作用及其对于整个行业的影响。...
阅读全文 >