Frage

I reagiert auf eine andere Frage über in nicht-Objective-C Sprachen für das iPhone zu entwickeln, und ich machte die Behauptung, dass unter Verwendung von, sagen wir, C # schreiben für das iPhone wäre ein Apple-Kritiker falsch schlagen. Ich war unterschiedlich zwischen dem ObjC und C # -Bibliotheken in Frage weitgehend über UI-Elemente sprechen, aber ein Kommentator hat einen interessanten Punkt, was mich zu dieser Frage:

Ist es möglich, die Sprache ein Programm geschrieben in, allein aus ihrer binären? , um festzustellen, ob es solche Methoden, was sie sind?

Lassen Sie sich für die Zwecke der Frage annehmen:

  • Das aus einer Interaktion Standpunkt (Konsole Verhalten, jede GUI Aussehen, etc.) sind die beiden identisch.
  • Das erzielte Performance ist kein verlässlicher Indikator für die Sprache (kein Vergleich, sagen wir, Java zu C).
  • , dass Sie nicht einen Dolmetscher oder etwas zwischen Ihnen haben und die Sprache -. Nur rohe ausführbare Binärdatei

Bonuspunkte, wenn Sie sind sprachunabhängig wie möglich.

War es hilfreich?

Lösung

Ich bin kein Compiler Hacker (einen Tag, so hoffe ich), aber ich glaube, dass Sie verräterische Zeichen in einer Binärdatei finden möglicherweise in der Lage, das, was Compiler erzeugte es und einige der Compiler-Optionen verwendet werden, wie anzeigen würde, als das Niveau der Optimierung angegeben.

Genau genommen aber, was Sie fragen, ist unmöglich. Es könnte sein, dass jemand mit einem Stift und Papier setzte sich und arbeitete die Binärcodes entsprechend dem Programm, die sie schreiben wollte, und tippte dann das Zeug in einem Hex-Editor aus. Grundsätzlich würden sie ohne das Assembler-Tool in der Montage werden die Programmierung. In ähnlicher Weise können Sie nie in der Lage sein, mit Sicherheit zu sagen, ob ein native binären in gerade Assembler geschrieben wurde oder in C mit Inline-Montage.

Wie für Umgebungen mit virtuellen Maschinen wie JVM und .NET, sollten Sie in der Lage sein, die VM durch den Byte-Codes in der binären ausführbaren Datei zu identifizieren, würde ich erwarten. Allerdings können Sie nicht in der Lage zu sagen, was die Ausgangssprache war, wie C # im Vergleich zu Visual Basic, es sei denn, es gibt besondere Compiler Macken, die Spitze Sie aus.

Andere Tipps

Kurze Antwort: YES

Lange Antwort:

.

Wenn Sie an einem binären schauen, können Sie die Namen der Bibliotheken finden, die in Verbindung gebracht wurden Eröffnung cmd.exe in TextPad findet leicht die folgende an hex Offset 0x270: msvcrt.dll, KERNEL32.dll, NTDLL.DLL , USER32.dll usw. msvcrt ist die Microsoft 'C' Runtime-Support-Funktionen. KERNEL32, NTDLL und USER32.dll sind betriebssystemspezifische Bibliotheken, die Ihnen sagen, entweder die Zielplattform oder die Plattform, auf der sie gebaut wurde, je nachdem, wie gut die plattformübergreifende Entwicklungsumgebung segregiert die beiden.

Zur Einstellung dieser Hinweise beiseite, die meisten jeder C / C ++ Compiler die Namen der Funktionen in den binären einfügen müssen, gibt es eine Liste aller Funktionen (oder Einstiegspunkte) in einer Tabelle gespeichert. C ++ ‚Mangeln‘ die Funktionsnamen, die Argumente und ihre Typen zu codieren, um überladene Methoden zu unterstützen. Es ist möglich, die Funktionsnamen zu verschleiern, aber sie würden immer noch existieren. Die Funktionen Unterschriften würden die Anzahl und Typen der Argumente enthalten, die verwendet werden können, in das System oder interne Anrufe im Programm verwendet zu verfolgen. Bei 0x4190 Offset „SetThreadUILanguage“, die gesucht werden können viel über die Entwicklungsumgebung . Ich fand die Entry-Point-Tabelle bei Offset 0x1ED8A. Ich kann leicht sehen, Namen wie printf, Ausgang und scanf; zusammen mit __p__fmode, __p__commode und __initenv

