2009-04-18 3 views
10

특정 Windows 실행 파일 또는 DLL을 작성하는 데 사용 된 C 또는 C++ 컴파일러를 어떻게 결정할 수 있습니까? 일부 컴파일러는 최종 실행 파일에 버전 문자열을 남겨 둡니다. 그러나 이것은 Windows에서 Linux보다 희귀 한 것으로 보입니다.Win32 PE를 빌드 한 컴파일러 결정

특히, 저는 Visual C++과 다양한 MinGW 컴파일러 (일반적으로 함수 서명에서 상당히 쉽습니다)와 Visual C++ 버전 (6, 2002/2003, 2005, 2008) 사이를 구별하는데 관심이 있습니다. 해야 할 것). 거기에 반 안정적인 방식으로 구별을 만들 수있는 도구가 있습니까?

+1

이 정보가 도움이 될만한 주요 요인은 무엇입니까? – ojblass

+0

먼저 우리가 가지고있는 바이너리의 일부를 빌드하기 위해 어떤 버전의 VS를 사용했는지 궁금합니다. (거의 무료 성능 향상을 위해 새로운 버전의 VS로 다시 빌드 할 생각이었습니다.)이 특정 바이너리에 대한 대답을 알고있는 누군가를 찾았지만 일반적으로 수행 할 수 있는지 궁금합니다. – kquinn

+0

어쨌든 최신 컴파일러를 사용하여 다시 작성하는 경우에는 그 대답이 아닙니까? 동일한 컴파일러를 사용하여 다시 컴파일하거나 아무런 변경을하지 않거나 더 새로운 컴파일러를 사용하게되면 앞에서 언급 한 이점을 얻을 수 있습니다. – jalf

답변

1

IDA-Pro이 수행하는 분석의 일부에는 일부 컴파일러 인식이 포함됩니다. 분석을 위해 PE를 연 후에 출력 로그를보십시오. 그것은 보통 거기 어딘가에 묻혀 있습니다.

+0

IDA Pro 5.1은 제가 지금 사용하고있는 것입니다. 그러나 그 분석은 매우 희미합니다. 내가 아는 무엇인가 VC6로 컴파일 된 것이고, "FLIRT 서명 사용 : Microsoft VisualC 2-8/net runtime"이라고되어 ​​있습니다. – kquinn

11

VC 버전을 구별하는 힌트의 한 가지 소스는 링크 된 특정 C 런타임 라이브러리입니다. 디폴트 케이스는 (적어도 최신 버전에서는) DLL에 링크하기 때문에, 이것은 상당히 쉽습니다. 유틸리티 Dependency Walker은 실제로 어떤 DLL이로드되고 있는지를 확인하는 데 필수적이며 어떤 C 런타임 DLL이 사용 중인지 알려줍니다. Dependency Walker는 Microsoft Platform SDK에 포함되어 있지만 독립적으로 확장되었으며 연결된 사이트는 현재 개발 중입니다.

VC6과 MinGW는 모두 기본적으로 MSVCRT.DLL에 연결되므로이 둘 사이에 구별되지 않습니다. 약간의 노력으로, MinGW는 최신 C 런타임 버전에도 링크 될 수 있으므로, MinGW를 독립적으로 배제해야합니다.

Runtime  VC Version 
---------- ------------- 
MSVCRT.DLL VC6 
MSCVR80.DLL VC8 (VS 2005) 
MSCVR90.DLL VC9 (VS 2008) 

다른 런타임 DLL도 좋은 단서가됩니다. Delphi의 런타임에 대한 언급은 아마 EXE가 실제로 C 툴체인이 아니라 Delphi에서 만들어 졌다는 것을 나타냅니다.

.EXE 파일에서 기호가 제거되지 않은 경우 내부 기호가있는 몇 가지 단서를 찾을 수 있습니다. 예를 들어, _sjlj_init과 같은 것에 대한 참조는 setjmp/longjmp 예외 처리를 위해 구성된 MinGW GCC 3.x가 어느 시점에서 관련되었다는 것을 나타냅니다.

+0

댕! 나를 때려! – shoosh

+0

글쎄, 버전 목록 * * 더 완성 ...--) – RBerteig

+0

아, MSVCRT.DLL에 번호가없는 것은 VC6 ... 몇 가지를 설명합니다. Dependency Walker에 대한 링크 주셔서 감사합니다. 매우 유용합니다. 나는 세 사람 사이에 받아 들여진 답안 점을 나눌 수 있었으면 좋겠다고 생각했지만, 나는 그 사람에게 1 명을 주겠다고 결심했다. – kquinn

2

또 다른 옵션은 dll이 사용하는 DLL과 연결된 CRT 라이브러리를 확인하는 것입니다. depends.exe
MinGW 및 Cygwin에는 인식 할 수있는 고유 한 dll이 있습니다.
VC6은의 MSVCRT.dll을 사용하여 일반적으로
VS의 최신 버전은 다음 DLL의 파일 이름의 버전이 있습니다
MSVCR90.dll - VS2008
MSVCR80.dll - VS2005
msvcr71.dll을 - VS2003
MSVCR70합니다. dll - VS2002

이러한 이름은 특히 VS2002-2003 영역에서 이상한 변형이있는 경향이 있으므로이 목록을 확실한 지침으로 삼지 마십시오. 유사한 버전 체계를 가지고있는 MFC와 ATL dll과 같은 다른 dll도 있습니다.

PE가 실제로 CRT에 종속되어 있고 정적으로 링크되지 않은 한 작동합니다.

필자도 Delphi에는 링크 된 DLL이 있지만 실제로 무엇인지 모르겠습니다.