2014-06-07 8 views
2

필자는 elf 파일을 가지고 있으며 readelf -h filename을 사용할 때 엔트리 포인트를 얻습니다. 이제이 주소를 직접 계산할 수 있습니다. [어셈블리 사용,하지만 언어는 중요하지 않습니다].readelf가 엔트리 포인트를 번역하는 방법

어떻게하면됩니까?

나는 진입 점이 파일의 오프셋 24에서 시작하는 4 바이트임을 알고 있지만이 데이터를 주소로 변환하는 방법을 모르겠습니다.

+0

번역 할 내용이 많지 않습니다. 보통 리틀 엔디안 형식의 4 바이트 주소입니다. – Jester

답변

0

귀하의 질문에 명확하지 않습니다. ELF 파일에서이 값을 읽는 방법을 묻는다면 ELF 파일 (아마도 libelf 또는 다른 기존 도우미 소프트웨어 사용)을 구문 분석해야합니다. 바이너리 프로그램 내용에 대한 지식을 가지고 어떤 마술을 사용하여 양식을 작성하는 방법을 묻는다면,이 "마술"은 결과 바이너리로 컴파일되는 항목의 오프셋에서 단독으로 계산됩니다.

리눅스 바이너리가 (제공 당신은 표준 툴체인, 즉, GCC + GNU의 바이너리 유틸리티를 사용) 후자 프롤로그 모듈 (crtbegin.o, crti.o)의 주요 바이너리와 같은 몇 가지 입력 파일의 합계, 재배치 테이블로 형성되고, 에필로그 모듈 (crtend.o, crtn.o). 진입 점은 프롤로그에 있지만 기본 이진 내용 다음에 링커가 놓을 수 있습니다 (OpenSuSE에서/bin/sh에 표시됨). 결과 바이너리 파일의 끝 부분에 있습니다. 명시 적으로 규제하지 않는 한 이것은 링커가 선택할 수있는 권리입니다.

1

은 내가 엔트리 포인트 파일 24 오프셋에서 시작하는 4 바이트 알고,하지만 난 주소로이 데이터를 변환하는 방법을 모르겠어요.

동일한 대상 (x86)에서 실행 파일을 빌드 할 때 번역 할 필요가 없습니다. 의사 코드에서

는 에러 체크를 생략 :

int fd = open(path, O_RDONLY); 
lseek(fd, 24, SEEK_SET); 
unsigned long entry_point; 
read(fd, &entry_point, sizeof(entry_point)); 

printf("entry: 0x%lx\n", entry_point); 

을 P.S. 24는 Elf32에 대해서만 올바른 오프셋입니다. 오프셋 0에서 전체 Elf32_Ehdr 또는 Elf64_Ehdr (바이트 5에 따라 ELFCLASS32 또는 ELFCLASS64)을 읽은 다음 .e_entry 멤버를 사용하여 이식성있게 작성하는 것이 훨씬 더 좋습니다.