Gli utilizzatori di X Files e degli altri due moduli NoFacebookAds (NFA) e Harmful WebSites (HWS) diventano ogni giorno sempre più. Complice (fuori di dubbio) la sempre più forte necessità di non essere assaliti da pubblicità che troppo spesso prendono il posto dei contenuti o interi siti web compromessi che vanno così a mettere a rischio l’incolumità della propria postazione di lavoro, il mio “lavoro” diventa così sempre più delicato, bisogna fare attenzione ad ogni minimo dettaglio e cercare di pensare che qualsiasi modifica non andrà ad impattare solo le mie macchine ma anche quelle di centinaia di altre persone in giro per il globo. Si spiegano così le mie risposte (via mail o ai ticket aperti o ancora nei report segnalati sul sito ufficiale dell’estensione) ad alcune richieste troppo specifiche e troppo poco condivisibili, non ve la prendete!
Vi siete però mai chiesti come nascono davvero X Files e Harmful WebSites? Contrariamente a NoFacebookAds che contiene solo poche righe specifiche per il noto social network sulla quale mi basta quindi mettere mano “a cuore aperto“, entrambe le altre liste vengono rese pubblicamente accessibili tramite gli URL di sottoscrizione che tutti utilizzano solo in un “secondo momento“. I filtri vengono scritti o raccolti, verificati, quindi esportati e poi lavorati da uno script in VBScript. Voglio condividere con voi questo lavoro, non si sa mai, potrebbero spuntare fuori nuove idee, correzioni o miglioramenti :-)
Harmful WebSites
Ecco quindi che ho fatto intervenire “qualche” riga di codice VBScript che possa fare questo lavoro in completa autonomia (previo doppio clic ovviamente), da qui in poi l’articolo prende una piega più tecnica, forse meno adatta ai semplici curiosi.
| ' ABP X FILES HWS Maker 0.4 rev1 | |
| ' GSolone - Ultima modifica: 09/01/17 | |
| ' | |
| ' Lo script scarica la lista filtri più aggiornata disponibile su MalwareDomainList.com e la modifica per renderla integrabile all'interno di una lista filtri standard per Adblock Plus e compatibili, a prescindere dal browser utilizzato. | |
| ' | |
| ' STORICO MODIFICHE | |
| ' 0.4 rev1- ho aggiunto un riferimento allo spazio hosting GitHub (per far notare all'utente che sta utilizzando il giusto repository). Aggiornato anche versione di Adblock richiesta (2.8). | |
| ' 0.4 - ho modificato la posizione del file di lista (si passa su Github!). | |
| ' 0.3 - integrato il nuovo blocco che toglie dalla lista alcuni siti web non più infetti (Find and remove Healthy Websites), segnalati tramite ticket su noads.it / UserVoice e verificati. Viene prevista inoltre la possibilità di collegamento tramite Proxy (Connection through proxy) utilizzando le credenziali dell'utente corrente. | |
| ' 0.2 - modificato l'URL di riferimento della distribuzione lista, si comincia a lavorare su noads.it | |
| ' 0.1 rev3 - corretto il problema dell'ultima linea con il solo "##HTML *" che bloccava la navigazione su ogni sito web. Rimangono due righe vuote a termine file ma non è un problema. Corretto un problema di formattazione nel titolo della lista. | |
| ' | |
| ' Sviluppo: Giovanni F. -Gioxx- Solone (dev@gfsolone.com) | |
| ' Testato su: Windows 7 Pro Sp1 | |
| ' | |
| ' LISTA HOST UTILIZZATA | |
| HTTPDownload "http://www.malwaredomainlist.com/hostslist/hosts.txt" | |
| ' Non toccare nulla oltre questa riga! | |
| ' DO NOT touch anything below this line! | |
| Sub HTTPDownload(myURL) | |
| ' Variables and constants definition | |
| Dim i, objFile, objFSO, objHTTP, strFile, strMsg | |
| Dim objWMIService, objProcess, colProcess | |
| Const ForReading = 1, ForWriting = 2, ForAppending = 8 | |
| ' Date and time | |
| strComputer = "." | |
| Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") | |
| Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") | |
| For Each objItem in colItems | |
| dtmLocalTime = objItem.LocalDateTime | |
| dtmMonth = Mid(dtmLocalTime, 5, 2) | |
| dtmDay = Mid(dtmLocalTime, 7, 2) | |
| dtmYear = Left(dtmLocalTime, 4) | |
| dtmHour = Mid(dtmLocalTime, 9, 2) | |
| dtmMinutes = Mid(dtmLocalTime, 11, 2) | |
| dtmSeconds = Mid(dtmLocalTime, 13, 2) | |
| Next | |
| update = dtmYear & dtmMonth & dtmDay & dtmHour & dtmMinutes | |
| lastmodified = dtmDay & "-" & dtmMonth & "-" & dtmYear | |
| ' debug Wscript.Echo update | |
| ' Create a File System Object | |
| Set objFSO = CreateObject( "Scripting.FileSystemObject" ) | |
| ' Check if the specified target file or folder exists, and build the fully qualified path of the target file | |
| Set objShell = CreateObject("Wscript.Shell") | |
| Set objProcess = objShell.Environment("Process") | |
| Set WshShell = WScript.CreateObject("Wscript.Shell") | |
| strApplicationData = WshShell.ExpandEnvironmentStrings("%TEMP%") | |
| 'FILE DEST. - Sblocca la stringa qui di seguito per scrivere nella cartella temporanea quando necessario | |
| ' e commenta quella successiva che scrive invece su Dropbox! | |
| 'strFile = strApplicationData + "\hws_xfiles.txt" | |
| strFile = "C:\GitHub\xfiles\siteblock.txt" | |
| 'Nuova posizione dal 12/2016, era strFile = "C:\Dropbox\Public\abpxfiles\siteblock.txt" | |
| ' Create an HTTP object | |
| Set objHTTP = CreateObject( "WinHttp.WinHttpRequest.5.1" ) | |
| ' Connection through proxy (remove comment in the line below) | |
| 'objHttp.setProxy 2, "proxy.contoso.com:8080", "" | |
| ' Download from the specified URL | |
| objHTTP.Open "GET", myURL, False | |
| objHTTP.Send | |
| if LenB( objHTTP.ResponseBody ) < 500 Then | |
| MsgBox "Errore durante il download della lista host ..." & chr(13) & "Lista non trovata o sito web momentaneamente non funzionante." & chr(13) & "Lista non creata" | |
| Exit Sub | |
| End If | |
| ' Create or open the target file | |
| Set objFile = objFSO.OpenTextFile( strFile, ForWriting, True ) | |
| ' Write the downloaded byte stream to the target file | |
| For i = 1 To LenB( objHTTP.ResponseBody ) | |
| objFile.Write Chr( AscB( MidB( objHTTP.ResponseBody, i, 1 ) ) ) | |
| Next | |
| ' Close the target file | |
| objFile.Close() | |
| ' Remove line 1 to 6, header of MalwareDomainList.com Hosts List | |
| For i = 1 To 6 | |
| DeleteLine strFile, "", 1, 0 | |
| Next | |
| ' Find and remove 127.0.0.1 from each line | |
| Set objFSO = CreateObject("Scripting.FileSystemObject") | |
| Set objFile = objFSO.OpenTextFile(strFile, ForReading) | |
| strText = objFile.ReadAll | |
| objFile.Close | |
| strNewText = Replace(strText, "127.0.0.1 ", "") | |
| Set objFile = objFSO.OpenTextFile(strFile, ForWriting) | |
| objFile.WriteLine strNewText | |
| objFile.Close | |
| ' Find and remove Healthy Websites | |
| Set objFSO = CreateObject("Scripting.FileSystemObject") | |
| Set objFile = objFSO.OpenTextFile(strFile, ForReading) | |
| strText = objFile.ReadAll | |
| objFile.Close | |
| strNewText = Replace(strText, "www.angolotesti.it", "") | |
| strNewText = Replace(strNewText, "www.secondome.com", "") | |
| strNewText = Replace(strNewText, "ms11.net", "") | |
| Set objFile = objFSO.OpenTextFile(strFile, ForWriting) | |
| objFile.WriteLine strNewText | |
| objFile.Close | |
| ' Remove empty lines at the end of file! | |
| Set objFSO = CreateObject("Scripting.FileSystemObject") | |
| Set objFile = objFSO.OpenTextFile(strFile, ForReading) | |
| Do Until objFile.AtEndOfStream | |
| strLine = objFile.Readline | |
| strLine = Trim(strLine) | |
| If Len(strLine) > 0 Then | |
| strNewContents = strNewContents & strLine & vbCrLf | |
| End If | |
| Loop | |
| objFile.Close | |
| Set objFile = objFSO.OpenTextFile(strFile, ForWriting) | |
| objFile.Write strNewContents | |
| objFile.Close | |
| ' Append "##HTML *" for each line | |
| Set objFSO = CreateObject("Scripting.FileSystemObject") | |
| Set objFile = objFSO.OpenTextFile(strFile, ForReading, True) | |
| Set tmpFile= objFSO.OpenTextFile(strFile & ".tmp", ForWriting, True) | |
| Do While Not objFile.AtEndofStream | |
| url = objFile.ReadLine | |
| url = url & "##HTML *" | |
| tmpFile.WriteLine url | |
| Loop | |
| objFile.Close | |
| tmpFile.Close | |
| objFSO.DeleteFile(strFile) | |
| objFSO.MoveFile strFile&".tmp", strFile | |
| ' Add list header (ABP X Files HWS) | |
| Set objFSO = CreateObject("Scripting.FileSystemObject") | |
| Set objFile = objFSO.OpenTextFile(strFile, ForReading) | |
| strContents = objFile.ReadAll | |
| objFile.Close | |
| strFirstLine = "[Adblock Plus 2.8]" & vbCrLf & "! Version: " & update & vbCrLf & "! Title: X Files: HWS Harmful WebSites" & vbCrLf & "! Harmful WebSites blocca siti web potenzialmente dannosi per la vostra navigazione" & vbCrLf & "! Last modified: " & lastmodified & vbCrLf & "! Expires: 3 days" & vbCrLf & "! Homepage: http://noads.it" & vbCrLf & "! Home: http://noads.it" & vbCrLf & "! Blog: http://gioxx.org/tag/x-files" & vbCrLf & "! Hosting lista: GitHub.com" & vbCrLf & "! " | |
| strNewContents = strFirstLine & vbCrLf & strContents | |
| Set objFile = objFSO.OpenTextFile(strFile, ForWriting) | |
| objFile.WriteLine strNewContents | |
| objFile.Close | |
| ' Open the file (verification process) | |
| CreateObject("WScript.Shell").Run strFile | |
| End Sub | |
| Sub Run(ByVal sFile) | |
| ' Variables definition | |
| Dim shell | |
| Set shell = CreateObject( "WScript.Shell" ) | |
| shell.Run Chr(34) & sFile & Chr(34), 1, false | |
| Set shell = Nothing | |
| End Sub | |
| Sub DeleteLine(strFile, strKey, LineNumber, CheckCase) | |
| 'Use strFile = "c:\file.txt" (Full path to text file) | |
| 'Use strKey = "John Doe" (Lines containing this text string to be deleted) | |
| 'Use strKey = "" (To not use keyword search) | |
| 'Use LineNumber = "1" (Enter specific line number to delete) | |
| 'Use LineNumber = "0" (To ignore line numbers) | |
| 'Use CheckCase = "1" (For case sensitive search ) | |
| 'Use CheckCase = "0" (To ignore upper/lower case characters) | |
| Const ForReading=1:Const ForWriting=2 | |
| Dim objFSO,objFile,Count,strLine,strLineCase,strNewFile | |
| Set objFSO=CreateObject("Scripting.FileSystemObject") | |
| Set objFile=objFSO.OpenTextFile(strFile,ForReading) | |
| Do Until objFile.AtEndOfStream | |
| strLine=objFile.Readline | |
| If CheckCase=0 then strLineCase=ucase(strLine):strKey=ucase(strKey) | |
| If LineNumber=objFile.Line-1 or LineNumber=0 then | |
| If instr(strLine,strKey) or instr(strLineCase,strkey) or strKey="" then | |
| strNewFile=strNewFile | |
| Else | |
| strNewFile=strNewFile&strLine&vbcrlf | |
| End If | |
| Else | |
| strNewFile=strNewFile&strLine&vbcrlf | |
| End If | |
| Loop | |
| objFile.Close | |
| Set objFSO=CreateObject("Scripting.FileSystemObject") | |
| Set objFile=objFSO.OpenTextFile(strFile,ForWriting) | |
| objFile.Write strNewFile | |
| objFile.Close | |
| End Sub |
Righe di debug sparse un po’ ovunque, sicuramente una marea di errori dovuti alla mia inesperienza e auto-formazione sulla programmazione in VBScript e (quasi certamente) molteplici modi di farlo con la metà delle righe di codice, eppure lo script che vedete qui di sopra si occupa ad oggi di scaricare la lista filtri da MalwareDomainList, rimuovere tutta la prima parte di informazioni, pulire ogni riga dal suo 127.0.0.1 e inserire i dettagli di aggiornamento, scadenza e non solo, quindi caricare nella cartella pubblica del mio Dropbox la nuova versione della lista finalmente compatibile che tutti voi potrete scaricare (o lasciar scaricare a Adblock) senza il minimo sforzo :-)
Giusto per farvi sentire un pelo più sicuri: alla fine del procedimento un “CreateObject(“WScript.Shell”).Run strFile” avvierà Notepad++ sul mio PC per verificare che tutto sia a posto e che non vi stia dando in pasto un file non corretto!
Inutile dire che avendo dichiarato delle cartelle ben precise al suo interno, se voleste riutilizzare questo script per qualche vostro particolare interesse dovrete fare attenzione e andare a modificare quelle righe per evitare di mandarlo in errore e non ottenere alcun risultato ;-)
Per evitare che ogni nuova modifica vada nel dimenticatoio e non venga aggiornata in questo articolo ho voluto pubblicare lo storico delle modifiche sul Wiki: public.gfsolone.com/wiki/doku.php?id=mozilla:abpxfiles:vbs:hwsmaker, dove aggiornerò la pagina con eventuali nuove versioni o note sull’attuale.
X Files
| ' ABP X FILES Stable Maker 0.3 rev1 | |
| ' GSolone - Ultima modifica: 09/01/17 | |
| ' | |
| ' Lo script modifica la lista filtri esportata dall'Adblock Plus di Staging e la modifica per inserire le informazioni di rilascio, quindi la copia all'interno della cartella pubblica di Dropbox dove tutti i client puntano per l'aggiornamento. | |
| ' | |
| ' STORICO MODIFICHE | |
| ' 0.3 rev1- ho aggiunto un riferimento allo spazio hosting GitHub (per far notare all'utente che sta utilizzando il giusto repository). Aggiornato anche versione di Adblock richiesta (2.8). | |
| ' 0.3 - ho modificato la posizione del file di lista (si passa su Github!). | |
| ' 0.2 rev0- corregge il bug sullo sdoppiamento dei contenuti (Remove Empty Lines usava una variabile già piena e replicava ogni riga) | |
| ' 0.1 rev0- stadio iniziale di sviluppo. | |
| ' | |
| ' Sviluppo: Giovanni F. -Gioxx- Solone (dev@gfsolone.com) | |
| ' Testato su: Windows 7 Pro Sp1 | |
| ' | |
| ' Non toccare nulla oltre questa riga! | |
| ' DO NOT touch anything below this line! | |
| ' Variables and constants definition | |
| Dim i, objFile, objFSO, strFile, strMsg | |
| Dim objWMIService, objProcess, colProcess | |
| Const ForReading = 1, ForWriting = 2, ForAppending = 8 | |
| ' Date and time | |
| strComputer = "." | |
| Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") | |
| Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") | |
| For Each objItem in colItems | |
| dtmLocalTime = objItem.LocalDateTime | |
| dtmMonth = Mid(dtmLocalTime, 5, 2) | |
| dtmDay = Mid(dtmLocalTime, 7, 2) | |
| dtmYear = Left(dtmLocalTime, 4) | |
| dtmHour = Mid(dtmLocalTime, 9, 2) | |
| dtmMinutes = Mid(dtmLocalTime, 11, 2) | |
| dtmSeconds = Mid(dtmLocalTime, 13, 2) | |
| Next | |
| update = dtmYear & dtmMonth & dtmDay & dtmHour & dtmMinutes | |
| lastmodified = dtmDay & "-" & dtmMonth & "-" & dtmYear | |
| ' DEBUG: show $datetime | |
| 'Wscript.Echo update | |
| ' Expand Environment | |
| ' Create const's to spare time and place | |
| Dim WshS | |
| Set WshS = WScript.CreateObject("WScript.Shell") | |
| Set objFSO = CreateObject("Scripting.FileSystemObject") | |
| usrProfile = WshS.ExpandEnvironmentStrings("%UserProfile%") | |
| strFile = usrProfile & "\Desktop\filtri.txt" | |
| ' DEBUG: Message to prove my string contains the path to my profile | |
| 'cartellaProfilo = usrProfile | |
| 'Msgbox strFile, 0, "Percorso lista" | |
| ' Staging filtri.txt is on my Desktop? | |
| If objFSO.FileExists(strFile) Then | |
| Else | |
| MsgBox "Non ho trovato il file filtri.txt sul Desktop. Lo hai esportato da Firefox?",16,"" | |
| Wscript.Quit | |
| End If | |
| ' Remove line 1 to 2, default header of Adblock Plus export | |
| For i = 1 To 2 | |
| DeleteLine strFile, "", 1, 0 | |
| Next | |
| ' Add list header (ABP X Files Stable) | |
| Set objFile = objFSO.OpenTextFile(strFile, ForReading) | |
| strContents = objFile.ReadAll | |
| objFile.Close | |
| strFirstLine = "[Adblock Plus 2.8]" & vbCrLf & "! Version: " & update & vbCrLf & "! Title: ABP X Files" & vbCrLf & "! X Files migliora la tua navigazione quotidiana!" & vbCrLf & "! Last modified: " & lastmodified & vbCrLf & "! Expires: 3 days" & vbCrLf & "! Homepage: http://noads.it" & vbCrLf & "! Home: http://noads.it" & vbCrLf & "! Blog: http://gioxx.org/tag/x-files" & vbCrLf & "! Hosting lista: GitHub.com" & vbCrLf & "! " | |
| strNewContents = strFirstLine & vbCrLf & strContents | |
| Set objFile = objFSO.OpenTextFile(strFile, ForWriting) | |
| 'objFile.WriteLine strNewContents | |
| objFile.Write strNewContents | |
| objFile.Close | |
| ' Remove empty lines at the end of file! | |
| Set objFile = objFSO.OpenTextFile(strFile, ForReading) | |
| Do Until objFile.AtEndOfStream | |
| strLine = objFile.Readline | |
| strLine = Trim(strLine) | |
| If Len(strLine) > 0 Then | |
| strCleaned = strCleaned & strLine & vbCrLf | |
| End If | |
| Loop | |
| objFile.Close | |
| Set objFile = objFSO.OpenTextFile(strFile, ForWriting) | |
| objFile.Write strCleaned | |
| objFile.Close | |
| ' Move updated X Files to Dropbox (and overwrite old file) | |
| ' (from %UserProfile%\Desktop\filtri.txt to C:\GitHub\xfiles\filtri.txt) | |
| strDropbox = "C:\GitHub\xfiles\" | |
| 'Nuova posizione dal 12/2016, era strDropbox = "C:\Dropbox\Public\abpxfiles\" | |
| If objFSO.FileExists(strFile) Then | |
| objFSO.CopyFile strFile, strDropbox, True | |
| Else | |
| MsgBox "Non sono riuscito a muovere il file dei filtri. Verifica che i puntamenti siano corretti",48,"" | |
| End If | |
| ' Open the file (verification process) and delete "Staging X Files" | |
| strDropboxFile = "C:\GitHub\xfiles\filtri.txt" | |
| 'Nuova posizione dal 12/2016, era strDropboxFile = "C:\Dropbox\Public\abpxfiles\filtri.txt" | |
| CreateObject("WScript.Shell").Run strDropboxFile | |
| objFSO.DeleteFile strFile, True | |
| Sub Run(ByVal sFile) | |
| ' Variables definition | |
| Dim shell | |
| Set shell = CreateObject( "WScript.Shell" ) | |
| shell.Run Chr(34) & sFile & Chr(34), 1, false | |
| Set shell = Nothing | |
| End Sub | |
| Sub DeleteLine(strFile, strKey, LineNumber, CheckCase) | |
| 'Use strFile = "c:\file.txt" (Full path to text file) | |
| 'Use strKey = "John Doe" (Lines containing this text string to be deleted) | |
| 'Use strKey = "" (To not use keyword search) | |
| 'Use LineNumber = "1" (Enter specific line number to delete) | |
| 'Use LineNumber = "0" (To ignore line numbers) | |
| 'Use CheckCase = "1" (For case sensitive search ) | |
| 'Use CheckCase = "0" (To ignore upper/lower case characters) | |
| Const ForReading=1:Const ForWriting=2 | |
| Dim objFSO,objFile,Count,strLine,strLineCase,strNewFile | |
| Set objFSO = CreateObject("Scripting.FileSystemObject") | |
| Set objFile=objFSO.OpenTextFile(strFile,ForReading) | |
| Do Until objFile.AtEndOfStream | |
| strLine=objFile.Readline | |
| If CheckCase=0 then strLineCase=ucase(strLine):strKey=ucase(strKey) | |
| If LineNumber=objFile.Line-1 or LineNumber=0 then | |
| If instr(strLine,strKey) or instr(strLineCase,strkey) or strKey="" then | |
| strNewFile=strNewFile | |
| Else | |
| strNewFile=strNewFile&strLine&vbcrlf | |
| End If | |
| Else | |
| strNewFile=strNewFile&strLine&vbcrlf | |
| End If | |
| Loop | |
| objFile.Close | |
| Set objFile=objFSO.OpenTextFile(strFile,ForWriting) | |
| objFile.Write strNewFile | |
| objFile.Close | |
| End Sub |
Lo script si occupa quindi di prendere la lista appena esportata, aggiungere le informazioni di rilascio necessarie e infine sostituire il vecchio file filtri con quello nuovo appena lavorato. Sarà così pronto e raggiungibile per qualsiasi browser tramite aggiornamento automatico o manuale (a voi la scelta). Anche in questo caso ci sono diverse righe di debug lasciate appositamente per le verifiche del caso e magari -ancora una volta- si poteva fare “meglio con meno“.
Anche in questo caso ho voluto pubblicare lo storico delle modifiche (ad oggi c’è solo questa versione) sul Wiki: public.gfsolone.com/wiki/doku.php?id=mozilla:abpxfiles:vbs:stablemaker.
Come sempre vi invito a utilizzare l’area commenti di questo articolo nel caso in cui vogliate segnalare qualche errore o possibile miglioramento di entrambi i lavori o più semplicemente mettervi in contatto con me e ragionare insieme su come far evolvere questi codici :-)
Enjoy!
L'articolo potrebbe non essere aggiornato
Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio lascia un commento!