kangaroojack
Goto Top

Suche nach Dateien mit doppelter Dateiendung

Hallo Leute,

evtl. eine triviale Aufgabe, aber ich bekomme es nicht hin.
Ziel ist es von diesen blöden Verschlüsselungsviren betroffene Files zu finden. Bisher werden da ja (zum Glück noch) Dateiendungen angehangen, so dass man das noch analysieren kann.
Die Files heissen dann meist *.txt.mp3 oder *.doc.vvv etc.

Habe ein Powershellskript, welches mit das Dateisystem durchsucht und in eine Variable ausgibt.
Ich mache das bewusst mit dir /s /b weil Get-ChildItem einfach viel zu langsam ist.

$Virusverdacht = cmd /c dir /s /b *.micro *.vvv *.encrypted *.ccc *.aaa *HOW_RECOVER* *HELP_RECOVER* *howto_recover*

Nun ist mir die Suche allerdings zu ungenau - da die Files bei einem Befall von Morgen evtl. die Endung *.zdf haben können.

Jetzt möchte ich die Suche dahingehend ändern, dass nach
*.???.???
gesucht wird.

Also quasi nach zwei "Punkten" mit genau 3 zeichen, die variabel sein können, dazwischen.
Hab schon bisschen rumgespielt, aber bekomme es nicht hin.
dir /s /b *.???.
bzw.
dir /s /b *.???.*
oder
$Virusverdacht = cmd /c dir /s /b | select-string -pattern ".*."  

bringt leider auch die Files, die eine normale Dateiendung haben z.B. *.txt und halt nicht wie gewünscht nur Dateien mit *.txt.*

Habt ihr eine Idee für die Umsetzung?

Gruß
KangarooJack

Content-Key: 296683

Url: https://administrator.de/contentid/296683

Printed on: April 19, 2024 at 21:04 o'clock

Mitglied: 126919
126919 Feb 18, 2016 updated at 19:19:20 (UTC)
Goto Top
gci 'c:\*.???.???' -Recurse -Force
fk
Member: Kangaroojack
Kangaroojack Feb 18, 2016 updated at 19:34:57 (UTC)
Goto Top
gci ist viel zu langsam und scheidet daher aus. Dachte das hätte ich bereits oben erwähnt.
Mitglied: 126919
126919 Feb 18, 2016 updated at 19:51:46 (UTC)
Goto Top
dir /b /s /A-D | findstr "\....\....$"
Member: Kangaroojack
Kangaroojack Feb 18, 2016 updated at 22:31:28 (UTC)
Goto Top
Danke für dein Post!
Das funktioniert. Leider bringt mir das jetzt viel zu viele Ergebnisse zurück.

Wenn man das jetzt noch filtern könnte, also dass nur Dateien gelistet werden, die heute geschrieben/geändert wurden - dann wärs denke ich okay.

also in etwa so:
dir /s /A-D | findstr "18.02.2016" | findstr "\....\....$"  


Leider steht damit im Ergebnis kein Pfad drin und man müsste Datum/Uhrzeit wegtrimmen....

Und mit dir /s /b... lässt sich nicht nach dem Datum filtern...hmmmm
Member: TlBERlUS
TlBERlUS Feb 19, 2016 updated at 08:08:06 (UTC)
Goto Top
Zitat von @Kangaroojack:

gci ist viel zu langsam und scheidet daher aus. Dachte das hätte ich bereits oben erwähnt.
Dir ist aber bewußt, dass 'dir' in Powershell ein Alias für 'gci' ist, und dazu in der Ausführung langsamer ist?
Zeit für ein Verzeichnis mit 598 Ordnern und 24.026 Dateien (mit recurse)
dir: 00:00:03.3278915
gci: 00:00:03.2744544
Member: joachim57
joachim57 Feb 19, 2016 at 10:20:46 (UTC)
Goto Top
Ich experimentiere auch gerade mit sowas rum. Im Moment sieht mein Code so aus:

Write-Host ("Powershell Version: " + $host.version.major)  

$path="D:\LWE"  
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$strOutFileName=$scriptPath + "\DateiListe.txt"  
write-Host ("Output file is: " + $strOutFileName )  
If (Test-Path $strOutFileName){
	Remove-Item $strOutFileName
	}

