ชุดประกอบสำหรับ x86 Linux, 106 ไบต์
BITS 32
org 0x2E620000
db 0x7F, "ELF", 1, 1, 1, 0 ; e_ident
dd 0, 0
dw 2 ; e_type
dw 3 ; e_machine
dd 1 ; e_version
dd _start ; e_entry
dd phdr - $$ ; e_phoff
dd 0 ; e_shoff
dd 0 ; e_flags
dw 0x34 ; e_ehsize
dw 0x20 ; e_phentsize
phdr: dd 1 ; e_phnum ; p_type
; e_shentsize
dd 0 ; e_shnum ; p_offset
; e_shstrndx
dd $$ ; p_vaddr
fname equ $ - 2
db 'out', 0 ; p_paddr
dd filesize ; p_filesz
dd filesize ; p_memsz
dd 5 ; p_flags
dd 0x1000 ; p_align
_start: mov al, 5 ; 5 = open syscall
mov ebx, fname
mov cl, 65 ; 65 = O_WRONLY | O_CREAT
mov dx, 666q
int 0x80
lea edx, [byte ecx + filesize - 65]
xchg eax, ebx
xchg eax, ecx
mov cl, 0
mov al, 4 ; 4 = write syscall
int 0x80
mov al, 1 ; 1 = exit syscall
int 0x80
filesize equ $ - $$
นี่คือสำหรับแอสเซมเบลอร์ nasm สร้างไบนารีด้วยบรรทัดคำสั่ง:nasm -f bin -o a.out selfrep.asm && chmod +x a.out
นี่คือไฟล์เดียวกับการถ่ายโอนข้อมูลฐานสิบหก: 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 62 2E 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 62 2E 6F 75 74 00 6A 00 00 00 6A 00 00 00 05 00 00 00 00 10 00 00 B0 05 BB 36 00 62 2E B1 41 66 BA B6 01 CD 80 8D 51 29 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
ตามที่ร้องขอโปรแกรมคัดลอกตัวเองไปยังไฟล์แยกต่างหาก (โปรแกรมอาจสั้นลงอย่างเห็นได้ชัดหากได้รับอนุญาตให้เขียนไปยัง stdout และให้ผู้ใช้เปลี่ยนเส้นทางไปยังไฟล์)
ฉันหลีกเลี่ยงการใช้เทคนิคเส้นขอบเพื่อลดขนาด นี่ควรเป็นไบนารี ELF 32 บิตที่เป็นไปตามข้อกำหนด
แก้ไขเพื่อเพิ่ม : ในเวอร์ชันด้านบนไฟล์ที่สร้างขึ้นเป็นเพียงไฟล์ธรรมดา แต่มันเกิดขึ้นกับฉันว่าสองสามไบต์ (และกฎเล็ก ๆ ) คุณสามารถสร้างบางสิ่งที่น่าสนใจยิ่งขึ้น รุ่นนี้มีความยาวเพียงสองไบต์ที่ 108 ไบต์:
BITS 32
org 0x00010000
db 0x7F, "ELF", 1, 1, 1, 0 ; e_ident
dd 0, 0
dw 2 ; e_type
dw 3 ; e_machine
dd 1 ; e_version
dd _start ; e_entry
dd phdr - $$ ; e_phoff
dd 0 ; e_shoff
dd 0 ; e_flags
dw 0x34 ; e_ehsize
dw 0x20 ; e_phentsize
phdr: dd 1 ; e_phnum ; p_type
; e_shentsize
dd 0 ; e_shnum ; p_offset
; e_shstrndx
dd $$ ; p_vaddr
fname: db 'asr', 0 ; p_paddr
dd filesize ; p_filesz
dd filesize ; p_memsz
dd 7 ; p_flags
dd 0x1000 ; p_align
_start: mov al, 5 ; 5 = open syscall
mov ebx, fname
inc byte [ebx]
mov cl, 65 ; 65 = O_WRONLY | O_CREAT
mov dx, 777q
int 0x80
lea edx, [byte ecx + filesize - 65]
xchg eax, ebx
xchg eax, ecx
mov cl, 0
mov al, 4 ; 4 = write syscall
int 0x80
mov al, 1 ; 1 = exit syscall
int 0x80
filesize equ $ - $$
ตั้งชื่อรุ่นนี้asr
สำหรับ "ตัวจำลองข้อมูลตนเอง":nasm -f bin -o asr asr.asm && chmod +x asr
เลขฐานสิบหกสำหรับรุ่นที่ผิดปกติ:
7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00 02 00 03 00 01 00 00 00 4C 00 01 00 2C 00 00 00 00 00 00 00 00 00 00 00 34 00 20 00 01 00 00 00 00 00 00 00 00 00 01 00 61 73 72 00 6C 00 00 00 6C 00 00 00 07 00 00 00 00 10 00 00 B0 05 BB 38 00 01 00 FE 03 B1 41 66 BA FF 01 CD 80 8D 51 2B 93 91 B1 00 B0 04 CD 80 B0 01 CD 80
เมื่อคุณเรียกใช้มันจะสร้างไฟล์ที่เกือบจะเหมือนกันbsr
แต่ไฟล์นั้นจะสามารถเรียกใช้งานได้ csr
เล่นมันจะสร้างอีกแฟ้มไบนารีชื่อ และอื่น ๆ
(โปรดทราบว่าสิ่งที่น่ารำคาญเริ่มเกิดขึ้นหลังจากzsr
นั้นฉันคิดว่าการสร้างเวอร์ชันที่จะทำให้การเปลี่ยนชื่อเป็นไปเรื่อย ๆatr
แต่ฉันคิดว่าคนส่วนใหญ่จะเบื่อกันก่อนดังนั้นจึงอาจไม่คุ้มค่าไบต์พิเศษทั้งหมด )