使用Pin,我想在每个应用程序函数调用之前和之后调用一些检测函数。我已经读到RTN_InsertCall
和IPOINT_BEFORE
和IPOINT_AFTER
一起添加一些进入/退出分析功能是不可靠的,因为可能永远不会调用出口。
我的理解是,“正确”的方法是通过RTN_ReplaceSignature
替换例程,然后在我的替换函数中,在对原始例程的调用周围添加进入和退出调用,其中使用PIN_CallApplicationFunction
。
但是,据我所知PIN_CallApplicationFunction
要求我预先声明要包装的例程的所有参数,例如,对于malloc
,我需要明确地传递一些size_t
参数,而对于free
,我将传入一个指针,依此类推。
由于我只想包装all函数调用,所以我不知道参数!是否有某种方法可以简单地跳入我替换的原始函数,并传递原始签名的参数?或者也许是更好的方法呢?
感谢您的帮助!
IPOINT_BEFORE和IPOINT_AFTER的问题在于IPOINT_AFTER可能会错过一些退出指令。 RTN_Replace函数将需要一个具有与原始签名相同签名的函数指针(因为您不想修改默认代码)。
一个简单的解决方案是使用所有'call'和'ret'指令。使用INS_Rtn函数找出例程名称。这样,您就可以测试all函数,而不必为每个函数签名烦恼。