Extrahieren Sie statisch verknüpfte Bibliotheken aus einer ausführbaren Datei

8

Ich bin mir nicht sicher, ob das überhaupt möglich ist, aber bei einer ausführbaren Datei (foo.exe), mit vielen Bibliotheken, die statisch verknüpft wurde.

Gibt es Software, die aus dieser Datei die .lib (oder .a) extrahiert, die in der ausführbaren Datei liegt?

Danke.

    
HyLian 13.11.2009, 12:33
quelle

3 Antworten

15

Unglaublich unwahrscheinlich, da normalerweise nicht der gesamte Inhalt der Bibliothek in Ihre ausführbare Datei eingefügt wird.

Sie bekommen nur genug, um alle undefinierten Symbole zu erfüllen. Dies kann tatsächlich nur ein kleiner Teil der Bibliothek sein. Eine Bibliothek besteht in der Regel aus einer Reihe von Objektdateien, von denen nur die benötigten in die ausführbare Datei eingebunden sind.

Wenn beispielsweise in der C-Laufzeitbibliothek nur exit() aufgerufen wurde, ist es sehr unwahrscheinlich, dass Sie die printf() -Familie von Funktionen in Ihrer ausführbaren Datei haben.

Wenn Sie direkt mit den Objektdateien verknüpft haben, haben Sie möglicherweise eine Chance, da sie eingeschlossen werden würden, ob sie verwendet werden oder nicht (es sei denn, Ihr Linker ist ein intelligenter Linker).

Aber selbst das wäre eine Herkulesaufgabe, da es in der ausführbaren Datei keine Informationen darüber gibt, welche Codeabschnitte von bestimmten Objektdateien stammen. Es ist potentiell machbar, aber wenn es einen anderen Weg gibt, würde ich das zuerst betrachten.

Lassen Sie mich den typischen Prozess verdeutlichen:

  1. Vier Objektdateien, a.o , b.o , c.o und d.o enthalten jeweils die Funktionen a() , b() , c() und d() . Sie werden alle zum abcd.a Archiv hinzugefügt.
  2. Sie sind alle unabhängig (keine Abhängigkeiten), außer dass b() c() .
  3. aufruft
  4. Sie haben ein Hauptprogramm, das a() und b() aufruft und Sie kompilieren es dann verknüpfen Sie es mit der abcd.a Bibliothek.
  5. Der Linker zieht a.o und b.o aus der Bibliothek in Ihre ausführbare Datei und erfüllt damit die Anforderungen für a() und b() , wobei c() erforderlich ist, weil b() es benötigt.
  6. Der Linker zieht dann c.o aus der Bibliothek in Ihre ausführbare Datei und erfüllt damit die Anforderung von c() . Jetzt sind alle nicht definierten Symbole erfüllt, die ausführbare Datei ist fertig und abgestaubt, Sie können sie ausführen, wenn Sie fertig sind.

Zu keiner Zeit in diesem Prozess wurde d.o in Ihre ausführbare Datei gezogen, sodass Sie keine Hoffnung haben, es herauszubekommen.

Update: "Wenn es einen anderen Weg gibt, würde ich mir den ersten" Kommentar ansehen, den ich oben gemacht habe, haben Sie gerade in einem Kommentar zu einem gesagt der anderen Antworten, dass Sie den Quellcode haben, der die gewünschten Bibliotheken erstellt hat. Ich muss fragen: Warum können Sie die Bibliotheken mit dieser Quelle nicht wiederherstellen? Das scheint mir eine viel einfachere Lösung zu sein, als zu versuchen, die Bibliotheken aus einem Morast von ausführbarem Code wiederherzustellen.

    
paxdiablo 13.11.2009, 12:37
quelle
1

Stellen Sie sich 10 Bücher in einer Sprache vor, die Sie nicht verstehen, ohne Cover, Titelseiten, Seitenzahlen und Kapitel. Einige der Bücher können unvollständig sein. Alle Seiten werden zusammengemischt, so dass es unmöglich ist herauszufinden, wo Anfang und Ende jedes Buches sind (jede Seite ist ein Funktionsaufruf) Versuchen Sie nun Seite 123 von Buch 5 zu finden (sagen wir es oben Funktion Exit () ).

Nun, es ist möglich ...

    
beermann 13.11.2009 13:09
quelle
-1

Es sieht so aus, als würden Sie nach einem Decompiler fragen. Solche Tools sind schwierig zu verwenden (wahrscheinlich unmöglich für leicht ausgeklügeltes C ++) und wenn es eine andere Möglichkeit gibt, Ihr Problem zu lösen, einschließlich ein paar Monate, um die Bibliotheken neu zu schreiben, würde ich diese Vorgehensweise empfehlen.

Wie pax darauf hingewiesen hat, würden Sie, selbst wenn Sie einen Decompiler verwenden würden, nur die Bibliotheksfunktionen erhalten, die die ausführbare Datei aufgerufen hat.

    
Dan Hook 13.11.2009 12:48
quelle

Tags und Links