40Hex Number 14 Volume 5 Issue 1 File 002 KILLSMEG (c) 1994 by Stormbringer of Phalcon/Skism Note: This is an update to an earlier program, KILLQUEEG, which misfired badly when it encountered SMEG.Pathogen, as Pathogen is functionally almost IDENTICAL to Queeg and would scan the same in the old program, but become a disaster on disinfection. KILLSMEG will scan and disinfect both correctly, as well as most new variants. Variants that it is not likely to be able to disinfect it will report as a new variant of SMEG. DISCLAIMER: Author assumes NO liabilities for any damage this software might cause. It is not guaraunteed in any way. I have done my best to make it secure and bug free, but it comes as is. Use it at your own risk. This program will find and disinfect the two SMEG viruses from specified files in current directory. Before using, boot from a CLEAN-WRITE PROTECTED disk, and make sure you get this program from a reliable source (source code should be included). I wrote this as there is currently no shareware/freeware program available capable of disinfecting this polymorphic virus, or even reliably detecting it. It also gives insight into one technique that can be used to detect and/ or disinfect polymorphic viruses. I can be reached via IRC or anywhere else if ya look hard enough ;) Greets go to: Phalcon/Skism, Trident, Trinity, Hermanni, Frisk, Frans, Jenky, and all the rest of the virus/anti-virus community. --------------------------- ;KillSMEG (c) 1994 Stormbriner, Phalcon/Skism ;Finds and disinfects the original SMEG viruses (Pathogen and Queeg) ;Author assumes NO responsibility for any damages caused by this program ;or by the SMEG viruses themselves. This utility is simply made to find it, ;and may or may not work as it is supposed to. No garuantees. ;First phase is to look for time signatures. The seconds in any Queeg ;infected file (unless something else has changed timestamp after infection) ;is 56 seconds (1c in bits 0-4 of the time sig). All following Checks are ;done regardless of the time sig check. Pathogen marks infections by making ;the high byte in the date > 0c8h ;Second Phase on each file is to Check if it's an .EXE or a .COM. ;Third phase is to trace the program until an invalid condition is found or ;the virus is detected. ;Finally, the user is asked if s/he wishes to disinfect the virus, and ;the file is cleaned. Strengths: ; VERY reliable detection rate from my testing. ; ; Currently only free program capable of disinfecting SMEG viruses, ; especially from .EXE files. ; ; Comes with full source code. ;Weaknesses: ; Third phase is slow(!!!), and actually executes part of program, ; although it is careful not to allow detrimental actions to be taken ; (i.e. viruses cannot go memres, etc.) ; ; Only scans current directory using user filemask. ; ; Disinfection will leave some garbage at the end of files, ; as the virus pads its hosts to the paragraph boundaries. ; This will cause self-checking programs to choke. .model tiny .radix 16 .code org 100 start: ReduceMem: mov ah,4a mov bx,(endfinder-start+10f)/10 ;Reduce Memory to that needed int 21 mov sp,offset TopStack ;Set STack within memory mov ah,09 mov dx,offset IntroMSG int 21 cmp byte ptr ds:[80],1 ja CopyFilename mov ah,09 mov dx,offset Instructions int 21 mov ax,4c00 int 21 CopyFilename: mov si,82 mov di,offset Filenamebuf CopyFN: lodsb cmp al,0dh je doneCFN stosb jmp CopyFN doneCFN: xor al,al stosb ComSearch: mov ah,4e mov dx,offset FilenameBuf mov cx,07 FindFirstNext: int 21 jnc SearchGood jmp NoMoreCOMS SearchGood: call notifycheck mov cx,ds:[96] and cl,1f cmp cl,1c ;Check time stamp (56 seconds) jne AfterTimeCheck1 call SuspiciousTime AfterTimeCheck1: mov cx,ds:[98] cmp ch,0c8 jb AfterTimeCheck call PathTime AfterTimeCheck: mov ax,3d00 mov dx,9e int 21 jnc ATCGood jmp ErrorOpen ATCGood: xchg bx,ax mov dx,offset EXECCheck mov cx,4 mov ah,3f int 21 mov ah,3e int 21 ;Close File mov ax,word ptr ds:[ExecCheck] xor ah,al cmp ah,('M' xor 'Z') ;Check if it's a com or exec je ISEXE push cs pop es mov di,offset JmpByte mov si,offset ExecCheck ;Save Jump movsb movsw mov byte ptr ds:[COMEXE],0 jmp short OtherChecks ISEXE: mov byte ptr ds:[COMEXE],1 OtherChecks: mov Infected,0 ;Initialize to not infected mov TraceDone,0 call LoadAndCheckFile ;Trace file cmp Infected,1 jne FindAnotherFile call PrintFilename cmp Knownvir,1 je DisinfectProg mov ah,09 mov dx,offset NewVar int 21 jmp FindAnotherFile DisinfectProg: mov ah,09 mov dx,offset InfectedMSG int 21 xor ax,ax int 16 push ax mov dx,offset DoneChecking mov ah,09 int 21 pop ax or al,20 cmp al,'y' jne FindAnotherFile Disinfect: cmp comexe,1 je DisEXE call DisinfCom jmp short FindAnotherFile DisEXE: call DisinfExe FindAnotherFile: mov ah,4f jmp FindFirstNext ErrorOpen: call PRintFilename mov ah,09 mov dx,offset OpenError int 21 jmp FindAnotherFile NoMoreCOMS: mov ax,4c00 int 21 SuspiciousTime: call PrintFilename mov ah,09 mov dx,offset TIMEMSG int 21 ret PathTime: call printfilename mov ah,09 mov dx,offset pathtimemsg int 21 ret NotifyCheck: mov dx,offset Checking mov ah,09 int 21 call PrintFileName mov dx,offset DoneChecking mov ah,09 int 21 ret PrintFilename: mov si,9e PrintFN: lodsb or al,al jz doneprintfn mov ah,02 mov dl,al int 21 jmp Printfn DonePrintFN: ret LoadAndCheckFile: push cs pop ds mov ax,ds:[2c] mov EnvSeg,ax mov ax,ds mov word ptr [CommandTail+2],ax mov word ptr [FCB1+2],ax mov word ptr [FCB2+2],ax mov ax,offset ParmData mov word ptr [CommandTail],ax mov word ptr [FCB1],ax mov word ptr [FCB2],ax mov ax,3501 int 21 mov IP01,bx mov CS01,es ;Get int 1 vector mov ax,2501 mov dx,offset Int01 ;And set it int 21 mov ax,ss mov Oldss,ax mov oldsp,sp push cs pop es LoadFile: mov ax,4b01 mov bx,offset ParmBlock mov dx,9e int 21 jc ErrorExecute SetupExec: push cs pop ds mov ax,2522 mov dx,offset ExecuteTerminated int 21 ;Set Termination address mov ah,62 int 21 push bx bx pop es ds mov word ptr cs:[StartDS],bx mov ax,cs mov word ptr ds:[0a],offset ExecuteTerminated mov word ptr ds:[0c],ax ;Set Termination Address cli mov ax,word ptr cs:[NewStack+2] mov ss,ax mov sp,word ptr cs:[NewStack] sti pushf pop ax or ax,0100 xor bx,bx xor cx,cx xor dx,dx mov si,100 xor di,di xor bp,bp push word ptr cs:[NewCS] push word ptr cs:[NewIP] push ax popf retf ExecuteTerminated: cld pushf pop ax and ax,not 100 ;ditch trapflag push ax popf cli mov ax,cs:[OldSS] mov ss,ax mov sp,cs:[OldSP] sti lds dx,dword ptr cs:[IP01] mov ax,2501 int 21 push cs cs pop es ds mov ah,1a mov dx,80 ;Reset DTA int 21 ErrorExecute: ret OldSS dw 0 OldSP dw 0 Int01: cld push bp mov bp,sp add bp,2 push ax bx cx dx es ds si di cmp cs:TraceDone,1 je DOneInt01 call CheckESDS call CheckOPCode jne DoneInt01 call InitScanString call ScanMemory call InitScanString DoneInt01: pop di si ds es dx cx bx ax pop bp iret InitScanString: push ds si cx push cs pop ds mov si,offset QueegScan1 mov cx,EndScan1-QueegScan1 DecryptString: xor byte ptr [si],42 inc si loop DecryptString pop cx si ds ret TerminateProgram: mov byte ptr cs:[TraceDone],1 mov ax,4c00 int 21 CheckOpCode: mov si,[bp+2] mov ds,si mov si,[bp] cmp byte ptr dS:[si],0cdh je NonvalidOp cmp byte ptr ds:[si],0eah je NonvalidOp cmp byte ptr ds:[si],09ah je NonvalidOp cmp byte ptr ds:[si],0abh je NonvalidOp cmp byte ptr ds:[si],0adh je NonvalidOp mov al,byte ptr ds:[si] and al,0f0 cmp al,60 je NonvalidOp cmp al,90 je NonvalidOp cmp al,0a0 je NonvalidOp cmp word ptr ds:[si],00e8 jne ExitOpTest cmp word ptr ds:[si+2],5800 ExitOpTest: ret NonValidOp: jmp TerminatePRogram CheckESDS: mov ax,[bp+2] cmp ax,word ptr cs:[NewCS] je CSOkay jmp TerminateProgram CSOkay: mov ax,[bp+2] mov bx,ds cmp bx,ax jne DSNotEqualCS CheckES: mov bx,es cmp bx,ax jne ESNotEqualCS ExitSEGCheck: ret DSNotEqualCS: cmp bx,word ptr cs:[StartDS] je CheckES mov byte ptr cs:[TraceDone],1 jmp TerminateProgram ESNotEqualCS: cmp bx,word ptr cs:[StartDS] je ExitSEGCheck mov byte ptr cs:[TraceDone],1 jmp TerminateProgram ScanMemory: push cs pop ds mov si,offset QueegScan1 mov di,[bp+2] mov es,di mov di,[bp] mov cx,800 lodsb SearchForString: repnz scasb jcxz StringNotFound push ax cx si di mov cx,0bh repz cmpsb jcxz StringFound pop di si cx ax jmp SearchForString StringFound: pop di si cx ax SaveInfo: dec di ;ES:DI = beginning of virus push es di pop si ds ;ds:si+133 22 c0 75 19 bb 00 01 2e a1 MakeSureKnowVir: cmp word ptr ds:[si+33],0c022 jne NotKnown cmp word ptr ds:[si+39],2e01 jne NotKnown mov byte ptr cs:[knownvir],1 jmp DoneVarCheck NotKnown: mov byte ptr cs:[knownvir],0 DoneVarCheck: mov bx,si sub bx,100 mov si,word ptr ds:[bx+13c] add si,bx push cs pop es mov di,offset COMStorage movsw movsb mov si,word ptr ds:[bx+164] add si,bx mov di,offset EXEStack movsw movsw mov si,word ptr ds:[bx+171] add si,bx mov di,offset EXEInstruct movsw movsw MarkInfected: mov byte ptr cs:[Infected],1 call InitScanString jmp TerminateProgram StringNotFound: ret OutOfMemory: mov dx,offset OOM ErrExit: push cs pop ds mov ah,9 int 21 mov ax,4c02 int 21 ErrorClean: mov dx,offset FileError mov ah,09 push cs pop ds int 21 jmp Dealloc DisinfCom: mov ah,48 mov bx,1000 int 21 jc OutOfMemory mov es,ax mov dx,9e mov ax,3d00 int 21 jc ErrorClean xchg bx,ax push es pop ds xor dx,dx mov cx,word ptr cs:[ComJump] add cx,3 mov ah,3f int 21 push ax mov ah,3e int 21 mov ax,word ptr cs:[COMStorage] mov word ptr ds:[0],ax mov al,byte ptr cs:[ComStorage+2] mov byte ptr ds:[2],al push cs pop ds mov ah,3c xor cx,cx mov dx,9e int 21 pop cx jc ErrorClean xchg bx,ax push es pop ds mov ah,40 xor dx,dx int 21 mov ah,3e int 21 DeAlloc: mov ah,49 int 21 push cs cs pop es ds ret EXEErrorClean: mov dx,offset FileError mov ah,09 push cs pop ds int 21 ret DisinfEXE: int 3 mov ah,41 mov dx,offset TMPFile int 21 push cs cs pop es ds mov dx,9e mov ax,3d02 ;open file int 21 jnc EXECOpenGood jmp EXEErrorClean ExecOpenGood: xchg bx,ax mov cx,20 mov ah,3f mov dx,offset ExecHeader int 21 mov di,offset Execheader+0e mov si,offset ExeStack movsw movsw xor bp,bp mov di,offset execheader+14 mov dx,[di+2] ;DX:AX = new filesize kinda mov ax,[di] mov cl,4 shl dx,cl adc bp,0 add ax,dx adc bp,0 mov dx,bp ;DX:AX = filesize w/o header mov cx,word ptr [execheader+08] shl cx,1 shl cx,1 shl cx,1 shl cx,1 add ax,cx adc dx,0 ;Header now calculated in mov ExeSizeHigh,dx mov ExeSizeLow,ax and ax,1ff ;modulo 512 mov word ptr [execheader+2],ax mov ax,EXESizeLow mov cx,7 shl dx,cl mov word ptr [execheader+4],dx mov cx,9 add ax,1ff shr ax,cl add word ptr [execheader+4],ax mov si,offset ExeInstruct movsw movsw mov ax,4200 xor cx,cx xor dx,dx int 21 mov ah,40 mov dx,offset execheader mov cx,20 int 21 mov ah,3e int 21 mov ah,56 mov dx,9e mov di,offset TmpFile ;Rename file int 21 mov ah,3c mov dx,9e xor cx,cx int 21 mov Dest,ax mov ax,3d00 mov dx,offset TmpFile int 21 mov Source,ax CopyLoop: mov cx,400 cmp word ptr [EXESizeHIgh],0 jne FullSize cmp word ptr [ExeSizeLow],400 ja FullSize mov cx,word ptr [ExeSizeLow] FullSize: sub word ptr [ExeSizeLow],400 sbb word ptr [ExeSizeHigh],0 mov ah,3f mov bx,Source mov dx,offset CopyBuffer int 21 mov cx,ax mov ah,40 mov bx,Dest mov dx,offset CopyBuffer int 21 cmp ax,400 je CopyLoop CloseUP: mov ah,3e mov bx,Dest int 21 mov ah,3e mov bx,Source int 21 DoneDis: mov ah,41 mov dx,offset TMPFile int 21 ret Source dw 0 Dest dw 0 OldInt01: IP01 dw 0 CS01 dw 0 TraceDone db 0 StartDS dw 0 ParmBlock: EnvSeg dw 0 CommandTail dd 0 FCB1 dd 0 FCB2 dd 0 NewStack dd 0 NewIP dw 0 NEWCS dw 0 Tmpfile db 'KQTMP',0 NewVar db ' - New Variant of SMEG!',0a,0dh,24 FileError db 'Sorry, File Error.',07,0a,0dh,24 OOM db 'Sorry, Out Of Memory',07,0a,0dh,24 Checking db 'Checking $' OpenError db ' - Error Opening.' DoneChecking db 0a,0dh,24 TimeMSG db ' - Time stamp is suspicious of SMEG.Queeg signature.',0a,0dh,24 pathtimemsg db ' - Time stamp is suspicious of SMEG.Pathogen signature.',0a,0dh,24 InfectedMSG db ' - INFECTED WITH SMEG!',0a,0dh db 'Disinfect (y/N)?',7,24 IntroMSG db 0a,0dh,'KillSMEG (c) 1994 Stormbringer, Phalcon/Skism.',0a,0dh db 'Finds and disinfects the 2 known SMEG viruses in the current directory.',0a,0dh,24 Instructions: db 'Usage : KILLSMEG Filemask (COM once, then EXE once is recommended)',0a,0dh db 'Example: KILLSMEG *.COM',0a,0dh,24 QueegScan1: db 0E8 xor 42, 00 xor 42, 00 xor 42, 58 xor 42, 0FE xor 42, 0CC xor 42 db 0B1 xor 42, 04 xor 42, 0D3 xor 42, 0E8 xor 42, 08C xor 42, 0CBh xor 42 ;Initializing Code EndScan1: ;QueegScan2: ;db 0B8, 0EF, 18, 0CDh, 21, 3Dh, 10, 0E7, 75, 01, 0C3, 0E8 ;Installation Check ParmData db 40 dup(0) knownvir db 0 Jmpbyte db 0 COMJump db 0,0 Infected db 0 COMEXE db 0 ;0 for COM, 1 for EXE EXECCheck dw 0,0 COMStorage db 0,0,0 EXEStack dd 0 EXEInstruct dd 0 ;0f9d-SP 0f9b-SS 0fa0-IP:CS ExeSizeLow dw 0 EXESizeHigh dw 0 Filenamebuf db 80d dup (?) ExecHeader db 20 dup(?) CopyBuffer db 400 dup(?) StackBuffer db 1000 dup(?) TopStack: endfinder: end start --------------------------- N KILLSMEG.COM E 0100 B4 4A BB CC 01 CD 21 BC C0 1C B4 09 BA 0C 07 CD E 0110 21 80 3E 80 00 01 77 0C B4 09 BA 88 07 CD 21 B8 E 0120 00 4C CD 21 BE 82 00 BF 50 08 AC 3C 0D 74 03 AA E 0130 EB F8 32 C0 AA B4 4E BA 50 08 B9 07 00 CD 21 73 E 0140 03 E9 BE 00 E8 D6 00 8B 0E 96 00 80 E1 1F 80 F9 E 0150 1C 75 03 E8 B1 00 8B 0E 98 00 80 FD C8 72 03 E8 E 0160 B0 00 B8 00 3D BA 9E 00 CD 21 73 03 E9 87 00 93 E 0170 BA 3D 08 B9 04 00 B4 3F CD 21 B4 3E CD 21 A1 3D E 0180 08 32 E0 80 FC 17 74 11 0E 07 BF 38 08 BE 3D 08 E 0190 A4 A5 C6 06 3C 08 00 EB 05 C6 06 3C 08 01 C6 06 E 01A0 3B 08 00 90 C6 06 EC 05 00 90 E8 93 00 80 3E 3B E 01B0 08 01 75 3D E8 78 00 80 3E 37 08 01 74 0A B4 09 E 01C0 BA 0B 06 CD 21 EB 2A 90 B4 09 BA E2 06 CD 21 33 E 01D0 C0 CD 16 50 BA 6E 06 B4 09 CD 21 58 0C 20 3C 79 E 01E0 75 0F 80 3E 3C 08 01 74 05 E8 85 02 EB 03 E8 E7 E 01F0 02 B4 4F E9 47 FF E8 36 00 B4 09 BA 5D 06 CD 21 E 0200 EB EF B8 00 4C CD 21 E8 25 00 B4 09 BA 71 06 CD E 0210 21 C3 E8 1A 00 B4 09 BA A8 06 CD 21 C3 BA 53 06 E 0220 B4 09 CD 21 E8 08 00 BA 6E 06 B4 09 CD 21 C3 BE E 0230 9E 00 AC 0A C0 74 08 B4 02 8A D0 CD 21 EB F3 C3 E 0240 0E 1F A1 2C 00 A3 EF 05 8C D8 A3 F3 05 A3 F7 05 E 0250 A3 FB 05 B8 F7 07 A3 F1 05 A3 F5 05 A3 F9 05 B8 E 0260 01 35 CD 21 89 1E E8 05 8C 06 EA 05 B8 01 25 BA E 0270 09 03 CD 21 8C D0 A3 05 03 89 26 07 03 0E 07 B8 E 0280 01 4B BB EF 05 BA 9E 00 CD 21 72 78 0E 1F B8 22 E 0290 25 BA DA 02 CD 21 B4 62 CD 21 53 53 07 1F 2E 89 E 02A0 1E ED 05 8C C8 C7 06 0A 00 DA 02 A3 0C 00 FA 2E E 02B0 A1 FF 05 8E D0 2E 8B 26 FD 05 FB 9C 58 0D 00 01 E 02C0 33 DB 33 C9 33 D2 BE 00 01 33 FF 33 ED 2E FF 36 E 02D0 03 06 2E FF 36 01 06 50 9D CB FC 9C 58 25 FF FE E 02E0 50 9D FA 2E A1 05 03 8E D0 2E 8B 26 07 03 FB 2E E 02F0 C5 16 E8 05 B8 01 25 CD 21 0E 0E 07 1F B4 1A BA E 0300 80 00 CD 21 C3 00 00 00 00 FC 55 8B EC 83 C5 02 E 0310 50 53 51 52 06 1E 56 57 2E 80 3E EC 05 01 74 11 E 0320 E8 77 00 E8 35 00 75 09 E8 10 00 E8 A7 00 E8 0A E 0330 00 5F 5E 1F 07 5A 59 5B 58 5D CF 1E 56 51 0E 1F E 0340 BE EB 07 B9 0C 00 80 34 42 46 E2 FA 59 5E 1F C3 E 0350 2E C6 06 EC 05 01 B8 00 4C CD 21 8B 76 02 8E DE E 0360 8B 76 00 80 3C CD 74 30 80 3C EA 74 2B 80 3C 9A E 0370 74 26 80 3C AB 74 21 80 3C AD 74 1C 8A 04 24 F0 E 0380 3C 60 74 14 3C 90 74 10 3C A0 74 0C 81 3C E8 00 E 0390 75 05 81 7C 02 00 58 C3 EB B6 8B 46 02 2E 3B 06 E 03A0 03 06 74 02 EB AA 8B 46 02 8C DB 3B D8 75 07 8C E 03B0 C3 3B D8 75 10 C3 2E 3B 1E ED 05 74 F2 2E C6 06 E 03C0 EC 05 01 EB 8B 2E 3B 1E ED 05 74 E9 2E C6 06 EC E 03D0 05 01 E9 7B FF 0E 1F BE EB 07 8B 7E 02 8E C7 8B E 03E0 7E 00 B9 00 08 AC F2 AE E3 6C 50 51 56 57 B9 0B E 03F0 00 F3 A6 E3 06 5F 5E 59 58 EB EB 5F 5E 59 58 4F E 0400 06 57 5E 1F 81 7C 33 22 C0 75 10 81 7C 39 01 2E E 0410 75 09 2E C6 06 37 08 01 EB 07 90 2E C6 06 37 08 E 0420 00 8B DE 81 EB 00 01 8B B7 3C 01 03 F3 0E 07 BF E 0430 41 08 A5 A4 8B B7 64 01 03 F3 BF 44 08 A5 A5 8B E 0440 B7 71 01 03 F3 BF 48 08 A5 A5 2E C6 06 3B 08 01 E 0450 E8 E8 FE E9 FA FE C3 BA 3B 06 0E 1F B4 09 CD 21 E 0460 B8 02 4C CD 21 BA 25 06 B4 09 0E 1F CD 21 EB 55 E 0470 90 B4 48 BB 00 10 CD 21 72 DD 8E C0 BA 9E 00 B8 E 0480 00 3D CD 21 72 DF 93 06 1F 33 D2 2E 8B 0E 39 08 E 0490 83 C1 03 B4 3F CD 21 50 B4 3E CD 21 2E A1 41 08 E 04A0 A3 00 00 2E A0 43 08 A2 02 00 0E 1F B4 3C 33 C9 E 04B0 BA 9E 00 CD 21 59 72 AD 93 06 1F B4 40 33 D2 CD E 04C0 21 B4 3E CD 21 B4 49 CD 21 0E 0E 07 1F C3 BA 25 E 04D0 06 B4 09 0E 1F CD 21 C3 CC B4 41 BA 05 06 CD 21 E 04E0 0E 0E 07 1F BA 9E 00 B8 02 3D CD 21 73 02 EB DE E 04F0 93 B9 20 00 B4 3F BA A0 08 CD 21 BF AE 08 BE 44 E 0500 08 A5 A5 33 ED BF B4 08 8B 55 02 8B 05 B1 04 D3 E 0510 E2 83 D5 00 03 C2 83 D5 00 8B D5 8B 0E A8 08 D1 E 0520 E1 D1 E1 D1 E1 D1 E1 03 C1 83 D2 00 89 16 4E 08 E 0530 A3 4C 08 25 FF 01 A3 A2 08 A1 4C 08 B9 07 00 D3 E 0540 E2 89 16 A4 08 B9 09 00 05 FF 01 D3 E8 01 06 A4 E 0550 08 BE 48 08 A5 A5 B8 00 42 33 C9 33 D2 CD 21 B4 E 0560 40 BA A0 08 B9 20 00 CD 21 B4 3E CD 21 B4 56 BA E 0570 9E 00 BF 05 06 CD 21 B4 3C BA 9E 00 33 C9 CD 21 E 0580 A3 E6 05 B8 00 3D BA 05 06 CD 21 A3 E4 05 B9 00 E 0590 04 83 3E 4E 08 00 75 0C 81 3E 4C 08 00 04 77 04 E 05A0 8B 0E 4C 08 81 2E 4C 08 00 04 83 1E 4E 08 00 B4 E 05B0 3F 8B 1E E4 05 BA C0 08 CD 21 8B C8 B4 40 8B 1E E 05C0 E6 05 BA C0 08 CD 21 3D 00 04 74 C2 B4 3E 8B 1E E 05D0 E6 05 CD 21 B4 3E 8B 1E E4 05 CD 21 B4 41 BA 05 E 05E0 06 CD 21 C3 00 00 00 00 00 00 00 00 00 00 00 00 E 05F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E 0600 00 00 00 00 00 4B 51 54 4D 50 00 20 2D 20 4E 65 E 0610 77 20 56 61 72 69 61 6E 74 20 6F 66 20 53 4D 45 E 0620 47 21 0A 0D 24 53 6F 72 72 79 2C 20 46 69 6C 65 E 0630 20 45 72 72 6F 72 2E 07 0A 0D 24 53 6F 72 72 79 E 0640 2C 20 4F 75 74 20 4F 66 20 4D 65 6D 6F 72 79 07 E 0650 0A 0D 24 43 68 65 63 6B 69 6E 67 20 24 20 2D 20 E 0660 45 72 72 6F 72 20 4F 70 65 6E 69 6E 67 2E 0A 0D E 0670 24 20 2D 20 54 69 6D 65 20 73 74 61 6D 70 20 69 E 0680 73 20 73 75 73 70 69 63 69 6F 75 73 20 6F 66 20 E 0690 53 4D 45 47 2E 51 75 65 65 67 20 73 69 67 6E 61 E 06A0 74 75 72 65 2E 0A 0D 24 20 2D 20 54 69 6D 65 20 E 06B0 73 74 61 6D 70 20 69 73 20 73 75 73 70 69 63 69 E 06C0 6F 75 73 20 6F 66 20 53 4D 45 47 2E 50 61 74 68 E 06D0 6F 67 65 6E 20 73 69 67 6E 61 74 75 72 65 2E 0A E 06E0 0D 24 20 2D 20 49 4E 46 45 43 54 45 44 20 57 49 E 06F0 54 48 20 53 4D 45 47 21 0A 0D 44 69 73 69 6E 66 E 0700 65 63 74 20 28 79 2F 4E 29 3F 07 24 0A 0D 4B 69 E 0710 6C 6C 53 4D 45 47 20 28 63 29 20 31 39 39 34 20 E 0720 53 74 6F 72 6D 62 72 69 6E 67 65 72 2C 20 50 68 E 0730 61 6C 63 6F 6E 2F 53 6B 69 73 6D 2E 0A 0D 46 69 E 0740 6E 64 73 20 61 6E 64 20 64 69 73 69 6E 66 65 63 E 0750 74 73 20 74 68 65 20 32 20 6B 6E 6F 77 6E 20 53 E 0760 4D 45 47 20 76 69 72 75 73 65 73 20 69 6E 20 74 E 0770 68 65 20 63 75 72 72 65 6E 74 20 64 69 72 65 63 E 0780 74 6F 72 79 2E 0A 0D 24 55 73 61 67 65 20 3A 20 E 0790 20 20 20 4B 49 4C 4C 53 4D 45 47 20 46 69 6C 65 E 07A0 6D 61 73 6B 20 28 43 4F 4D 20 6F 6E 63 65 2C 20 E 07B0 74 68 65 6E 20 45 58 45 20 6F 6E 63 65 20 69 73 E 07C0 20 72 65 63 6F 6D 6D 65 6E 64 65 64 29 0A 0D 45 E 07D0 78 61 6D 70 6C 65 3A 20 20 20 4B 49 4C 4C 53 4D E 07E0 45 47 20 2A 2E 43 4F 4D 0A 0D 24 AA 42 42 1A BC E 07F0 8E F3 46 91 AA CE 89 00 00 00 00 00 00 00 00 00 E 0800 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E 0810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E 0820 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E 0830 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 E 0840 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 RCX 0750 W Q ---------------------------