2017-02-25 6 views
0

C/C++ 파일을 바이너리로 컴파일한다고 가정합니다. 파일에 함수 foo()이 정의되어 있다고 가정 해보십시오.함수가있는 실행 파일의 위치를 ​​찾으려면 어떻게합니까?

이 함수에서이 함수는 어떻게 찾을 수 있습니까? 위치를 찾으면 정확한 위치를 찾습니다.

Windows 또는 Linux를 고려 중인지 여부에 따라 질문이 달라질 수 있으므로 실행 파일이 PE 형식이라고 가정 해 보겠습니다.

컴파일러가 이름을 모두 지우므로 이름별로 함수를 찾을 수 없습니까? 즉, 바이너리에서 패턴 검색을 수행해야합니까?

내가 DLL의 내 기능을 찾는데 도움이 될 수 수출 테이블을 가지고 있다는 것을 알고 있지만, Windows에서 실행 파일은 테이블이없는 ...

+0

해당 정보는 이진 이미지에 저장되지 않습니다. PDB 또는 MAP 파일이 필요합니다. – IInspectable

+0

그 파일은 무엇입니까? 결코 그들에 대해 들어 보지 못했습니다. – Shuzheng

+0

[프로그램 데이터베이스 파일] (https://msdn.microsoft.com/en-us/library/yd4f8bd1(v=vs.100) .aspx) (일명 PDB 파일). MAP 파일에 대한 약간의 정보가 추가되었습니다 ([/ MAP 링커 옵션] (https://msdn.microsoft.com/en-us/library/k7xkk3e2.aspx) 참조). – IInspectable

답변

1

.EXE 파일 can export functions 이러한 기능을 사용할 수 있습니다. 해당 프로세스에로드 된 DLL. 플러그인을로드하고 플러그인 API/SDK의 일종을 제공하려는 경우이 옵션이 가장 좋습니다. 그런 다음 프로세스 내에있는 모든 코드에서 GetProceAddress(GetModuleHandle(0), "MyFunction")을 수행하여 함수를 찾을 수 있습니다. .DLL은 함수에 직접 연결할 수도 있고 로더는 .DLL로 내 보낸 것처럼 해결할 수 있습니다.

다른 옵션은 .EXE에 기호/디버그 정보를 포함시킨 다음 DbgHelp functions을 사용하여 기능을 찾는 것입니다.

각 기능과 주소를 나열하는 .MAP 파일을 생성하는 링커를 얻을 수도 있지만 대부분 수동으로 프로세스를 디버깅 할 때 유용합니다.

+0

리눅스에서만 실행 파일이 함수를 내보낼 수 있다고 생각 했나요? – Shuzheng

+0

MAP 파일은 바이너리 내의 기능 위치 또는 RVA (런타임 주소) 만 나열합니까? – Shuzheng

+0

@ Shuzheng : 당신은 이미 대답을 알고 있습니다. 링크시 .MAP 파일이 생성됩니다. 링커는 모듈이 런타임에로드 될 위치를 알 수 없습니다. 게다가 "RVA"의 "R"은 "친척"의 약자입니다. RVA는 모듈 단위입니다. – IInspectable