先上图:
第一行函数注释:一般选用可重复注释,可以在调用该函数处,方便看到关于该函数的注释。
第二行函数属性:可在编辑函数对话框中修改,这个属性的额意思是:不返回调用方、基于ebp栈帧。修改如下图:
第三行函数声明:默认情况下函数声明是不出现的,在函数声明对话框中做修改就会出现,如图:
最后的多行变量规范称呼:栈帧摘要视图,还有一个视图叫栈帧视图显示的更详细。习惯是把未引用的变量、保存调用方的寄存器值都标注出来,方便观察栈布局一目了然。
Does not return(不返回):函数不返回它的调用方(不是没有返回值)。如果调用这样的函数,在相关调用指令之后,IDA认为函数不会继续执行。
有时ida会对函数的局部变量数量判断错误,需要我们手动修改(添加、删除)。通过Edit function->Local variables area完成。
Purged bytes(已删除字节):表示当函数返回调用方时,IDA从栈中删除的参数的字节数。对cdecl函数而言,这个值始终未0。对stdcall函数来说,这个值表示传递到栈上的所有参数占用的空间。如果IDA观察到程序使用了返回指令的RET N变体,它将自动确定这个值(有时会失败)。
比如下面例子:start( )调用WinMain( ),再调用exit( )
exit( )使用WinMain( )的返回值做参数,exit( )标注有__noreturn特性,执行完exit( )程序就直接退出。该函数在msvcrt.dll中可以自己去查看其汇编代码。
再看WinMain( )函数的栈帧视图,这里IDA就没能正确识别。首先在Eidtfunction中修改Purged bytes为0x10,再把鼠标指针放在end of stack variables处,按D字母键一个一个添加参数。