2009-04-18 10 views
10

Làm cách nào để xác định trình biên dịch C hoặc C++ nào được sử dụng để xây dựng một tệp thực thi hoặc tệp DLL cụ thể của Windows? Một số trình biên dịch để lại các chuỗi phiên bản trong tệp thực thi cuối cùng, nhưng điều này dường như hiếm hơn trên Windows so với trên Linux.Xác định trình biên dịch nào được xây dựng một Win32 PE

Cụ thể, tôi quan tâm đến việc phân biệt giữa Visual C++ và các trình biên dịch MinGW khác nhau (thường khá dễ dàng từ các chữ ký chức năng), và sau đó giữa các phiên bản Visual C++ (6, 2002/2003, 2005, 2008; làm). Có một công cụ nào ở đó có thể làm cho sự khác biệt một cách bán đáng tin cậy?

+1

Điều gì khiến bạn cần thông tin này? – ojblass

+0

Đầu tiên, tự hỏi phiên bản nào của VS được sử dụng để xây dựng một số tệp nhị phân mà chúng tôi có ở đây. (Tôi đã nghĩ đến việc xây dựng lại chúng với một phiên bản mới hơn của VS để tăng hiệu suất gần như miễn phí.) Tôi đã tìm thấy một người biết câu trả lời cho những tập tin nhị phân đặc biệt này, nhưng tôi tò mò muốn biết liệu nó có thể được thực hiện nói chung hay không. – kquinn

+0

Không phải là câu trả lời trong trường hợp đó chỉ để xây dựng lại bằng cách sử dụng trình biên dịch mới nhất trong mọi trường hợp? Hoặc bạn biên dịch lại bằng cách sử dụng trình biên dịch tương tự, không thay đổi, hoặc bạn kết thúc bằng cách sử dụng một trình biên dịch mới hơn, cho bạn những lợi thế mà bạn đã đề cập. – jalf

Trả lời

1

một phần của phân tích rằng IDA-Pro thực hiện chứa một số nhận dạng trình biên dịch. Sau khi bạn mở PE để phân tích, hãy xem nhật ký đầu ra. nó thường được chôn ở đâu đó ở đó.

+0

Vâng, IDA Pro 5.1 là những gì tôi đang sử dụng bây giờ. Tuy nhiên, phân tích của nó rất mờ; cho một cái gì đó tôi biết được biên dịch với VC6, nó nói "Sử dụng chữ ký FLIRT: Microsoft VisualC 2-8/net runtime". – kquinn

11

Một nguồn gợi ý để phân biệt giữa các phiên bản VC là thư viện thời gian chạy C cụ thể được liên kết. Vì trường hợp mặc định là (ít nhất là trong các phiên bản hiện đại) để liên kết đến DLL, điều này khá dễ thực hiện. Tiện ích Dependency Walker gần như không thể thiếu để xác minh rằng bạn biết những gì DLL đang thực sự được nạp, và nó sẽ cho bạn biết thời gian chạy DLL C đang được sử dụng. Mặc dù phụ thuộc Walker được bao gồm trong Microsoft Platform SDK, nó đã được mở rộng độc lập và trang web tôi liên kết là nhà phát triển hiện tại của nó.

VC6 và MinGW đều liên kết với MSVCRT.DLL theo mặc định, vì vậy điều này sẽ không phân biệt được giữa chúng. Với một số nỗ lực, MinGW có thể được thực hiện để liên kết đến các phiên bản C thời gian chạy sau này, vì vậy bạn sẽ cần phải loại trừ độc lập ra MinGW.

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

Dll thời gian chạy khác cũng sẽ là đầu mối tốt, ví dụ: các tham chiếu đến thời gian chạy của Delphi có thể chỉ ra rằng EXE thực sự được xây dựng từ Delphi và không phải là một chuỗi công cụ C.

Nếu các biểu tượng chưa bị tước khỏi tệp .EXE, thì bạn có thể tìm thấy một số manh mối mà từ đó biểu tượng bên trong có mặt. Ví dụ, một tham chiếu đến một cái gì đó như _sjlj_init có thể chỉ ra rằng một MinGW GCC 3.x cấu hình cho xử lý ngoại lệ setjmp/longjmp đã được tham gia tại một số điểm.

+0

dang! đánh tôi với nó! – shoosh

+0

Vâng, danh sách các phiên bản của bạn * là * hoàn chỉnh hơn ... ;-) – RBerteig

+0

Ah, MSVCRT.DLL không có số trên đó là VC6 ... giải thích một vài điều. Cảm ơn bạn đã liên kết đến Dependency Walker, có vẻ rất hữu ích. Tôi ước tôi có thể chia các điểm trả lời được chấp nhận giữa ba người, nhưng tôi đã quyết định trao cho họ 1 người đại diện. – kquinn

2

Một tùy chọn khác là kiểm tra xem thư viện CRT nào liên kết đến việc sử dụng depends.exe
MinGW và Cygwin có các tệp dll riêng của chúng khá rõ ràng để nhận ra.
VC6 sử dụng MSVCRT.dll thường
bất kỳ phiên bản mới hơn của VS có phiên bản của nó bên cạnh tên tập tin của dll:
MSVCR90.DLL - VS2008
msvcr80.dll - VS2005
msvcr71.dll - VS2003
MSVCR70. dll - VS2002

Không lấy danh sách này làm hướng dẫn dứt khoát vì những tên này có xu hướng có các biến thể lạ, đặc biệt là trong khu vực của VS2002-2003. Ngoài ra còn có các dll khác như MFC và ATL dlls có kế hoạch versioning tương tự.

Điều này sẽ hoạt động miễn là PE thực sự phụ thuộc vào CRT và nó không liên kết với nó một cách tĩnh.

Tôi nghĩ Delphi cũng có một số DLL liên kết đến nhưng tôi không thực sự chắc chắn nó là gì.