我正在尝试使用Pin编写函数调用跟踪器。它可以打印每个函数调用以及每个参数的值。
难点在于获取函数的所有参数。使用RTN_InsertCall,您可以将函数参数传递给检测代码:
intel pin RTN_InsertCall multiple function arguments
但是,您需要知道当前例程的参数数量。有没有办法做到这一点?
谢谢!
答案 0 :(得分:2)
您应该提供关于是否有相关二进制文件的调试符号的关键信息。如果你有可用的调试符号,那么它就变得轻而易举。有解析这些的标准库。
如果你没有调试符号,那么它可能非常困难,你可以通过像IDA Pro这样的视觉探索工具获得更好的效果。已经有一些关于自动查找被剥离二进制文件的函数签名的研究(例如ftp://ftp.cs.wisc.edu/paradyn/papers/Jacobson11Unstrip.pdf),但是这个主题仍然是最前沿的,无论你使用什么工具,都希望它在某些时候失败,因为问题最终是不可判定的。所有工具只需借助启发式来重建此信息。 Chris Eagle的书(http://www.tinker.tv/download/idaPro_ch12.pdf)免费提供的第12章介绍了IDA这样做的方式。
答案 1 :(得分:1)
在C中,类型信息不保存在二进制文件中。
在C ++中,您可以尝试使用函数的受损名称来确定参数的类型。但是,名称修改不是标准的,并且通常在不同的编译器之间不兼容。显然,这里没有任何保证。
另见:
Is it possible to get the signature of a function in a shared library programatically?