遍历出数据库中每一个函数,并打印出函数的基本信息,函数起始和结束地址、局部变量大小、参数大小、参数数量
//遍历出数据库中每一个函数,并打印出函数的基本信息,函数起始和结束地址、局部变量大小、参数大小、参数数量 // #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); //参数大小,参数数量 } }
结果如下:
![](http://images0.cnblogs.com/i/658607/201408/201757518931949.png)