Kann ich feststellen, welche Version von Visual Studio zum Erstellen einer DLL verwendet wurde, indem ich die DLL selbst untersuche

Lesezeit: 4 Minuten

Benutzeravatar von George
George

Ich muss eine DLL neu erstellen, die vor Jahren zuletzt erstellt wurde. Ich habe den ursprünglichen C-Quellcode, aber nicht das Visual Studio-Projekt oder die Projektmappe. Ich möchte versuchen, es neu zu erstellen, indem ich dieselbe Visual Studio-Version verwende, die ursprünglich verwendet wurde. Ich kann sagen, dass dies eine einfache alte Windows-DLL ist, nicht .NET. Ich weiß auch, dass der Quellcode in C ist. Gibt es noch etwas, was ich über die ursprüngliche Build-Umgebung und die Tools sagen kann, indem ich die DLL-Binärdatei untersuche?

Vielen Dank!

Benutzeravatar von Cody Gray
Cody Grey

Sicher, das ist absolut möglich. Der Schlüssel ist, dass alle Bilder im PE-Format (das Windows-Format für ausführbare Binärdateien, einschließlich DLLs und EXEs) Header haben, die Attribute und andere Informationen über die Binärdatei selbst enthalten. Die Toolchain von Microsoft legt immer Felder in diesem Header fest, die die Version der Tools angeben, die zum Erstellen verwendet wurden. Sie können also einfach diesen Header ausgeben und diese Felder untersuchen, um herauszufinden, was Sie wissen möchten.

Es gibt zwar Anwendungen von Drittanbietern, die diese Informationen für Sie extrahieren und verschönern können, aber wenn Sie eine Version von Visual Studio oder das Windows SDK installiert haben, ist dumpbin der einfachste Weg, um darauf zuzugreifen. Öffnen Sie eine Visual Studio-Eingabeaufforderung, geben Sie ein dumpbin /headers <path to your DLL>und drücke Eintreten. Sie erhalten eine große Liste von Header-Daten; Lassen Sie sich davon nicht einschüchtern, Sie interessieren sich nur für ein paar Bereiche.

Scrollen Sie nach oben. Bei einer DLL sehen Sie, dass der Dateityp (offensichtlich) eine DLL ist. Auch die erste Eigenschaft im Abschnitt “FILE HEADER VALUES” ist manchmal interessant: Sie sagt Ihnen, ob die DLL für einen 32-Bit- oder einen 64-Bit-Computer ist. Suchen Sie dann im nächsten Abschnitt “OPTIONALE LINKER-WERTE” nach dem Feld “Linker-Version”. Dies wird, wie ich bereits erwähnt habe, von allen Microsoft-Linkern mit der Version des Linkers ausgefüllt, der zum Erstellen der Binärdatei verwendet wurde. Das Format ist major.minor, also ist 14.00 Visual Studio 2015, 10.00 ist Visual Studio 2010 usw. Es gibt eine Tabelle dieser Versionsnummern auf Wikipedia (Die gewünschte Spalte ist hier mit “Versionsnummer” beschriftet, da Sie die Version der Linker, nicht die Version des Compilers, cl.exe). Andere potenziell interessante Felder hier sind die „Betriebssystemversion“ und/oder „Subsystemversion“ – diese geben an, für welche Version von Windows die Binärdatei erstellt wurde. Beispielsweise bedeutet 10.00 Windows 10, 5.01 bedeutet Windows XP und so weiter. Wieder sehen Wikipedia für eine Tabelle mit Windows-Versionsnummern.

Eine weitere relevante Information könnte sein, welche Version der C-Laufzeitbibliothek (CRT) Ihre Binärdatei verknüpft (vorausgesetzt, dass sie tatsächlich mit der CRT verknüpft ist). Sie können dies auch mit dumpbin ermitteln, aber diesmal mit Blick auf die Importe. (Oder Sie können etwas wie verwenden Process Explorer um eine hübsch gedruckte Auflistung zu erhalten.) Run dumpbin /imports <path to your DLL>, und scrollen Sie dann durch die Liste und suchen Sie nach etwas, das mit “MSVCR” beginnt. Der Rest des Namens gibt die Versionsnummer an. MSVCR80 bedeutet VC++ 8 oder VS 2005. MSVCR90 bedeutet VC 9 oder VS 2008. MSVCR100 bedeutet VC 10 oder VS 2010. Und so weiter.

All dies funktioniert auch dann, wenn Symbole aus der Binärdatei entfernt wurden.

  • Danke, Codi. Ich habe Linker-Version 9.0, Betriebssystem-Version 5.00 und Subsystem-Version 5.00. Sieht aus wie Visual Studio 2008. Unter Imports sehe ich mehrere Funktionen, die aus KERNEL32.dll importiert wurden, aber sonst nichts. Bedeutet das unbedingt, dass die C-Laufzeit statisch gelinkt wurde? Oder ist es möglich, dass die DLL überhaupt keine C-Laufzeit benötigt, obwohl sie in C geschrieben wurde? Es scheint möglich zu sein, festzustellen, ob die C-Laufzeit statisch in der DLL enthalten war, oder?

    – George

    27. November 2016 um 18:35 Uhr

  • @George – aber du hast src code – also kann easy view crt verwendet werden. und nicht zwingend dieselbe Version von VS verwenden – dies ist nur Shell. Der Kompilierungs-/Verknüpfungsprozess hing wirklich von der cl.exe/link.exe-Version ab, aber im Allgemeinen ist er abwärtskompatibel – alter Code wird normalerweise mit neuerer CL kompiliert, aber sehr wahrscheinlich viele neue Warnungen. Das Hauptproblem kann mit crt sein, wenn es verwendet wird – Sie benötigen möglicherweise alte crt-Header/Libs. wenn nicht crt – schneller von allem können Sie jedes VS mit jedem cl/link einbauen

    – RbMm

    27. November 2016 um 20:49 Uhr

  • Vielen Dank an euch beide. Es baut und funktioniert jetzt mit Visual Studio 2008.

    – George

    27. November 2016 um 20:52 Uhr

  • Kurzes Update dazu, diese Interpretation der VS-Versionstabelle in diesem Wiki stimmt nicht ganz mit Codys Antwort im Jahr 2017 und darüber hinaus überein. In VS 2017 ist die VS IDE-Version 15.xx, aber die VC++-Toolset-Versionen (es gibt jetzt tatsächlich mehr als eine) ist entweder 14.11 oder 14.12, je nach Update, <=15.4 bzw. >15.4, Stand heute. Die Linker-Version, die Sie aus den PE-Headern erhalten, entspricht den VC++-Toolset-Versionen, nicht den VS-Versionen.

    – listig

    15. März 2018 um 13:41 Uhr


  • Hier ist eine genauere Tabelle: mariusbancila.ro/blog/2015/08/12/…

    – listig

    15. März 2018 um 13:43 Uhr

1433240cookie-checkKann ich feststellen, welche Version von Visual Studio zum Erstellen einer DLL verwendet wurde, indem ich die DLL selbst untersuche

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy