Assembler programmieren und ausführen unter Linux
Assembler programmieren und ausführen unter Linux
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
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?
- 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?
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...
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...
...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).niemand hat geschrieben: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.Wenn ich solchen Kode ausführen würde, was passiert dann zum Beispiel mit dem Kernel?
cu
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!?
- kobayashimaru
- Beiträge: 53
- Registriert: 11.07.2004 16:51:18
- Wohnort: Dortmund
-
Kontaktdaten:
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.
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?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.
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?
- 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?
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.niemand hat geschrieben:gcc z.B. besitzt eine Option, mittels der man etwa C++-Code in ASM-Code umwandeln kann.
...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.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.
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!?
- kobayashimaru
- Beiträge: 53
- Registriert: 11.07.2004 16:51:18
- Wohnort: Dortmund
-
Kontaktdaten:
@chabayo:
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.
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....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.
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.
so bist du neugierig
aber wer schon magische Worte wie IPC kennt, kann auch
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...
aber wer schon magische Worte wie IPC kennt, kann auch
Code: Alles auswählen
apropos ipc
man 2 kill
man proc
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.
-
- Beiträge: 3472
- Registriert: 30.11.2005 10:32:22
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Wald
Die Quellen von top,ps und kill könnten dich auch interessieren:
(deb-src Eintrag in der sources.list nicht vergessen)
Code: Alles auswählen
apt-get source procps
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 DankJoghurt hat geschrieben: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.niemand hat geschrieben:gcc z.B. besitzt eine Option, mittels der man etwa C++-Code in ASM-Code umwandeln kann.
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?
- 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?
...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.
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!?