$checkfiles=@(
			  "*decipher*"  
			  ,"*install_tor*.*"  
			  ,"*restore_file*.*"  
			  ,"*want your files back.*"  
			  ,"confirmation.key"  
			  ,"enc_files.txt"  
			  ,"last_chance.txt"  
			  ,"recovery_file.txt"  
			  ,"recovery_key.txt"  
			  ,"*help_your_files*.*"  
			  ,"*help_restore*.*"  
			  ,"*HELP_TO_DECRYPT*.*"  
			  ,"*HELP_TO_SAVE*.*"  
			  ,"*HELP_DECRYPT*.*"  
			  ,"*HOW_DECRYPT*.*"  
			  ,"*how_to_recover*.*"  
			  ,"*DecryptAllFiles*.txt"  
			  ,"*DECRYPT_INSTRUCTION*.*"  
			  ,"*recover_instructions.*"  
			  ,"*.locky"  
			  ,"*.*yC"  
			  ,"*.jpg.*"  
			  ,"*.jpeg.*"  
			  ,"*.doc.*"  
			  ,"*.docx.*"  
			  ,"*.xls.*"  
			  ,"*.xlsx.*"  
			  ,"*.pdf.*"  
			  ,"*.xml.*"  
			  )

$mypath=$path + "\*"  
	
if ($host.version.major -gt 2) {
	#Powershell 4, ignore instead silentlycontinue
	$fileslist=@(get-childitem -path $mypath -Recurse -Include $checkfiles -ErrorAction Ignore)
} else {
	#Powershell 2 doesn't have ignore and recurse works differently with wildcards, therefore returns all files and is much, much slower than posh4 
	$fileslist=@(get-childitem -path $mypath -Recurse -Include $checkfiles -ErrorAction SilentlyContinue)
	}

# Write-Host $fileslist

foreach ($item in $fileslist)  {
	# hier könnte man noch nach Datum filtern

	if ($host.version.major -gt 2) {
		#Powershell 4, ignore instead silentlycontinue
		$a="$_$((get-item $item.fullname -erroraction ignore).lastwritetime.tostring("dd.MM.yyyy HH:mm:ss"))`t$($item.Fullname)"  
	} else {
		#Powershell 2 doesn't have ignore and recurse works differently with wildcards, therefore returns all files and is much, much slower than posh4 
		$a="$_$((get-item $item.fullname).lastwritetime.tostring("dd.MM.yyyy HH:mm:ss"))`t$($item.Fullname)"  
		}

	Out-File -filePath $strOutFileName -inputobject $a -append
	}


Ausführungszeit bei 14.647 Dateien, 2.072 Ordner, 13,9 GB ca. 4 Sekunden
Die Idee dafür stammt von HIER

Bin leider nicht so fit mit Powershell. Ist also bestimmt noch verbesserungsfähig...
Mitglied: 126919
126919 Feb 19, 2016 updated at 10:39:51 (UTC)
Goto Top
Zitat von @Kangaroojack:

Danke für dein Post!
Das funktioniert. Leider bringt mir das jetzt viel zu viele Ergebnisse zurück.

Wenn man das jetzt noch filtern könnte, also dass nur Dateien gelistet werden, die heute geschrieben/geändert wurden - dann wärs denke ich okay.
Kein Problem, wenn man's vorher weiß ...
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in ('dir /B /S /A-D "C:\" ^| findstr "\....\....$"') DO set t=%%~ta & if "!t:~0,10!" == "%DATE%" echo %%a  

