ASM in C konvertieren (kein Reverse Engineering)

Lesezeit: 9 Minuten

Benutzer-Avatar
Stefan

Ich habe gegoogelt und sehe eine überraschende Menge an leichtfertigen Antworten, in denen der Fragesteller im Grunde ausgelacht wird, weil er eine solche Frage gestellt hat.

Microchip stellt kostenlos Quellcode zur Verfügung (ich möchte ihn hier nicht posten, falls dies ein Nein ist. Grundsätzlich, google AN937, klicke auf den ersten Link und es gibt einen Link für “Quellcode” und es ist eine gezippte Datei). Es ist in ASM und wenn ich es mir ansehe, fange ich an zu schielen. Ich möchte es in etwas umwandeln, das einer AC-Typ-Sprache ähnelt, damit ich folgen kann. Denn Zeilen wie:

GLOBAL  _24_bit_sub
movf    BARGB2,w
subwf   AARGB2,f

sind wahrscheinlich sehr einfach, aber sie sagen mir nichts.

Es mag da draußen einen automatisierten ASM-C-Übersetzer geben, aber alles, was ich finden kann, sind Leute, die sagen, es sei unmöglich. Ehrlich gesagt, es ist unmöglich, dass es unmöglich ist. Beide Sprachen haben eine Struktur und diese Struktur kann sicherlich übersetzt werden.

  • Geben Sie ehrlich gesagt einen Grund an, warum es möglich sein muss.

    – Gerhard

    8. September 2009 um 5:46 Uhr

  • Wenn Sie den Code verstehen wollen, ist der einzige Weg, diese Assemblersprache zu lernen. Die automatisierte Übersetzung gibt Ihnen etwas Unlesbares. Vielleicht sogar noch unlesbarer als Quelle. Und Decompiler (falls vorhanden) können Ihnen nicht helfen, wenn dieser Code handgeschrieben ist (nicht zuerst kompiliert). Aber wenn Sie den Code nur ausführen/portieren möchten, schauen Sie sich meinen Beitrag an.

    – zxcat

    24. September 2009 um 7:51 Uhr

  • @Gerhard Es gibt bereits einen Assembler-zu-C-Compiler namens Boomerang. Einige Assembler-Programme können automatisch nach C dekompiliert werden, wie z dieses hier.

    – Anderson Green

    23. April 2013 um 7:23 Uhr

  • @AndersonGrün. Boomerang sieht interessant aus. Es erstickt ein wenig an komplexerem Code und wird bei der Mikrochip-Montage nicht helfen. Boomerang geht davon aus, dass der Assembler die Ausgabe eines Compilers und kein von Menschen geschriebenes Programm ist. Boomerang gibt Ihnen etwas, mit dem Sie arbeiten können, aber es ist keine End-to-End-Lösung. Für brauchbare Ergebnisse werden Sie es immer noch von Hand bearbeiten.

    – Gerhard

    24. April 2013 um 6:56 Uhr


  • Sowohl C als auch Assembly sind Turing-vollständig. Daher können sie dieselben Dinge ausdrücken. QED

    – Alexander

    5. Oktober 2021 um 10:01 Uhr

Benutzer-Avatar
Oldtimer

Sie können durchaus ein AC-Programm aus Assembler erstellen. Das Problem ist, dass es möglicherweise nicht so aussieht, wie Sie denken, oder vielleicht wird es das. Mein PIC ist rostig, verwendet aber einen anderen Assembler, sagen Sie, Sie hätten es getan

add r1,r2

In C sagen wir, das wird

r1 = r1 + r2;

Vielleicht besser lesbar. Sie verlieren möglicherweise den Sinn für Variablennamen, wenn Werte vom Speicher in die Register und zurück springen und die Register wiederverwendet werden. Wenn Sie über die älteren Bilder sprechen, die zwei Register hatten, einen Akkumulator und einen anderen, nun, es könnte tatsächlich einfacher sein, weil sich die Variablen größtenteils im Speicher befanden, sehen Sie sich die Adresse an, so etwas wie

q = mem[0x12];
e = q;
q = mem[0x13];
e = e + q;
mem[0x12] = e;

Lang und langgezogen, aber es ist klar, dass mem[0x12] = mem[0x12] + Speicher[0x13];

Diese Speicherorte sind wahrscheinlich Variablen, die nicht wie kompilierter C-Code für einen Prozessor mit einer Reihe von Registern herumspringen. Das Bild erleichtert möglicherweise das Herausfinden der Variablen und führt dann eine Suche und Ersetzung durch, um sie in der gesamten Datei zu benennen.

