2016-11-25 33 views
1

确定的malloc调用我有一个简单的程序,调用malloc,而我试图建立一个pintool赶上从主可执行文件的malloc这直接调用。如何从主可执行

运用SimpleExamples malloctrace.cpp(随SDK):

VOID Image(IMG img, VOID *v) 
{ 
    RTN mallocRtn = RTN_FindByName(img, MALLOC); 
    if (RTN_Valid(mallocRtn)) 
    { 
     RTN_Open(mallocRtn); 
     RTN_InsertCall(mallocRtn, IPOINT_BEFORE,(AFUNPTR)Arg1Before, IARG_ADDRINT, MALLOC, IARG_G_ARG0_CALLEE, IARG_END); 
     RTN_Close(mallocRtn); 
    } 
} 

我赶上许多malloc的电话,都是由我自己的代码,或通过它使用的库为主。

使用objdump的,我看到调用函数malloc:

callq 4003b8 <[email protected]> 

与malloc分配@ PLT开始。 浏览我的主要可执行文件中的例程我看到一个.plt例程,但我不知道它是否属于malloc或任何其他外部函数。

我很欣赏你的帮助。

+0

什么是你的问题?如果它是否“malloc @ plt属于malloc实现?”,答案是否定的。 'malloc @ plt'属于拨打电话的二进制文件。一旦目标被运行时链接程序解析,它就会从libc调用malloc实现。 – Neitsa

+0

我的问题是:我如何捕获由我的代码直接产生的malloc调用? (而不是所有的malloc调用,其中许多来自协助代码,如libc等) – Jaaz

回答

0

您需要将信息添加到您的分析的回调对谁叫的malloc()函数。最简单的方法是将IARG_RETURN_IP添加到您的RTN_InsertCall()调用中,并相应地更改Arg1Before。

然后,您可以使用IMG_IsMainExecutable(IMG_FindByAddress(...))在Arg1Before返回IP,看看这个电话来自主可执行文件来了。

+0

感谢您的有用评论! – Jaaz