2016-11-25 7 views
1

У меня есть простая программа, которая вызывает malloc, и я пытаюсь разработать pintool, чтобы поймать этот прямой вызов malloc из основного исполняемого файла.Как определить вызовы malloc из основного исполняемого файла

Использование malloctrace.cpp из SimpleExamples (поставляется с 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); 
    } 
} 

Я ловлю много звонков таНоса, как ориентированный на моем собственном коде или библиотеки, используемой ею.

Использование objdump, я вижу вызов таНос:

callq 4003b8 <[email protected]> 

, который начинается с таНос @ PLT. Просмотр подпрограмм в моем основном исполняемом файле. Я вижу процедуру .plt, но не могу сказать, принадлежит ли она malloc или любой другой внешней функции.

Я ценю вашу помощь.

+0

В чем именно ваш вопрос? Если это 'Does malloc @ plt принадлежит реализации malloc ?, ответ - нет. 'malloc @ plt' принадлежит бинарному вызову. Он ** делает ** вызов реализации malloc из libc, как только цель будет разрешена компоновщиком времени выполнения. – Neitsa

+0

Мой вопрос: как я могу поймать вызовы malloc напрямую, исходящие из моего кода? (в отличие от всех вызовов malloc, в которых многие из них поступали из кода помощи, такого как libc и т. д.) – Jaaz

ответ

0

Вам нужно будет добавить информацию к вашему обратному сообщению анализа о том, кто вызвал функцию malloc(). Самый простой способ сделать это - добавить IARG_RETURN_IP на ваш RTN_InsertCall() вызов и изменение Arg1Before соответственно.

Затем вы можете использовать IMG_IsMainExecutable(IMG_FindByAddress(...)) на обратном IP-адресе в Arg1Before, чтобы узнать, пришел ли этот вызов из основного исполняемого файла.

+0

Спасибо за этот полезный комментарий! – Jaaz

 Смежные вопросы

  • Нет связанных вопросов^_^