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

//遍历出数据库中每一个函数,并打印出函数的基本信息,函数起始和结束地址、局部变量大小、参数大小、参数数量
//
#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://www.cnblogs.com/M-Mr/p/3925096.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值