2016-11-25 3 views
1

malloc을 호출하는 간단한 프로그램이 있으며 주 실행 파일에서 malloc에 ​​대한 직접 호출을 catch하는 pintool을 개발하려고합니다. SimpleExamples에서 malloctrace.cpp를 사용주 실행 파일에서 malloc 호출을 식별하는 방법

합니다 (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에 ​​대한 호출을 참조하십시오

의 malloc @의 PLT로 시작
callq 4003b8 <[email protected]> 

. 내 주요 실행 파일에서 루틴을 탐색하면 .plt 루틴이 표시되지만 malloc 또는 기타 외부 함수에 속하는지 알 수 없습니다.

감사합니다.

+0

정확히 무엇이 당신의 질문입니까? 'malloc @ plt가 malloc 구현에 속해 있습니까? '라고 대답하면 대답은'아니오 '입니다. 'malloc @ plt'는 호출하는 바이너리에 속합니다. 런타임 링커에 의해 일단 타겟이 결정되면 **는 ** libc에서 malloc 구현체를 호출합니다. – Neitsa

+0

내 질문은 : 어떻게 내 코드에 의해 발생한 malloc 호출을 잡을 수 있습니까? (모든 malloc 호출과 반대되는데, 그 중 많은 부분이 libc와 같은 코드를 지원하는 것으로부터왔다.) – Jaaz

답변

0

분석 콜백에 malloc() 함수를 호출 한 사람에 대한 정보를 추가해야합니다. 가장 쉬운 방법은 RTN_InsertCall() 호출에 IARG_RETURN_IP을 추가하고 이에 따라 Arg1Before를 변경하는 것입니다.

그런 다음 Arg1Before의 리턴 IP에 IMG_IsMainExecutable(IMG_FindByAddress(...))을 사용하여이 호출이 기본 실행 파일에서 온 것인지 확인할 수 있습니다.

+0

이 유용한 주석을 가져 주셔서 감사합니다! – Jaaz