@joachim57
lässt sich für Dateien die sich heute geändert haben so abkürzen:
$path = "C:\Ordner"  
$trigger=@(
    ".*decipher.*"  
    ,".*install_tor.*\..*"  
    ,".*restore_file.*\..*"  
    ,".*want your files back\..*"  
    ,"confirmation\.key"  
    ,"enc_files\.txt"  
    ,"last_chance\.txt"  
    ,"recovery_file\.txt"  
    ,"recovery_key\.txt"  
    ,".*help_your_files.*\..*"  
    ,".*help_restore.*\..*"  
    ,".*HELP_TO_DECRYPT.*\..*"  
    ,".*HELP_TO_SAVE.*\..*"  
    ,".*HELP_DECRYPT.*\..*"  
    ,".*HOW_DECRYPT.*\..*"  
    ,".*how_to_recover.*\..*"  
    ,".*DecryptAllFiles.*\.txt"  
    ,".*DECRYPT_INSTRUCTION.*\..*"  
    ,".*recover_instructions.*"  
    ,".*\.locky"  
    ,".*\..*yC"  
    ,".*\.jpg\..*"  
    ,".*\.jpeg\..*"  
    ,".*\.doc\..*"  
    ,".*\.docx\..*"  
    ,".*\.xls\..*"  
    ,".*\.xlsx\..*"  
    ,".*\.pdf\..*"  
    ,".*\.xml\..*"  
) -join '|'  

gci $path -Recurse -ErrorAction Ignore | ?{$_.LastWriteTime.date -eq (get-date).Date -and $_.Name -match $trigger}
Member: Kangaroojack
Kangaroojack Feb 19, 2016 at 11:58:25 (UTC)
Goto Top
Zitat von @TlBERlUS:

Zitat von @Kangaroojack:

gci ist viel zu langsam und scheidet daher aus. Dachte das hätte ich bereits oben erwähnt.
Dir ist aber bewußt, dass 'dir' in Powershell ein Alias für 'gci' ist, und dazu in der Ausführung langsamer ist?
Zeit für ein Verzeichnis mit 598 Ordnern und 24.026 Dateien (mit recurse)
> dir: 00:00:03.3278915
> gci: 00:00:03.2744544
> 

deshalb ja auch
cmd / c dir....
DIR ist bei sehr vielen Dateien um WELTEN schneller als GCI! Habs selber probiert. Wenn ich über GCI suche, braucht mein Skript >30 Minuten.
mit DIR ist es oft in ca. 10 Minuten durch!

Hier ein Post dazu:
www.codeproject.com/Articles/767649/Get-ChildItem-vs-Dir-in-PowerShell
Member: TlBERlUS
TlBERlUS Feb 19, 2016 at 12:45:57 (UTC)
Goto Top
Zitat von @Kangaroojack:
DIR ist bei sehr vielen Dateien um WELTEN schneller als GCI! Habs selber probiert. Wenn ich über GCI suche, braucht mein Skript >30 Minuten.
mit DIR ist es oft in ca. 10 Minuten durch!
Wie viele Dateien durchsuchst du denn da?
Danke, werde ich mir bei Gelegenheit zu Gemüte führen!
Member: Kangaroojack
Kangaroojack Feb 19, 2016 at 13:26:32 (UTC)
Goto Top
Zitat von @TlBERlUS:

Zitat von @Kangaroojack:
DIR ist bei sehr vielen Dateien um WELTEN schneller als GCI! Habs selber probiert. Wenn ich über GCI suche, braucht mein Skript >30 Minuten.
mit DIR ist es oft in ca. 10 Minuten durch!
Wie viele Dateien durchsuchst du denn da?
Danke, werde ich mir bei Gelegenheit zu Gemüte führen!


Es werden schon ettliche 100.000de Dateien (evtl. sogar Millionen) sein. habs noch nicht genau gezählt.
Ein Order der letztens befallen war hatte allein schon 123.000 Dateien.
Mitglied: 126919
126919 Feb 19, 2016 at 13:44:55 (UTC)
Goto Top
s. oben ...
Member: Kangaroojack
Kangaroojack Feb 22, 2016 updated at 16:53:47 (UTC)
Goto Top
Vielen Dank an alle, besonders FLACHKOEPPER!

Also,
ich habe das jetzt so umgesetzt:

1. eine Batch - die dann, wenn nötig ein Powershellskript startet um die Fileliste auszuwerten
(habs nicht hinbekommen die for-Schleife mit einem cmd /c aus der powershell zu starten - kein Plan was das Ding hat, meckert jedenfalls immer rum)

@echo off & setlocal ENABLEDELAYEDEXPANSION
chcp 1252
set "Pfad=X:\xxx\xxx"  
set "Output=C:\Skript\VirusCheckDateien.txt"  
set "Skript=C:\Skript\VirusCheck.ps1"  
if exist "%Output%" (del /Q "%Output%")  

