遍历出数据库中每一个函数,并打印出函数的基本信息,函数起始和结束地址、局部变量大小、参数大小、参数数量

//遍历出数据库中每一个函数,并打印出函数的基本信息,函数起始和结束地址、局部变量大小、参数大小、参数数量
//
#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);  //参数大小,参数数量
	}
}

结果如下:

  

posted @ 2014-08-20 17:20  M-先生  阅读(829)  评论(0编辑  收藏  举报