2009-04-18 23 views
10

Come è possibile determinare quale compilatore C o C++ è stato utilizzato per creare un particolare file eseguibile o DLL di Windows? Alcuni compilatori lasciano le stringhe di versione nell'eseguibile finale, ma questo sembra essere più raro su Windows che su Linux.Determinare quale compilatore ha generato un Win32 PE

In particolare, sono interessato a distinguere tra Visual C++ ei vari compilatori MinGW (in genere abbastanza semplici dalle firme delle funzioni) e quindi tra le versioni di Visual C++ (6, 2002/2003, 2005, 2008; fare). Esiste uno strumento là fuori che può fare la distinzione in modo semi-affidabile?

+1

Che cosa sta guidando per aver bisogno di queste informazioni? – ojblass

+0

Prima di tutto, chiedendo quale versione di VS è stata utilizzata per costruire alcuni dei binari che abbiamo qui. (Stavo pensando di ricostruirli con una versione più recente di VS per un aumento delle prestazioni quasi gratuito.Ho trovato qualcuno che conosce la risposta per questi particolari binari, ma sono curioso di sapere se può essere fatto in generale. – kquinn

+0

Non è la risposta in questo caso solo per ricostruire utilizzando il compilatore più recente in ogni caso? O ricompilate usando lo stesso compilatore, senza apportare modifiche, o finisci per usare un compilatore più recente, offrendoti i vantaggi che hai menzionato. – jalf

risposta

1

parte dell'analisi eseguita da IDA-Pro contiene alcuni riconoscimenti del compilatore. Dopo aver aperto PE per l'analisi, guarda il log di output. di solito è sepolto da qualche parte lì.

+0

Sì, IDA Pro 5.1 è quello che sto usando ora. La sua analisi è molto sfocata, però; per qualcosa che so è stato compilato con VC6, si dice "Usando la firma FLIRT: Microsoft VisualC 2-8/runtime netto". – kquinn

11

Una fonte di un suggerimento per distinguere tra le versioni VC è la libreria di runtime C specifica collegata. Poiché il caso predefinito è (almeno nelle versioni moderne) di collegarsi alla DLL, questo è abbastanza facile da fare. L'utilità Dependency Walker è quasi indispensabile per verificare che tu sappia quali DLL vengono realmente caricate e ti dirà quale C runtime DLL è in uso. Sebbene Dependency Walker sia incluso nel Microsoft Platform SDK, è stato esteso indipendentemente e il sito I collegato è la sede del suo attuale sviluppo.

VC6 e MinGW si collegano entrambi a MSVCRT.DLL per impostazione predefinita, pertanto non sarà possibile distinguerli. Con qualche sforzo, MinGW può essere creato per collegarsi anche alle successive versioni di runtime C, quindi dovrai escludere autonomamente MinGW.

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

Altre DLL di runtime potrebbero essere anche buoni indizi, ad es. i riferimenti al runtime di Delphi probabilmente indicano che l'EXE è stato effettivamente creato da Delphi e non da un toolchain C.

Se i simboli non sono stati eliminati dal file .EXE, è possibile trovare alcuni indizi dai quali sono presenti simboli interni. Ad esempio, un riferimento a qualcosa come _sjlj_init indica probabilmente che un GCC 3.x MinGW configurato per la gestione delle eccezioni setjmp/longjmp era coinvolto in qualche punto.

+0

dang! bastonatemi! – shoosh

+0

Bene, il tuo elenco di versioni * è * più completo ... ;-) – RBerteig

+0

Ah, MSVCRT.DLL senza numero su di esso è VC6 ... che spiega alcune cose. Grazie per il link a Dependency Walker, sembra molto utile. Vorrei poter dividere i punti di risposta accettati tra voi tre, ma ho deciso di darli al ragazzo con 1 rappresentante. – kquinn

2

Un'altra opzione è verificare quale libreria CRT la DLL collega a depends.exe
MinGW e Cygwin hanno le proprie DLL che sono abbastanza ovvio da riconoscere.
VC6 utilizza MSVCRT.dll solito
qualsiasi versione più recente di VS ha la sua versione accanto al nome del file della DLL:
Msvcr90.dll - VS2008
MSVCR80.dll - VS2005
MSVCR71.dll - VS2003
MSVCR70. dll - VS2002

Non prendere questa lista come guida definitiva poiché questi nomi tendono ad avere strane variazioni, specialmente nell'area di VS2002-2003. Ci sono anche altre DLL come le DLL MFC e ATL che hanno uno schema di versioning simile.

Questo funzionerà fintanto che il PE in realtà dipende dal CRT e non lo ha collegato in modo statico.

Penso che Delphi abbia anche qualche DLL a cui si collega ma non sono proprio sicuro di cosa sia.

Problemi correlati