Was Sie suchen, wird als statische Binärübersetzung bezeichnet, nicht unbedingt eine Übersetzung von einer Binärdatei in eine andere (ein Prozessor zu einem anderen), sondern in diesem Fall eine Übersetzung von pic-Binärdatei nach C. Idealerweise möchten Sie den in angegebenen Assembler nehmen app note und fügen Sie es mit den Mikrochip-Tools zu einer Binärdatei zusammen, und führen Sie dann die Übersetzung durch. Sie können auch dynamische Binärübersetzungen durchführen, aber Sie werden noch seltener eine davon finden, und normalerweise führt dies nicht zu C, sondern von einer Binärdatei zur anderen. Haben Sie sich jemals gefragt, wie diese 15-Dollar-Joysticks im Wal-Mart mit Pac-Man und Galaga funktionieren? Das Rom aus der Spielhalle wurde mittels statischer Binärübersetzung konvertiert, optimiert und aufgeräumt und das C oder eine andere Zwischensprache für den neuen Zielprozessor in der Handheld-Box kompiliert. Ich kann mir vorstellen, dass nicht alle auf diese Weise gemacht wurden, aber ich bin mir ziemlich sicher, dass einige es waren.

Die Millionen-Dollar-Frage, können Sie einen statischen binären Übersetzer für ein Bild finden? Wer weiß, wahrscheinlich müssen Sie selbst einen schreiben. Und raten Sie mal, was das bedeutet, Sie schreiben einen Disassembler, und anstatt in eine Anweisung in der nativen Assembler-Syntax wie add r0,r1 zu disassemblieren, lassen Sie Ihren Disassembler r0=r0+r1 ausgeben; Wenn Sie diesen Disassembler beendet haben, werden Sie die Assemblersprache von pic jedoch so gut kennen, dass Sie den Übersetzer von asm nach C nicht benötigen werden. Du hast ein Henne-Ei-Problem.

  • Gute Argumente; +1 für Ihre Erklärungen. Aber ich glaube nicht, dass es 100% automatisch gemacht werden kann. Denn in Assembler kann der Code jedes Bit der CPU nutzen. So können beispielsweise Seiteneffekte wie das Setzen von Null-, Übertrags- und Vorzeichenbits an beliebigen Stellen im Code verwendet werden. Diese sind normalerweise in C nicht sichtbar. Ein solcher Übersetzer müsste also die beabsichtigten von den nicht beabsichtigten Änderungen filtern. Virtualisierung ist einfacher, da sie kein Verständnis des Codes erfordert, sondern nur die CPU modelliert.

    – Adrian

    7. September 2009 um 13:46 Uhr

  • Dies kann zu 100 % automatisch und unter Beibehaltung der Semantik erfolgen. Der Codierungsstil und andere Konventionen gehen dagegen vollständig verloren (weil sie implizit sind).

    – Michael Foukarakis

    15. September 2009 um 8:27 Uhr

Das bekommen genau gleich Quellcode zurück aus einem kompilierten Programm ist grundsätzlich unmöglich. Aber Decompiler waren ein Forschungsgebiet in der Informatik (z der DCC-Decompilerdas ein Promotionsprojekt war).

Es gibt verschiedene Algorithmen, die verwendet werden können, um einen Musterabgleich für Assemblercode durchzuführen und äquivalenten C-Code zu generieren, aber es ist sehr schwierig, dies auf eine allgemeine Weise zu tun, die für alle Eingaben gut funktioniert.

Vielleicht möchten Sie auschecken Boomerang für eine halb neue Open-Source-Bemühung um einen verallgemeinerten Decompiler.

  • Ich habe zu früh gesprochen. Erstens, als ich “funktionierte” schrieb, war es ein Tippfehler – angeblich “funktioniert”. Ich las ihre Seiten durch, hatte es aber nicht wirklich ausprobiert. Jetzt, wo ich es habe, funktioniert es überhaupt nicht! Es ist definitiv für Reverse Engineering, da es NUR (dummerweise) eine Binärdatei akzeptiert. Seufzen. Vielleicht ist “Decompiler” nicht das, wonach ich suche, sondern einfach ein “Übersetzer”

    – Stefan

    4. September 2009 um 6:07 Uhr

  • @Steven: – könntest du den Code nicht kompilieren und dann mit Boomerang dekompilieren?

    – a_m0d

    8. September 2009 um 7:19 Uhr

  • Sieht so aus, als ob Boomerang diese CPU nicht unterstützt: boomerang.sourceforge.net/FAQ.php#whatbinary also wird die Kompilierung nicht helfen

    – zxcat

    18. September 2009 um 18:23 Uhr

  • Sie würden nicht zuerst kompilieren wollen, wenn Sie tatsächlich den Quellcode haben. Es wird allgemein angenommen, dass das Übersetzen von Code zu einer besseren Ausgabe führt.

    – JM Becker

    15. November 2011 um 5:38 Uhr

  • Es gibt jetzt viele andere Möglichkeiten als Boomerang (das 2009 von “bobbymcr” erwähnt wurde). Check-out neuer Radar2(r2), das ist ein Decompiler+Disassembler+Debugger. Und für mehr: 1. goto “Liste der Transpiler“, dann gibt es unten mehr Decompiler usw.

    – beiErik

    30. Oktober 2020 um 1:46 Uhr

