Assembler programmieren und ausführen unter Linux

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Assembler programmieren und ausführen unter Linux

Beitrag von fabske » 03.08.2006 09:16:47

Ich hab damals in der Schule Assembler gelernt. Dabei hatten wir einen sehr alten Rechner mit irgend einem Vorläufer des 8085s von Intel. Auf dem Rechner war ein sehr kleines Betriebsystem, eigentlich nur ne Konsole, ein Editor und ein Kompiler. Wir haben den Assembler Kode geschrieben, kompiliert und dann wurde er glaub direkt von der CPU ausgeführt, also das Betriebssystem war dann nicht mehr anzusprechen.
Nun habe ich von neuen Viren gelesen die in Assembler geschrieben sind und ich frage mich, wie kann ich denn unter Linux Assembler Kode ausführen? Assembler ist doch eine sehr hardwarenahe Programmiersprache, eigentlich die Hardwareprogrammiersprache und muss für jeden Prozessor extra angepasst werden. Wenn ich solchen Kode ausführen würde, was passiert dann zum Beispiel mit dem Kernel?
Danke
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

_mh_
Beiträge: 171
Registriert: 10.07.2006 11:52:28

Beitrag von _mh_ » 03.08.2006 09:54:07

Hallo,

Also generell mal, meines Wissens macht man Assembler unter Linux mit dem as der beim gcc mit dabei ist.

Zum Thema assembler-viren... oehm. Nun ja, ich denke mal man kann jetzt fuer x86-Generic (ja, sowas gibts, laeuft meines wissens auf allen x86-Abkoemmlingen) und vielleicht noch fuer ein paar andere wichtige Architekturen den Virus in einem Verbreitungs-tool zusammenfassen und voila du erschlaegst 99% aller Rechner damit. Die Exoten unter den Rechnern sind den Virenschreibern wahrscheinlich egal...

DeletedUserReAsG

Beitrag von DeletedUserReAsG » 03.08.2006 18:21:28

Wenn ich solchen Kode ausführen würde, was passiert dann zum Beispiel mit dem Kernel?
Dem ist es generell egal, in welcher Sprache das Prog geschrieben wurde, solange das daraus resultierende Binary ok ist. gcc z.B. besitzt eine Option, mittels der man etwa C++-Code in ASM-Code umwandeln kann.

cu

Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

Beitrag von chabayo » 03.08.2006 18:55:22

niemand hat geschrieben:
Wenn ich solchen Kode ausführen würde, was passiert dann zum Beispiel mit dem Kernel?
Dem ist es generell egal, in welcher Sprache das Prog geschrieben wurde, solange das daraus resultierende Binary ok ist. gcc z.B. besitzt eine Option, mittels der man etwa C++-Code in ASM-Code umwandeln kann.

cu
...ja, meine ich auch. Dem Prozessor ist es egal ob sein Maschinencode aus Assemblercode oder einem Java-Script stammt, es sind immer die selben Funktionen die er im selben Raum zu gegebener Zeit ausfuehrt; dies ist allgem. so bei Hardware zu betrachten - dort kommt es allein durch physikalische Einfluesse zu einer ueberlagernden Synthese (z.B. die CPU ueberhitzt, Funktion->tot).

Generell wird bei Linux auch ein Assemblerprogramm als Prozess ausgefuehrt.

Soweit glaub ich es noch verstanden zu haben, aber es gibt da doch dieses a.out/ELF und auch anderes was ich jetzt hier noch nicht ganz einordnen kann, denn kann ich in eine Datei ein Byte (mal das NOP, no operation, weils so einfach ist) schreiben und es mit chmod ausfuehrbar machen??
Watt about the non-digital!?

Benutzeravatar
kobayashimaru
Beiträge: 53
Registriert: 11.07.2004 16:51:18
Wohnort: Dortmund
Kontaktdaten:

Beitrag von kobayashimaru » 03.08.2006 19:21:21

Der Maschienencode wird in eine ausführbahre Datei (binary) verpackt. Dieses Format ist OS spezifisch. Unter Linux gibt es ELF und a.out, wie es unter Win heißt weiß ich gerade nicht.
Mit welcher Sprache - ob Assembler oder Hochsprache - du deinen Code schreibst ist egal. Aber das Betriebssystem verdaut eben nur sein binary Format.
Daher gibt es keine OS übergreifenden Viren. Kopier einfach mal eine .exe von Windows rüber nach Linux und versuch sie zu starten.

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 03.08.2006 22:20:04

