wake-up-neo.com

aSM in C konvertieren (kein Reverse Engineering)

Ich googelte, und ich sehe eine überraschende Menge flippiger Antworten, die im Grunde über den Fragesteller lachen, weil er eine solche Frage gestellt hatte.

Microchip stellt Quellcode kostenlos zur Verfügung (ich möchte ihn hier nicht veröffentlichen, falls dies ein Nein ist. Im Allgemeinen, google AN937, klicken Sie auf den ersten Link und es gibt einen Link für "Quellcode" und eine gezippte Datei). Es ist in ASM und wenn ich es betrachte, fange ich an, schielend. Ich würde es gerne in etwas konvertieren, das einer c-artigen Sprache ähnelt, damit ich es mitverfolgen kann. Weil Linien wie:

GLOBAL  _24_bit_sub
movf    BARGB2,w
subwf   AARGB2,f

sind wahrscheinlich sehr einfach, aber sie bedeuten mir nichts.

Es muss einen automatisierten ASM-zu-C-Übersetzer geben, aber ich kann nur sagen, dass die Leute sagen, es sei unmöglich. Ehrlich gesagt ist es unmöglich, dass es unmöglich ist. Beide Sprachen haben eine Struktur und diese Struktur kann sicherlich übersetzt werden.

danke dir.

21
Steven

Sie können absolut ein c-Programm aus Assembler erstellen. Das Problem ist, dass es vielleicht nicht so aussieht, wie Sie denken, oder vielleicht auch. Mein PIC ist rostig, aber ich habe einen anderen Assembler benutzt

add r1,r2

In C sagen wir das wird

r1 = r1 + r2;

Möglicherweise lesbarer. Sie verlieren möglicherweise den Sinn für Variablennamen, wenn Werte vom Speicher zu den Registern und zurück springen und die Register wiederverwendet werden. Wenn Sie über die älteren Bilder sprechen, die zwei Register eines Akkumulators und ein anderes enthielten, könnte es tatsächlich einfacher sein, da sich Variablen meist im Speicher befanden. Sehen Sie sich die Adresse an 

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] + mem [0x13];

Diese Speicherstellen sind wahrscheinlich Variablen, die nicht wie kompilierter C-Code für einen Prozessor mit einer Reihe von Registern herumspringen. Das Bild macht es möglicherweise einfacher, die Variablen herauszufinden und anschließend zu suchen und zu ersetzen, um sie in der gesamten Datei zu benennen.

Was Sie suchen, ist eine statische binäre Übersetzung, nicht notwendigerweise eine Übersetzung von einer binären in eine andere (von einem Prozessor auf einen anderen), aber in diesem Fall eine Übersetzung von pic binary in C. Idealerweise möchten Sie den Assembler aus dem App Notizen und zusammen mit den Mikrochip-Tools zu einer Binärdatei zusammenstellen, dann die Übersetzung durchführen. Sie können auch eine dynamische Binärübersetzung ausführen, aber Sie finden wahrscheinlich noch seltener eine davon, und dies führt normalerweise nicht zu C, sondern zu einem binären zu einem anderen. Haben Sie sich jemals gefragt, wie die 15-Dollar-Joysticks von Wal-Mart mit Pac-Man und Galaga funktionieren? Die ROM aus der Arkade wurde mithilfe einer statischen Binärübersetzung konvertiert, optimiert und bereinigt und die 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 es einige waren.

Die Millionenfrage, können Sie einen statischen Binärübersetzer für ein Bild finden? Wer weiß, Sie müssen wahrscheinlich selbst eine schreiben. Und ratet mal, was das bedeutet, Sie schreiben einen Disassembler, und anstatt eine Anweisung in der nativen Assemblersyntax wie add r0, r1 zu zerlegen, müssen Sie Ihren Disassembler ausdrucken. R0 = r0 + r1; Wenn Sie mit dem Disassembler fertig sind, kennen Sie die Sprache der Bildmontage so gut, dass Sie den asm to C-Übersetzer nicht benötigen. Sie haben ein Problem mit Hühnern und Eiern.

37
old_timer

Den exakt gleichen - Quellcode von einem kompilierten Programm zurückzubekommen, ist grundsätzlich unmöglich. Dekompilierer waren jedoch ein Forschungsgebiet in der Informatik (z. B. der dcc-Dekompiler , das ein Promotionsprojekt war).

