รหัสเครื่อง x86, 162 ไบต์
PROG.COM ดาวน์โหลดและเรียกใช้ในMS-DOSจำลองDOSBoxตัวอย่างเช่น
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
หลังจากลบMINI.COM Download
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
วิธีการใช้งาน
ติดตั้ง DOSBox สำหรับ Ubuntu / Debian
sudo apt install dosbox
เรียกใช้
dosbox
ใน DOSBOX
mount c /home/user/path/to/your/directory
c:
PROG.COM
MINI.COM
มันทำงานอย่างไร
เครื่องรหัสการดำเนินงานที่แสดงให้เห็นถึงการชุมนุมภาษาคำแนะนำ
ใน MS-DOS เพื่อพิมพ์อักขระคุณจะตั้งค่าการลงทะเบียนและทำการขัดจังหวะ การลงทะเบียน AH จะเป็น 0x02, การลงทะเบียน DL มีอักขระของคุณ เวกเตอร์ขัดจังหวะคือ 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)
MS-DOS ไฟล์ COMรุ่นเล็กเป็น choise ที่ดีเพราะมันไม่ได้มีส่วนหัวใด ๆ มันถูก จำกัด โดย 64K แต่ในกรณีของเรามันไม่สำคัญ
ในการหยุดโปรแกรมใช้ขัดจังหวะ 0x20
int 0x20 ;0x20 interrupt (CD 20)
มายากล
หากคุณต้องการดำเนินการคำสั่ง opcode 0xABด้วยพารามิเตอร์หนึ่ง0xCDคุณเขียน
AB CD
ใน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)
ในMINI.COM
90 AB CD
nop ; No operation (90)
AB CD command (AB CD)
มันเป็นเท่ากับรหัสเครื่องถ้าคุณไม่ได้ใช้BL ลงทะเบียน
เครื่องกำเนิดไฟฟ้า
แปลงไฟล์ข้อความด้วยเลขฐานสิบหกเป็นเลขฐานสิบหก
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);