x86-Maschinencode, 162 Byte
PROG.COM Downloaden Sie und führen Sie es in MS-DOS- Emulator, DOSBox beispielsweise aus.
90 B3 B4 B4 02 90 90 B3 B2 B2 48 90 90 B3 CD CD 21 90 90 B3 B2 B2 65 90
90 B3 CD CD 21 90 90 B3 B2 B2 6C 90 90 B3 CD CD 21 90 90 B3 CD CD 21 90
90 B3 B2 B2 6F 90 90 B3 CD CD 21 90 90 B3 B2 B2 2C 90 90 B3 CD CD 21 90
90 B3 B2 B2 20 90 90 B3 CD CD 21 90 90 B3 B2 B2 77 90 90 B3 CD CD 21 90
90 B3 B2 B2 6F 90 90 B3 CD CD 21 90 90 B3 B2 B2 72 90 90 B3 CD CD 21 90
90 B3 B2 B2 6C 90 90 B3 CD CD 21 90 90 B3 B2 B2 64 90 90 B3 CD CD 21 90
90 B3 B2 B2 21 90 90 B3 CD CD 21 90 90 B3 CD CD 20 90
nach dem Entfernen von MINI.COM herunterladen
90 B4 02 90 B2 48 90 CD 21 90 B2 65 90 CD 21 90 B2 6C 90 CD 21 90 CD 21
90 B2 6F 90 CD 21 90 B2 2C 90 CD 21 90 B2 20 90 CD 21 90 B2 77 90 CD 21
90 B2 6F 90 CD 21 90 B2 72 90 CD 21 90 B2 6C 90 CD 21 90 B2 64 90 CD 21
90 B2 21 90 CD 21 90 CD 20
Wie läuft man?
Installieren Sie DOSBox für Ubuntu / Debian
sudo apt install dosbox
Starte es
dosbox
In DOSBOX
mount c /home/user/path/to/your/directory
c:
PROG.COM
MINI.COM
Wie funktioniert es?
Maschinenoperationscodes repräsentiert Montagesprachanweisungen .
In MS-DOS, um Zeichen zu drucken, werden Sie Register festlegen und Unterbrechung vornehmen. Das AH-Register lautet 0x02, das DL-Register enthält Ihr Zeichen. Der Interrupt-Vektor ist 0x21.
mov ah,0x2 ;AH register to 0x2 (B4 02)
mov dl,0x48 ;DL register to "H" (B2 48)
int 0x21 ;0x21 interrupt (CD 21)
Das winzige Modell der MS-DOS- COM-Datei ist eine gute Wahl, da es keine Header enthält . Es ist auf 64K begrenzt, aber in unserem Fall spielt es keine Rolle.
Um das Programm zu stoppen, verwenden Sie 0x20 Interrupt
int 0x20 ;0x20 interrupt (CD 20)
Magie
Wenn Sie den Befehl 0xAB opcode mit einem Parameter 0xCD ausführen möchten , schreiben Sie
AB CD
In PROG.COM
90 B3 AB AB CD 90
nop ; No operation (90)
mov bl,0xb4 ; BL register to AB (B3 AB)
AB CD command (AB CD)
nop ; No operation (90)
In MINI.COM
90 AB CD
nop ; No operation (90)
AB CD command (AB CD)
Es sind die gleichen Maschinencodes, wenn Sie das BL-Register nicht verwenden .
Generator
Konvertiert eine Textdatei mit hexadezimaler in hexadezimaler Binärdatei
cat hex_file | xxd -r -p > exec.com
function byte2hex(byte){
var ret=byte.toString(16).toUpperCase();
return ret.length==1 ? "0"+ret : ret;
}
function str2hex(str){
var ret = [];
for(var i=0;i<str.length;i++){
ret.push(byte2hex(str.charCodeAt(i)));
}
return ret;
}
function genCode(hexArr){
var ret = [["B4","02"]];
for(var i=0;i<hexArr.length;i++){
if(hexArr[i]!=hexArr[i-1]){
ret.push(["B2",hexArr[i]]);
}
ret.push(["CD","21"]);
}
ret.push(["CD","20"]);
return ret;
}
function magicCode(str){
var ret=[""];
var code=genCode(str2hex(str));
for(var i=0;i<code.length;i++){
ret.push("90 B3 "+code[i][0]+" "+code[i][0]+" "+code[i][1]+" 90");
if(i%4==3){ret.push("\n");}
}
return ret.join(" ");
}
function magicCodeMinified(str){
var ret=[""];
var code=genCode(str2hex(str));
for(var i=0;i<code.length;i++){
ret.push("90 "+code[i][0]+" "+code[i][1]);
if(i%8==7){ret.push("\n");}
}
return ret.join(" ");
}
var str=prompt("string","Hello, world!");
var out="PROG.COM\n" + magicCode(str)+"\n\nMINI.COM\n"+magicCodeMinified(str);
document.write(out.replace("\n","<br>"));
alert(out);