kobayashimaru hat geschrieben:Der Maschienencode wird in eine ausführbahre Datei (binary) verpackt. Dieses Format ist OS spezifisch. Unter Linux gibt es ELF und a.out, wie es unter Win heißt weiß ich gerade nicht.
Mit welcher Sprache - ob Assembler oder Hochsprache - du deinen Code schreibst ist egal. Aber das Betriebssystem verdaut eben nur sein binary Format.
Daher gibt es keine OS übergreifenden Viren. Kopier einfach mal eine .exe von Windows rüber nach Linux und versuch sie zu starten.
Ok, aber kann ich den Assembler Kode, den ich zuvor in Maschinenkode übersetze, nicht auch direkt ausführen, anstatt ihn in einen Binary zu verpacken?
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 03.08.2006 22:28:38

niemand hat geschrieben:gcc z.B. besitzt eine Option, mittels der man etwa C++-Code in ASM-Code umwandeln kann.
GCC erzeugt grundsätzlich Assembler als Ausgabe. Nur ruft es danach sofort selbst as auf, um den Code zu assemblieren und danach ld, um ihn zu linken. Die Option lässt GCC praktisch einfach nach dem Compiliervorgang anhalten.

Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

Beitrag von chabayo » 03.08.2006 22:52:02

kobayashimaru hat geschrieben:Der Maschienencode wird in eine ausführbahre Datei (binary) verpackt. Dieses Format ist OS spezifisch. Unter Linux gibt es ELF und a.out, wie es unter Win heißt weiß ich gerade nicht.
Mit welcher Sprache - ob Assembler oder Hochsprache - du deinen Code schreibst ist egal. Aber das Betriebssystem verdaut eben nur sein binary Format.
Daher gibt es keine OS übergreifenden Viren. Kopier einfach mal eine .exe von Windows rüber nach Linux und versuch sie zu starten.
...das ist mir klar, werden in einem Assembler-Code ja auch sehr viele Systemaufrufe ueber bestimmte INT Befehle (unter DOS war das glaube ich INT 21) mit entsprechenen Parametern gestartet.

Ich habe mal gelesen unter Linux funktioniert das genauso, aber da gibt es, wie wahrscheinlich einleuchtend, anzunehmend andere, eben dadurch systemspezifische Aufrufe.

Ich kann mich halt noch daran erinnern das ich mit debug.exe gearbeitet hatte.

Dabei war es so das der eigentliche Code ab der Adresse 0100 vom System nach dem 'Mapping' 'angesprungen' wurde - unter Debug konnte man aber so richtig Low-Level-Assembler eingeben; mit Programmieren hatte das fast schon nichts mehr zu tun.

Ich hatte eben mal kurz gegoogelt, und bin darueber gestolpert. Das ist zwar Assembler, aber hat dann schon wieder weniger mit dem Maschinennahen Programmieren so wie ich es immo zu betrachten gewillt bin zu tun.

Was Joghurt in seinem letzten Post geschrieben hat habe ich schon mal gelesen, und ich war damals schon etwas verwundert; Sachen gibts...


Was ich hier in diesem Thread vielleicht noch gern fragen wuerde:

Wie funktioniert das Kernel-Intern mit z.B. Prozessinforamtionen, oder IPC oder aehnlichem, sprich: mit welchen Systemaufrufen liesse sich Beispielsweise ein TaskManager wie unter Windows realiesieren, oder eine Ausgabe wie von ps, oder wie sende ich einem Prozess z.B. ein Kill Signal, oder wo bekomme ich events wie sie z.B. udevd auffaengt her???
Watt about the non-digital!?

Benutzeravatar
kobayashimaru
Beiträge: 53
Registriert: 11.07.2004 16:51:18
Wohnort: Dortmund
Kontaktdaten:

Beitrag von kobayashimaru » 03.08.2006 23:26:42

@chabayo:
...das ist mir klar, werden in einem Assembler-Code ja auch sehr viele Systemaufrufe ueber bestimmte INT Befehle (unter DOS war das glaube ich INT 21) mit entsprechenen Parametern gestartet.
Ja die Systemcalls unterscheiden sich natürlich auch noch, das ist sowieso klar, aber eben nur zusätzlich zum binary Format. Also selbst wenn du keine OS spezifische Funktionalität in deinem Programm nutzt, wird ein Windows keine Linux-Binaries starten.

