//遍历出数据库中每一个函数,并打印出函数的基本信息,函数起始和结束地址、局部变量大小、参数大小、参数数量
//
#include <idc.idc>
static main()
{
auto addr,end,args,locals,frame,firstArg,name,ret;
addr = 0;
for(addr = NextFunction(addr);addr != BADADDR;addr = NextFunction(addr))
{
name = Name(addr); //返回该函数的名称
end = GetFunctionAttr(addr,FUNCATTR_END); //获取函数结束地址
locals = GetFunctionAttr(addr,FUNCATTR_FRSIZE); //获取函数局部变量大小
frame = GetFrame(addr); //获取函数框架结构体ID(函数帧栈的句柄)
ret = GetMemberOffset(frame," r"); //根据函数框架结构体ID获取结构成员偏移量,如果ID有错或者没有这个成员返回-1
if(ret == -1) continue;
firstArg = ret +4; //第一个参数是在返回地址偏移处+4的地方
args = GetStrucSize(frame) - firstArg; //GetStrucSize返回结构体大小,函数的参数大小为第一个参数与栈帧结束部分之间的空间
Message("Function:%s,starts at %x,ends at %x\n",name,addr,end); //函数起始和结束地址
Message("Local variable area is %d bytes\n",locals); //局部变量大小
Message("Arguments occupy %d bytes (%d args)\n",args,args/4); //参数大小,参数数量
}
}
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/37eb71a0d4f3ac1e192ebe1e3b7c1175.png)