Es gibt verschiedene Algorithmen, mit denen Sie Mustercode für Assembly-Code anpassen und äquivalenten C-Code generieren können. Es ist jedoch sehr schwierig, dies auf eine allgemeine Weise zu tun, die für alle Eingaben gut funktioniert.

Sie möchten vielleicht Boomerang für einen kürzlich in Anspruch genommenen Open Source-Versuch bei einem generalisierten Decompiler überprüfen.

17
bobbymcr

Sie können nicht deterministisch Assembly-Code in C konvertieren. Interrupts, selbstmodifizierender Code und andere untergeordnete Dinge haben keine Repräsentation anders als Inline-Assembly in C. Es gibt nur ein gewisses Maß, in dem ein Assembly-to-C-Prozess funktionieren kann. Ganz zu schweigen von dem resultierenden C-Code, der wahrscheinlich schwerer zu verstehen ist als das tatsächliche Lesen des Assembly-Codes. Wenn Sie dies nicht als Grundlage für die Neuimplementierung des Assembly-Codes in C verwenden, ist dies etwas nützlich. Schauen Sie sich das Hex-Rays-Plugin für IDA an.

Ich habe einmal an einem Projekt gearbeitet, bei dem ein erheblicher Teil des geistigen Eigentums aus ernsthaften Algorithmen bestand, die in x86-Assembly-Code codiert waren. Um den Code auf ein Embedded-System zu portieren, hat der Entwickler dieses Codes (nicht ich) ein Tool aus einem Outfit namens MicroAPL verwendet (wenn ich mich recht erinnere):

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

Auf der anderen Seite denke ich, dass es eines dieser Dinge ist, "wenn Sie fragen müssen, dass Sie es sich nicht leisten können" (die Preisspannen für eine einmalige Konvertierung eines Projekts werden auf etwa 4 Zeilen der Baugruppe abgearbeitet) für einen Dollar).

Oft werden jedoch die Assembly-Routinen, die Sie von einem Hersteller erhalten, als Funktionen gepackt, die von C aus aufgerufen werden können. Solange die Routinen das tun, was Sie möchten (auf dem Prozessor, den Sie verwenden möchten), müssen Sie sie möglicherweise nur zusammenstellen mehr oder weniger über sie vergessen - es sind nur Bibliotheksfunktionen, die Sie von C aus aufrufen.

7
Michael Burr

Ja, es ist sehr gut möglich, Assembler-Code auf gute Qualität C zurückzusetzen.

Ich arbeite für eine MicroAPL, ein Unternehmen, das ein Tool namens Relogix zur Konvertierung von Assembler-Code in C herstellt. In einem der anderen Beiträge wurde es erwähnt.

Bitte schauen Sie sich die Beispiele auf unserer Website an:

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

7
Simon Marsden

Es muss einen automatisierten ASM-zu-C-Übersetzer geben, aber ich kann nur sagen, dass die Leute sagen, es sei unmöglich. Ehrlich gesagt ist es 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.

6
kquinn

Es ist nicht unmöglich, nur sehr schwer. Ein erfahrener Assembly- und C-Programmierer könnte dies wahrscheinlich tun, oder Sie könnten einen Decompiler verwenden. Einige von ihnen können die asm in C konvertieren, obwohl Sie einige Variablen und Methoden wahrscheinlich umbenennen müssen.

Check out this site für eine Liste der für die x86-Architektur verfügbaren Dekompilierer.

4
a_m0d

Schauen Sie sich das an: Decompiler

Ein Decompiler ist der Name einer Computerprogramm, das die .__ ausführt. umgekehrter Vorgang zu dem eines Compiler. Das heißt, es übersetzt eine Datei mit Informationen unter a relativ geringer Abstraktionsgrad (In der Regel als Computer konzipiert lesbar und nicht für Menschen lesbar.) in eine Form mit einer höheren Stufe von Abstraktion (normalerweise als ___ lesbar).

3

Nicht leicht möglich. 

Einer der großen Vorteile von C gegenüber ASM war, abgesehen von der Lesbarkeit, "clevere" Programmier-Tricks.

Es gibt zahlreiche Dinge, die Sie in Assembler tun können, die kein direktes C-Äquivalent, Oder eine verschlungene Syntax in C. enthalten.

