2014-01-10 3 views
1

gdb에 backtrace과 비슷한 스택 추적 프로그램을 작성 중입니다.주 시작 주소를 결정하는 방법

Example Program 

void bar(int x, int y){ 
    trace(stdio); 
} 

void foo(){ 
    bar(1, 2); 
} 


int main(int argc, char*argv[]){ 
    foo(); 
} 

Function bar.. 
Function foo.. 

문제는 내가 어떻게 주에 도달하면 중지하는 아무 생각입니다을 인쇄합니다. 함수의 시작 주소를 저장하는 테이블이 있는데 main을 포함합니다.

내 접근 방식은 trace 함수입니다. 먼저 작은 어셈블리 코드를 작성하여 ebp을 읽습니다. 그리고 trace에 대한 return addrbar입니다. 나는 주에 도달하면

그래서 나는

을 (이 상대적 IP를 사용합니다) trace의 반환 주소 (barCALL 명령에 의해 결정)을 offset을 추가하여 trace의 시작 주소를 얻을 수 있지만, 나는 같은 기술을 사용할 수 없다. main의 복귀 주소는 내가 접근 할 수없는 메모리 영역으로 데려다 준다.

이미 main 함수에서 Im을 어떻게 확인할 수 있습니까? ,

+0

'main()'의 시작 부분 아래 또는 다음 부분의 주소를 넘어서는 부분은 무엇입니까? – Notlikethat

+0

'main'에서'push % ebp'의 시작 주소를 얻고 싶습니다. 무슨 뜻입니까? –

+0

아, 나는 "나는 테이블을 가지고있다."라고 읽는다. 미리 주소를 가지고 있다는 것을 의미한다. 스택을 걸을 때 그 주소를 수집하는 것이 아니라 내 실수이다. – Notlikethat

답변

0

즉 이미이 문제를 해결 가능한 라이브러리의 많은이 있습니다 (I는 main의 시작 주소를 얻을 수 있도록 노력하겠습니다) libunwind는 또는 libc의 역 추적 기능 : http://www.gnu.org/software/libc/manual/html_node/Backtraces.html

이 당신이 수 자신을 구현하려면 실행 파일의 ELF 헤더를 파싱합니다. 이렇게하면 함수 이름과 시작 주소/길이를 얻을 수 있습니다. 따라서 "main"이라는 함수에 이미 있는지 확인할 수 있습니다.