Und zu den von dir angesprochenen Kernelfunktionen musst du dir halt die Kernel-API angucken (einfach mal nach suchen). Zum Signale versenden gibt es z.B. die kill() Funktion, die ist schon in POSIX definiert, die sachen mit udev und so sind dann Linux spezifisch.

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Beitrag von cosmac » 03.08.2006 23:28:47

so bist du neugierig :)

aber wer schon magische Worte wie IPC kennt, kann auch

Code: Alles auswählen

apropos ipc
man 2 kill
man proc
das ist jetzt ausdrücklich kein RTFM, die man-pages
sind eine Fundgrube für Neugierige!

Wer´s ganz genau wissen will, installiert sich die Kernel-Quellen
oder wenigstens die Kernel-Header.

Und ja, als normaler Benutzer kommt man unter Linux
nicht an die Hardware, auch nicht mit Assembler.
Aber du kannst dir Qemu installieren, deine Maschinen-
Befehle in eine Datei schreiben und die dem Qemu als
Floppy-Image zum booten vorsetzen...
Beware of programmers who carry screwdrivers.

Spasswolf
Beiträge: 3472
Registriert: 30.11.2005 10:32:22
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wald

Beitrag von Spasswolf » 03.08.2006 23:47:38

Die Quellen von top,ps und kill könnten dich auch interessieren:

Code: Alles auswählen

apt-get source procps
(deb-src Eintrag in der sources.list nicht vergessen)

Benutzeravatar
fabske
Beiträge: 2023
Registriert: 14.06.2003 15:07:51

Beitrag von fabske » 04.08.2006 16:17:49

Joghurt hat geschrieben:
niemand hat geschrieben:gcc z.B. besitzt eine Option, mittels der man etwa C++-Code in ASM-Code umwandeln kann.
GCC erzeugt grundsätzlich Assembler als Ausgabe. Nur ruft es danach sofort selbst as auf, um den Code zu assemblieren und danach ld, um ihn zu linken. Die Option lässt GCC praktisch einfach nach dem Compiliervorgang anhalten.
Was ist ASM Kode? Was muss man linken? Ich habe da noch einige Lücken! Hat mir jemand eine Referenz wo ich mich etwas in das Thema einarbeiten kann? Vielen Dank :)
Bevor Du einen Beitrag postest:
- Kennst Du unsere Verhaltensregeln?
- Hast Du die Suchfunktion benutzt? Deine Frage wurde vielleicht schon in einem anderen Beitrag beantwortet.
- Ist schon ein Artikel in unserem Wiki vorhanden, der Deine Frage beantwortet?

Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

Beitrag von chabayo » 04.08.2006 16:56:27

...ich hatte mir mal von Intel ein .txt-File heruntergeladen, praktisch das Handbuch zum 80386.

Darin war beschrieben was der alles so kann, und am Schluss war eine Tabelle in der die OPCODES aufgelistet waren, und wie Ihr dazugehoeriger Maschinencode aufgeschluesselt werden konnte - war sehr schick ausgelegt.

Hab das jetzt nicht mehr gefunden.

Aber das scheint genau das zu sein - unter Appendix A ist dort das angesprochene zu finden.

Um Assembler zu verstehen fand ich das debug.exe von Microsoft tatsaechlich nicht schlecht, und @cosmac, das das mit qemu in der Art so simpel zu betrachten ist - sehr klug ueberlegt! Hatte mit debug.exe auch so meine Proggis von Diskette gestartet.

Aber ich glaube dabei hab ich auch ab :0100 den Programmcode gesetzt.

Assemler fuer einen Assembler zu schreiben ist aber eine andere "Strategie", weil es da konventionen gibt die vom Format her auch zu unterscheiden sind. MASM z.B. nicht unbedingt gleich NASM, oder auch dem ASM von Borland.
Watt about the non-digital!?

Benutzeravatar
chabayo
Beiträge: 930
Registriert: 17.08.2005 07:44:33
Lizenz eigener Beiträge: Artistic Lizenz

Beitrag von chabayo » 04.08.2006 23:48:04

Watt about the non-digital!?

Antworten