Das andere Problem sind Datentypen. Die meisten Assembler haben im Wesentlichen nur zwei austauschbare Datentypen: Bytes und Wörter. Es kann einige Sprachkonstrukte geben, um Ints und Floats zu definieren Etc. Es wird jedoch nicht geprüft, ob der Speicher wie definiert verwendet wird. Daher ist es sehr schwierig, ASM-Speicher C-Datentypen zuzuordnen. 

Außerdem ist der gesamte Assembler-Speicher im Wesentlichen eine "struct"; Der Speicher wird in der Reihenfolge angelegt, in der er definiert ist (im Gegensatz zu C, wenn der Speicher nach Belieben der Laufzeit geordnet wird). Viele ASM-Programme hängen vom genauen Speicherlayout ab. Um denselben Effekt in C zu erzielen, müssen Sie den gesamten Speicher als Teil einer einzelnen Struktur definieren. 

Es gibt auch viele abgelehnte Anweisungen (auf alten Welten stellte IBM die LA-Adresse, Ladeadresse her, die Anweisung wurde normalerweise verwendet, um einfache Rechenoperationen auszuführen, da sie schneller war und kein Überlaufregister benötigte).

Während es technisch möglich sein könnte, nach C zu übersetzen, wäre der resultierende C-Code weniger lesbar als der ASM-Code, der übertragen wurde. 

3
James Anderson

Ich kann mit 99% Garantie sagen, dass es keinen fertigen Konverter für diese Assembler-Sprache gibt, so dass Sie einen schreiben müssen. Sie können es einfach implementieren, indem Sie den ASM-Befehl mit der C-Funktion ersetzen:

movf    BARGB2,w -> c_movf(BARGB2,w);
subwf   AARGB2,f -> c_subwf(AARGB2,f);

Dieser Teil ist einfach:) Dann müssen Sie jede Funktion implementieren. Sie können Register als global deklarieren, um die Sache zu vereinfachen. Sie können auch keine Funktionen verwenden, sondern #defines, um bei Bedarf Funktionen aufzurufen. Dies hilft bei der Argumentation/Ergebnisverarbeitung.

#define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here

Sonderfall ist ASM-Anweisungen/Labels, ich denke, dass es nur mit #defines konvertiert werden kann.

Der Spaß beginnt, wenn Sie einige CPU-spezifische Funktionen erreichen. Dies können einfache Funktionsaufrufe mit Stack-Operationen oder bestimmte E/A-Vorgänge sein. Mehr Spaß machen Operationen mit Programmzählerregister, die für Berechnungen verwendet werden oder Ticks/Latenzen verwenden/zählen.

Aber es gibt einen anderen Weg, wenn dieser Hardcore passiert. Es ist auch ein Hardcore:) Es gibt eine Technik mit dem Namen dynamische Rekompilierung existiert. Es wird in vielen Emulatoren verwendet.

Sie müssen Ihren ASM nicht neu kompilieren, aber die Idee ist fast die gleiche. Sie können alle Ihre #defines aus dem ersten Schritt verwenden, aber die erforderliche Funktionalität unterstützen (inkrementelle PC/Ticks). Außerdem müssen Sie einige virtuelle Umgebungen für Ihren Code hinzufügen, z. B. Speicher-/E/A-Manager usw.

Viel Glück :)

2
zxcat

Ich denke, es ist einfacher, ein Buch über die PIC-Versammlung zu holen und zu lernen, es zu lesen. Der Assembler ist im Allgemeinen recht einfach zu erlernen, da er so niedrig ist. 

1
jakobengblom2

Es ist schwierig, eine Funktion von ASM in C umzuwandeln, ist jedoch von Hand möglich. Wenn Sie ein gesamtes Programm mit einem Decompiler konvertieren, erhalten Sie Code, der möglicherweise nicht verstanden werden kann, da ein Großteil der Struktur beim Kompilieren verloren ging. Ohne sinnvolle Variablen- und Funktionsnamen ist der resultierende C-Code immer noch sehr schwer zu verstehen.

0
Gerhard

Check out asm2c

Swift-Tool zur Umwandlung von DOS/PMODEW 386 TASM-Assembly-Code in C-Code

0
franck