Ich habe einmal an einem Projekt gearbeitet, bei dem ein erheblicher Teil des geistigen Eigentums einige ernsthafte Algorithmen waren, die in x86-Assemblercode codiert waren. Um den Code auf ein eingebettetes System zu portieren, hat der Entwickler dieses Codes (nicht ich) ein Tool von einem Unternehmen namens MicroAPL verwendet (wenn ich mich richtig erinnere):

Ich war sehr, sehr überrascht, wie gut das Tool funktionierte.

Auf der anderen Seite denke ich, dass es eines dieser Dinge ist, “wenn Sie fragen müssen, können Sie es sich nicht leisten” (ihre Preisspannen für eine einmalige Konvertierung eines Projekts reichen bis zu etwa 4 bearbeiteten Montagelinien für einen Dollar).

Aber oft sind die Assembler-Routinen, die Sie von einem Anbieter erhalten, als Funktionen gepackt, die von C aus aufgerufen werden können. Solange die Routinen also das tun, was Sie wollen (auf dem Prozessor, den Sie verwenden möchten), müssen Sie sie möglicherweise nur assemblieren und vergiss sie mehr oder weniger – es sind nur Bibliotheksfunktionen, die du von C aus aufrufst.

  • ja, es soll nur aufgerufen werden. Die Sache ist die, wir haben bereits eine selbst entwickelte PID, die mehr oder weniger gut funktioniert. Ich möchte sehen, ob ihre Implementierung irgendwelche Vorteile bietet. Ich weiß nicht, ob Sie jemals eine PID-Steuerung eingestellt haben, aber es ist sehr mühsam und zeitaufwändig, daher lohnt es sich, mich davon zu überzeugen, dass es einen Grund gibt, es zu tun, anstatt es nur zu verwenden und auf das Beste zu hoffen. auf der anderen Seite… es lohnt sich nicht, etwas dafür zu bezahlen 🙂

    – Stefan

    4. September 2009 um 5:51 Uhr

Du kippen deterministisch Konvertieren Sie Assembler-Code in C. Interrupts, sich selbst modifizierender Code und andere Dinge auf niedriger Ebene haben keine andere Darstellung als die Inline-Assemblierung in C. Es gibt nur einen gewissen Umfang, in dem ein Assembly-zu-C-Prozess funktionieren kann. Ganz zu schweigen davon, dass der resultierende C-Code wahrscheinlich schwieriger zu verstehen sein wird, als den Assembler-Code tatsächlich zu lesen … es sei denn, Sie verwenden dies als Grundlage, um mit der Neuimplementierung des Assembler-Codes in C zu beginnen, dann ist es einigermaßen nützlich. Sehen Sie sich das Hex-Rays-Plugin für IDA an.

Ja, es ist sehr gut möglich, Assembler-Code in C mit guter Qualität zurückzuentwickeln.

Ich arbeite für MicroAPL, eine Firma, die ein Tool namens Relogix herstellt, um Assembler-Code in C zu konvertieren. Es wurde in einem der anderen Beiträge erwähnt.

Bitte sehen Sie sich die Beispiele auf unserer Website an:

http://www.microapl.co.uk/asm2c/index.html

Benutzer-Avatar
kquinn

Es muss da draußen einen automatisierten ASM-C-Übersetzer geben, aber alles, was ich finden kann, sind Leute, die sagen, es sei unmöglich. Ehrlich gesagt, es ist unmöglich, dass es unmöglich ist.

Nein, ist es nicht. Bei der Kompilierung gehen Informationen verloren: Der endgültige Objektcode enthält weniger Informationen als der C-Quellcode. Ein Decompiler kann diese Informationen nicht auf magische Weise aus dem Nichts erzeugen, und daher ist eine echte Dekompilierung unmöglich.

Benutzer-Avatar
a_m0d

Es ist nicht unmöglich, nur sehr schwer. Ein erfahrener Assembler- und C-Programmierer könnte dies wahrscheinlich tun, oder Sie könnten sich die Verwendung von a ansehen Decompiler. Einige davon leisten ziemlich gute Arbeit bei der Konvertierung von asm nach C, obwohl Sie wahrscheinlich einige Variablen und Methoden umbenennen müssen.

Kasse Diese Seite für eine Liste von Decompilern, die für die x86-Architektur verfügbar sind.

1375630cookie-checkASM in C konvertieren (kein Reverse Engineering)

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

Privacy policy