Ниже привожу исходник програмки под dos, который компилится в com файл и линкуется в ресурс исполняемого win32 файла как rcdata.
главный файл извлекает этот ресурс, пишет на диск, затем запускает его и завершается.
Сom-файл удаляет файл, заданные 2-м параметром ("родителя"), затем переименовывает в "родителя" файл, заданный 3-м параметром и убивает себя. Первый параметр командной строки - слово "repl".
Программа разработана для самоапгрейда другой программы.
.386
seg_a segment word public use16
assume cs{seg_a, ds{seg_a, ss{seg_a
org 100h
mal proc near
start{
cld
mov di,offset repl
mov si,81h
mov cx,5
lod1{ lodsb
cmp al,20h
je lod1
lod2{ or al,20h
scasb
lodsb
loopz lod2
jcxz work
jmp suicide
work{ cmp al,20h
jnz work2
lodsb
jmp short work
work2{ dec si
mov pf1,si
work3{ lodsb
or al,al
jz suicide
cmp al,20h
jnz work3
mov ds{[si-1(,cl
work4{ lodsb
or al,al
jz suicide
cmp al,20h
jz work4
lea ax,ds{[si-1(
mov pf2,ax
work5{ lodsb
or al,al
jz exec
cmp al,0Dh
jnz wk51
wk50{ mov ds{[si-1(,cl
jmp short exec
wk51{ cmp al,20h
jnz work5
jmp short wk50
exec{
mov bh,2Ch
mov ah,bh
int 21h
mov secs,dh
exec2{ mov dx,pf2
mov ah,41h
int 21h
jnc dals1
snv{ mov ah,bh
int 21h
cmp secs,dh
jz snv
inc byte ptr try
mov secs,dh
cmp byte ptr try,10
jz suicide
jmp short exec2
; call print_ax
dals1{ mov dx,pf1
mov di,pf2
mov ah,56h
int 21h
suicide{ mov ax,ds{[2Ch(
mov ds,ax
xor si,si
loop1{ lodsw
dec si
or ax,ax
jnz loop1
add si,3
mov dx,si
mov ah,41h
int 21h
push cs
pop ds
mov ah,4Ch
int 21h
mal endp
repl db 'repl '
try db 0
secs db ?
pf1 dw ?
pf2 dw ?
seg_a ends
end start