Jede ausführbare Datei für den x86-Prozessor wird ein Datensegment hat die statischen Text enthält, die in dem Programm aufgenommen wurden. Zurück zu cmd.exe (Offset 0x42C8) ist der Text "S.o.f.t.w.a.r.e..P.o.l.i.c.i.e.s..M.i.c.r.o.s.o.f.t..W.i.n.d.o.w.s..S.y.s.t.e.m.". Der String dauert doppelt so viele Zeichen wie normalerweise erforderlich ist, weil es doppelt breites Zeichen gespeichert wurde mit, wahrscheinlich für die Internationalisierung. Fehlercodes oder Meldungen sind eine wichtige Quelle hier.

Am Offset B1B0 ist "p.u.s.h.d", gefolgt von mkdir, rmdir, chdir, md, rd, und cd; Ich ließ die nicht druckbare Zeichen für die Lesbarkeit aus. Das sind alle Befehlsargumente zu cmd.exe.

Bei anderen Programmen habe ich manchmal in der Lage gewesen, den Weg zu finden, von dem ein Programm kompiliert wurde.

Also, Ja ist es möglich, die Ausgangssprache aus dem binären zu bestimmen.

Ich erwarte, dass Sie könnten, wenn Sie die Quelle zu zerlegen oder zumindest können Sie die Compiler wissen, da nicht alle Compiler den gleichen Code für printf beispielsweise verwenden, so Objective-C und Gnu C sollte hier unterscheiden.

Sie ausgeschlossen haben alle Bytecode-Sprachen so dass dieses Problem weniger häufig sein wird als erwartet.

Führen Sie zuerst what auf einigen Binärdateien und Blick auf den Ausgang. CVS (und SVN) Identifikatoren sind über das binäre Bild verstreut. Und die meisten von ihnen sind aus Bibliotheken.

Außerdem gibt es oft eine „Karte“ an die verschiedenen Bibliotheksfunktionen. Das ist ein großer Hinweis, auch.

Wenn die Bibliotheken in die ausführbare Datei verknüpft sind, gibt es oft eine Karte, die mit Namen und Offsets in der Binärdatei enthalten ist. Es ist ein Teil „Position unabhängigen Code“ zu schaffen. Sie können nicht einfach „hard-link“ die verschiedenen Objektdateien zusammen. Sie brauchen eine Karte, und Sie müssen einige Lookups tun, wenn das binäre in den Speicher geladen werden.

Schließlich wird das Start-up-Modul für C, C ++ (und ich denke, C #) ist einzigartig für diese defaiult Set Compiler von Bibliotheken.

was ist mit diesen Tools:

PE Detective

PEiD

beide PE Identifiers. ok, sie sind beide für Fenster, aber das ist, was es war, als ich hier gelandet

Nun, C konvertiert zunächst das ASM, so dass Sie alle C-Code in ASM schreiben konnte.

Nein, die Bytecode sprachunabhängig. Verschiedene Compiler könnten sogar die gleiche Code Quelle nehmen und verschiedene Binaries erzeugen. Deshalb sollten Sie nicht für allgemeine Zwecke decompilers sehen, die auf Binärdateien arbeiten.

Der Befehl ‚Strings‘ verwendet werden könnte einige Hinweise zu bekommen, was Sprache verwendet wurde (zum Beispiel, ich lief es gerade auf dem gestrippt binären für eine C-Anwendung Ich schrieb und die ersten Einträge es sind die verknüpften Bibliotheken findet durch die ausführbare Datei).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top