Windows 8 und reine Assembler Programme
-
Ich habe jetzt seit einigen Tagen Windows 8 installiert und bin wider Erwarten auch recht zufrieden. Jetzt habe ich aber mal aus Spaß ein kleines Assembler-Programm geschrieben und mit NASM assembliert, nur will Windows das nicht starten. Mit Windows 7 hat das immer problemlos geklappt. (Die Datei besteht nur aus dem Bytecode, ist also keine PE-exe.) Von aussagekräftigen Fehlermeldungen hält man wohl auch nichts mehr, da steht nur "This app can't run on your PC." Weiß da jemand was?
-
Windows 8 64Bit unterstützt keine 16bit Programme.
-
Und NASM gibt 16-bit Programme aus? Sollte ein x86 Assembler keine 32-bit Programme ausgeben?
-
Fensterputzer schrieb:
Und NASM gibt 16-bit Programme aus? Sollte ein x86 Assembler keine 32-bit Programme ausgeben?
Du hast gesagt dass du keine exe Datei erstellt hast, ergo hast du eine .com
Den Rest darfst du alleine rausfinden.
-
Such mal nach einem 32 Bit Tutorial wenn du deine 16 Bit NASM Programme weiterhin verwenden/schreiben willst dann könntest du versuchen diese in DOSBox auszuführen: http://www.dosbox.com/
In deinem darfst du nicht die DOS Interrupts benutzen sondern musst die WINAPI verwenden.
-
@Shade Of Mine Ich verstehe zwar immer noch nicht warum mein x86 Assembler jetzt 16-bit Code ist, aber soll ich mir dafür jetzt VirtualPC installieren oder wie? Das kann es doch wohl nicht sein, Windows soll nichts anderes machen als den Kot auszuführen.
@Bassmaster Was meinst du mit 32 Bit Tutorial? Mein Programm verwendet keine Interrupts, das ist einfach nur eine kleine Schleife.
-
Fensterputzer schrieb:
@Shade Of Mine Ich verstehe zwar immer noch nicht warum mein x86 Assembler jetzt 16-bit Code ist, aber soll ich mir dafür jetzt VirtualPC installieren oder wie? Das kann es doch wohl nicht sein, Windows soll nichts anderes machen als den Kot auszuführen.
Am besten du deinstallierst Windows und gehst raus in den Park.
Bei mir scheint gerade die Sonne...Und wenn du dann Zeit hast, liest du zu dem Thema .com und .exe mal nach.
-
Sonnenschein? Na ja, die Wolken sind etwas heller heute.
Was das deinstallieren angeht: Gute Idee wenn die das ernst meinen. Es kann doch wohl nicht so schwer sein einfach geradeaus Code auszuführen.
Unter dem .COM-File Wikipedia Artikel finde ich auch nur dass das ein altes DOS-EXE Format ist oder so. Keine Ahnung was das jetzt mit reinem Bytecode zu tun hat.
-
The COM format is the original binary executable format used in CP/M and MS-DOS. It is very simple; it has no header (with the exception of CP/M 3 files), and contains no metadata, only code and data.
-
@Fensterputzer
Du musst eine Exe Datei erstellen! NICHT COM
Hättest du in ein Tutorial geschaut hättest du warscheinlich deinen Fehler erkannt.Ich glaub ich such mal ein Tutorial für dich raus hab aufer Arbeit eh gerade nix zu tun. (Es sei den ich bekomme plötzlich Lust was anderes zu machen dann hättest du in dem Fall Pech.
)
-
Fensterputzer schrieb:
Es kann doch wohl nicht so schwer sein einfach geradeaus Code auszuführen.
Wenn es sich um Code handelt, den die CPU nicht ausführen kann, dann ist das eben leider doch nicht so einfach...
-
Nein, such nicht. Ich möchte ja gerade eine reine Bytecode Datei ausführen.
Wenn es sich um Code handelt, den die CPU nicht ausführen kann, dann ist das eben leider doch nicht so einfach...
Warum sollte die CPU das nicht ausführen können? Es ist einfach nur stinknormaler x86 Bytecode.
-
Fensterputzer schrieb:
Nein, such nicht. Ich möchte ja gerade eine reine Bytecode Datei ausführen.
Wenn es sich um Code handelt, den die CPU nicht ausführen kann, dann ist das eben leider doch nicht so einfach...
Warum sollte die CPU das nicht ausführen können? Es ist einfach nur stinknormaler x86 Bytecode.
Es ist 16-Bit Code und den kann eine aktuelle x86 CPU im Long Mode nicht ausführen. Ich finde es höchst bemerkenswert, dass 32 Bit Systeme das heute sogar noch unterstützen, weil immerhin haben wir es da mit Technologie zu tun, die vor 20 Jahren schon veraltet war. Wenn du sowas unbedingt ausführen musst, dann verwend einen Emulator wie z.B. DOSBox...
-
Und wie sage ich meinem Assembler dann, dass er 64-bit Code ausspucken soll?
-
-
Glaubst du ernsthaft, danach hätte ich noch nicht gegoogelt? Ich habe bereits FASM, NASM und YASM installiert. Unter YASM darf ich sogar die r Register nutzen. Kommt aber trotzdem der gleiche Fehler.
-
aha
-
Aha, ist wohl doch kein 16 bit Code.
-
Wer weiß, klingt halt so, als ob deine Assembler keine brauchbare exe erzeugen. Am besten wärs also wohl mal, das Manual des jeweiligen Assemblers zu studieren und rauszufinden, wie man ihn richtig verwendet...
-
http://pixelbanane.de/yafu/1752352184/nasmdoc.pdf
Bytecode? Meinst du sowas?
Statischer WinExec shellcode
[Section .text] BITS 32 global _start _start: jmp short go execute_sh: pop ebx add ebx,8 xor eax,eax mov [ebx],al sub ebx,8 push eax push ebx mov ebx,0x7c862585 ; WinExec call ebx xor eax,eax push eax mov ebx,0x7c81d20a ; ExitProcess call ebx go: call execute_sh db "calc.exeA"
Erzeugt folgenden Shellcode:
"\xeb\x1e\x5b\x83\xc3\x8\x31\xc0\x88\x3" "\x83\xeb\x8\x50\x53\xbb\x85\x25\x86\x7c" "\xff\xd3\x31\xc0\x50\xbb\xa\xd2\x81\x7c" "\xff\xd3\xe8\xdd\xff\xff\xff\x63\x61\x6c" "\x63\x2e\x65\x78\x65\x41";
Kann man so ausführen (Funktions Adressen in diesem Fall nicht vergessen zu ändern oder gleich alles Dynamisch machen. [sry war mir zu viel Arbeit^^] ):
#include <iostream> int main() { char sh[]="\xeb\x1e\x5b\x83\xc3\x8\x31\xc0\x88\x3" "\x83\xeb\x8\x50\x53\xbb\x85\x25\x86\x7c" "\xff\xd3\x31\xc0\x50\xbb\xa\xd2\x81\x7c" "\xff\xd3\xe8\xdd\xff\xff\xff\x63\x61\x6c" "\x63\x2e\x65\x78\x65\x41"; int (*call)(); call = ( int(*)() ) &sh; (*call)(); return 0; }
btw.
Shade Of Mine schrieb:
Bei mir scheint gerade die Sonne...
Wohnst du etwa auch in Münster?
NUR IN MÜNSTER KANN JETZT DIE SONNEN SCHEINEN SONST NIRGENDWO ! :p
Ich kenn den Wetterfrosch persönlich.lol mir muss gerade echt langweillig sein. xD
-
dot schrieb:
Wer weiß, klingt halt so, als ob deine Assembler keine brauchbare exe erzeugen. Am besten wärs also wohl mal, das Manual des jeweiligen Assemblers zu studieren und rauszufinden, wie man ihn richtig verwendet...
Natürlich erzeugt der keine "brauchebare exe" wie oft muss ich das denn noch schreiben es ist einfach nur Bytecode.
Bytecode? Meinst du sowas?
Ja. Aber der C++ Compiler macht mir ja wieder eine normale exe draus.