for /f "delims=" %%a in ('dir /B /S /A-D "%Pfad%" ^| findstr "\....\....$"') DO set t=%%~ta & if "!t:~0,10!" == "%DATE%" echo %%~ta %%a>>%Output%  
if exist "%Output%" ( C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -ExecutionPolicy Bypass -Command "& '%Skript%'" )  


2. Das Powershellskript, was die Auswertung macht und falls nötig eine Mail verschickt. In der Mitte ein Codeblock in dem man ggf. Ausnahmen definieren kann.

chcp 1252
$INPUT = "C:\Skript\VirusCheckDateien.txt"  
$file = "C:\Skript\VirusCheckVerdacht.txt"  
$Datum = Get-Date -format dd.MM.yyyy
$HName = $(Get-WmiObject Win32_Computersystem).name
$pw = Get-Content C:\Skript\MailPW.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential "Benutzername", $pw  
$MailEmpfaenger = @("xxx.xxx@xxx.de", "yyyy.yyy@yyy.de")  

$Virusverdacht = select-string $INPUT -pattern "$Datum" | ForEach-Object {$_.Line -replace "$Datum.......", ""}  
$Virusverdacht | Out-file $file

#foreach ($str in $Virusverdacht)
#{
#	if ($str -like '*log.tmp*') {  
	   # SubString ist nicht enthalten; die * sind bedingt erforderlich
#	} 	else {
#			$str | out-file $file -append   # SubString ist enthalten -> Zeile wird an die Datei angehängt
#                     if ($str -like '*xml.log*') {  
#			} 	else {
#					if ($str -like '*zip.xte*') {  
#					} 	else {
#							if ($str -like '*zip.log*') {  
#							} 	else {
#									if ($str -like '*dat.log*') {  
#									} 	else {
#											if ($str -like '*csv.log*') {  
#											} 	else {
#													$str | out-file $file -append   # SubString ist enthalten -> Zeile wird an die Datei angehängt
#												}	
#										}
#								}
#						}
#				}
#		}
#}

if (Test-path "$file" ) {              
	# Test ob File existiert, falls ja dann
	Send-MailMessage -SmtpServer mailserver.domaene -to $MailEmpfaenger -from "xxx.xxx@xxx.de" -Subject "!!! Achtung Virusverdacht Laufwerk, Bitte pruefen!!!" -Attachments $file -Priority High -Credential $cred  
	Remove-Item $file
	Remove-Item $INPUT
} else {  
# Test ob File existiert, falls nein dann          
}


Wird also eine Datei mit doppelter Dateiendung sowie heutigem Datum gefunden, schreibt das Teil sie ins Log und schickt sie am Ende als Mail raus.
Das ganze habe ich als Task, jede Stunde, auf den Fileservern rennen.

Leider ist es halt so, dass er natürlich den ganzen Tag jede Stunde ne Mail raushaut, wenn eine entsprechende Datei angelegt wird.
Daher werde ich noch versuchen, die Dateien anhand der Uhrzeit (Stunde) zu filtern, da es bei uns doch recht viele Dateien mit doppelter Dateiendung im System gibt, sodass nur noch einmalig eine Mail rausgeht.
dann würde nur
Member: colinardo
colinardo Feb 22, 2016 updated at 19:32:49 (UTC)
Goto Top
Hallo @Kangaroojack

Oder man macht das intelligent mit einem Filesystemwatcher der automatisch sofort anspringt wenn eine verdächtige Datei entdeckt wird (Zeile 18 zum Verschicken der Mail ist auskommentiert da die Parameter erst angepasst werden müssen). Zur Demo gibt das Skript bei Erstellung einer verdächtigen Datei dies auf der Konsole aus.
# Ordner der zu überwachen ist (inkl. Unterordner)
$folder = 'C:\Ordner'  
$filter = '*.*'  
$trigger = '\.(aaa|abc|ccc|ecc|exx|vvv|yxz|zzz|xxx|ttt|micro|encrypted|locky)$|decipher|install_tor|restore_file|want your files back\..*|confirmation\.key|enc_files\.txt|last_chance\.txt|recovery_file\.txt|recovery_key\.txt|help_your_files.*\..*|help_restore.*\..*|HELP_TO_DECRYPT.*\..*|HELP_TO_SAVE.*\..*|HELP_DECRYPT.*\..*|HOW_DECRYPT.*\..*|how_to_recover.*\..*|DecryptAllFiles.*\.txt|DECRYPT_INSTRUCTION.*\..*|recover_instructions.*|\..*yC$'  

