//遍历一个函数在程序中的所有交叉引用
//
#include <idc.idc>
static main()
{
list_callers("_memset");
list_callers("_sprintf");
}
static list_callers(bad_func)
{
auto func,addr,xref,source;
func = LocByName(bad_func); //通过函数名查找函数的地址
Message("func addr is : 0x%x ",func);
if(func == BADADDR)
{
Warning("Sorry,%s not found in database",bad_func);
}
else
{
//RfirstB是获取第一个从它开始的代码引用(就是调用了这个函数的地址)
for(addr = RfirstB(func); addr != BADADDR ; addr = RnextB(func,addr))
{
xref = XrefType(); //获取交叉类型
if(xref == fl_CN || xref == fl_CF)
{
source = GetFunctionName(addr); //获取这个地址所在的是那一个函数里
Message("%s is called from 0x%x in %s\n",bad_func,addr,source);
}
}
}
}
结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/0353b7c1e859c1f8616b185dd0268f6b.png)