if(Get-EventSubscriber CryptoCreated -EA SilentlyContinue){Unregister-Event CryptoCreated; Unregister-Event CryptoRenamed}
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $true;NotifyFilter = [IO.NotifyFilters]'LastWrite,Filename'}   

$action = {
    $name = $Event.SourceEventArgs.Name
    $fullpath = $Event.SourceEventArgs.FullPath
    $timeStamp = $Event.TimeGenerated
    write-host ($event.SourceEventArgs | fl * | out-string)
    if ($name -match $event.MessageData){
        # Treffer benachrichtige User ...
        $body = "Verdächtige Datei mit den Pfad '$fullpath' wurde um '$($timeStamp.toString('G'))' $(if ($event.SourceEventArgs.Changetype -eq 'Renamed'){'umbenannt'}else{'erstellt'})."  
        write-host $body -F Yellow
        # Send-MailMessage -From "user@domain.de" -to "empfaenger@domain.de" -Subject "Verdächtige Datei entdeckt" -body $body -SmtpServer smtp.domain.de -Credential (New-Object PSCredential("USERNAME",(ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force))) -UseSSL  
    }
}

Register-ObjectEvent $fsw Created -SourceIdentifier CryptoCreated -Action $action -MessageData $trigger | Out-Null
Register-ObjectEvent $fsw Renamed -SourceIdentifier CryptoRenamed -Action $action -MessageData $trigger | Out-Null

write-host "Überwache Verzeichnis '$folder' auf neue verdächige Dateien ..." -ForegroundColor Green  
while($true){sleep(1)}
Grüße Uwe
Member: Kangaroojack
Kangaroojack Feb 22, 2016 at 19:44:49 (UTC)
Goto Top
Hallo Uwe, danke fürs posten!

Über den Begriff "filesystemwatcher" bin ich gestern in einem Powershell-Buch gestolpert, habs aber nicht weiter verfolgt.

Klingt interessant.
Aber ich stelle mir das ganze ziemlich Ressourcenhungrig vor, wenn das Ding ne Ordnerstruktrur von ettlichen 100.000 Dateien überwachen soll?
Hast du das Skript bei Dir/Euch am Start?

Gruß
Michael
Member: colinardo
colinardo Feb 22, 2016 updated at 23:20:31 (UTC)
Goto Top
Zitat von @Kangaroojack:

Klingt interessant.
Aber ich stelle mir das ganze ziemlich Ressourcenhungrig vor, wenn das Ding ne Ordnerstruktrur von ettlichen 100.000 Dateien überwachen soll?
Nein ist es nicht, das ist ja der Vorteil Windows klinkt sich in den Dateisystemtreiber ein und überwacht nur bestimmte Teile beim Platten-Zugriff die nötig sind, das kann man mit den Notify-Filtern optimieren.
Hast du das Skript bei Dir/Euch am Start?
Das Skript hier nicht aber diverse andere Skripte nach dem selben Schema, wovon es hier von mir noch einige weitere gibt.
Member: colinardo
colinardo Feb 23, 2016 updated at 11:02:05 (UTC)
Goto Top
Btw. gibt es für FileServer heutzutage von Windows Out-of-the-Box schon eine Überwachungsfunktion von Freigaben:
https://www.frankysweb.de/windows-fileserver-vor-ransomware-crypto-locke ...
https://www.frankysweb.de/windows-fileserver-vor-ransomware-schuetzen-up ...
Member: Kangaroojack
Kangaroojack Feb 23, 2016 at 20:45:02 (UTC)
Goto Top
Man hat einfach viel zu wenig Zeit sich mit all dem in Ruhe zu befassen ;)

Klasse, vielen Dank für die Info. Werde ich mir auf jeden Fall anschauen!
Member: colinardo
colinardo Mar 02, 2016 at 15:40:37 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.