Unauthorized File Encryption

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von bazi.

    Unauthorized File Encryption

    Hallo, wie auch schon im Beitrag "Virenscanner meldet mein Programm als Virus" von einem anderen Nutzer beschrieben wird auch mein Programm von Trend-Micro Virenscanner als Bedrohung erkannt und in Quarantäne verschoben.
    Das passiert bei mir jedoch nicht bei jedem Programmstart, sondern immer wenn eine Datei nicht ordnungsgemäß beendet wurde und ich im Code abfrage ob die wieder hergestellt werden soll.
    Mein Code dazu:

    VB.NET-Quellcode

    1. Friend Function ExtractZipData(ByVal QuellFileName As String) As Boolean
    2. Dim Exist As Boolean = False
    3. Dim TempDirectoryName = GetTempDirectoryName(QuellFileName, Exist)
    4. Dim NewDataFileName = IO.Path.Combine(TempDirectoryName, String.Concat(IO.Path.GetFileNameWithoutExtension(QuellFileName), DataFileExtension))
    5. Dim löschen As Boolean = False
    6. If Exist Then
    7. If MessageBox.Show("Die gewünschte Datei wurde scheinbar bei der letzten Benutzung nicht ordnungsgemäß geschlossen" & Environment.NewLine _
    8. & "Soll versucht werden die Daten wieder herzustellen?", ProgrammName, MessageBoxButtons.YesNo) = DialogResult.Yes Then
    9. 'beim entpacken würde das Verzeichnis gelöscht, daher wurde in GetTempDirectoryName ein neuer Name hochgezählt und in TempDirectoryName geschrieben
    10. Dim SichFileName = String.Concat(TempDirectoryName, "\", IO.Path.GetFileNameWithoutExtension(QuellFileName), "SK_", DataFileExtension)
    11. If IO.File.Exists(NewDataFileName) AndAlso IO.File.Exists(SichFileName) Then
    12. IO.File.Delete(NewDataFileName)
    13. IO.File.Move(SichFileName, NewDataFileName)
    14. End If
    15. Else
    16. löschen = True
    17. End If
    18. End If
    19. If löschen Then
    20. Dim di As New IO.DirectoryInfo(TempDirectoryName)
    21. For Each f In di.GetFiles
    22. f.Delete()
    23. Next
    24. di.Delete(True)
    25. Exist = False
    26. End If
    27. QuellZipFile = QuellFileName
    28. If isOpen() Then
    29. FileIsReadONly = True
    30. Else
    31. SetzeOpenKennung()
    32. End If
    33. If Not Exist Then
    34. Dim UnZipResult = UnZipIt(QuellFileName, TempDirectoryName)
    35. If UnZipResult <> TempDirectoryName Then
    36. MessageBox.Show("Beim entpacken wurde zurückgegeben: " & UnZipResult) ' Fehler
    37. Return False
    38. End If
    39. End If
    40. Me.TempDirectory = TempDirectoryName
    41. Dim DataFile = NewDataFileName
    42. If IO.File.Exists(DataFile) Then
    43. Me.DataFile = DataFile
    44. Else
    45. DataFile = InputBox("Bitte fügen Sie den Dateinamen aus dem Temporären Ordner ein", "Datendatei zuweisen", DataFile)
    46. If IO.File.Exists(DataFile) AndAlso IO.Path.GetExtension(DataFile) = DataFileExtension Then Me.DataFile = DataFile
    47. End If
    48. Return True
    49. End Function

    Wie könnte ich das anders lösen ?
    Gruß Christian

    CodeTags korrigiert; bitte zukünftig darauf achten, das richtige CodeHighlighting zu verwenden ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Indem Du erstmal die ganze Methode in ihre Einzelteile zerlegst und dann konkret sagst, an welcher Stelle die Meckerei losgeht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Für was ist denn das If Exist die Exist Variable ist ja False. Das Rekrusive löschen eines Verzeichnisses könnstest du mit Directory.Delete(Pfad, True) erledigen würde dir die Schleife sparen. Ist UnZipIt eine Methode von dir? Falls ja könntest du die mal Posten.
    @ VaporiZed: Da bei meinem Rechner der Fehler nicht kommt, ist das leider nicht möglich. Das passiert auf einem Rechner im Büro für das ich arbeite.

    @ Fakiz, die Variable Exist wird an die Funktion GetTempDirectoryName übergeben und dort auf True gesetzt wenn das Verzeichnis vorhanden ist.

    Ich entpacke in der Funktion UnZipIt die Daten aus einer Zip-Datei in das vorgegebene Verzeichnis. Beim korrekten beenden wird dieses Verzeichnis vom Programm gelöscht. Wenn es aber da ist, dann wird die Variable Exist in der Funktion GetTempDirectoryName auf True gesetzt und der Anwender erhält eine Meldung ob er die Daten der letzten Sitzung wieder herstellen möchte.
    Nach dieser Frage schaltet sich dann der Virenscanner ein und verschiebt die .exe in die Quarantäne und beendet das Programm.

    Quellcode

    1. Public Function UnZipIt(ByVal ZipToUnpack As String, Optional ByVal UnpackDirectory As String = "") As String
    2. Try
    3. If Not IO.File.Exists(ZipToUnpack) Then Return "Datei existiert nicht"
    4. If UnpackDirectory.Length = 0 Then UnpackDirectory = IO.Path.GetDirectoryName(ZipToUnpack)
    5. Dim UnpackFileName As String = IO.Path.GetFileNameWithoutExtension(ZipToUnpack)
    6. If IO.Directory.Exists(IO.Path.Combine(UnpackDirectory, UnpackFileName)) Then _
    7. IO.Directory.Delete(IO.Path.Combine(UnpackDirectory, UnpackFileName), True) : Threading.Thread.Sleep(10)
    8. Using zip1 As ZipFile = ZipFile.Read(ZipToUnpack)
    9. Dim e As ZipEntry
    10. ' here, we extract every entry, but we could extract conditionally,
    11. ' based on entry name, size, date, checkbox status, etc.
    12. Dim zähler As Integer = zip1.Entries.Count
    13. Programm.SetProgressMax(Nothing, New IntegerEventArgs(zähler))
    14. zähler = 0
    15. For Each e In zip1
    16. zähler += 1
    17. Try
    18. e.Extract(UnpackDirectory, ExtractExistingFileAction.OverwriteSilently)
    19. Catch ex As Exception
    20. DebugToFile(ex.Message)
    21. End Try
    22. Programm.SetProgressValue(Nothing, New IntegerEventArgs(zähler))
    23. Next
    24. Programm.SetProgressValue(Nothing, New IntegerEventArgs(0))
    25. End Using
    26. Return IO.Path.Combine(UnpackDirectory, UnpackFileName)
    27. Catch ex As Exception
    28. 'DataSet.CheckedImporteList += "es kam zu einem Fehler beim Entpacken: " & Environment.NewLine & ex.Message & Environment.NewLine
    29. InfoBox("Fehler beim Entpacken" & Environment.NewLine & ex.Message)
    30. Return ex.Message
    31. End Try
    32. End Function

    Da das Programm ohne Probleme durchläuft wenn die MsgBox nicht kommt müsste der vom Virenscanner monierte Code im Block If löschen kommen.
    Der Absturz ist unabhängig davon ob die MsgBox mit ja oder nein beantwortet wird.

    Quellcode

    1. If löschen Then
    2. Dim di As New IO.DirectoryInfo(TempDirectoryName)
    3. For Each f In di.GetFiles
    4. f.Delete()
    5. Next
    6. di.Delete(True)
    7. Exist = False
    8. End If


    Ich tausche mal diese Schliefe gegen ein Directory.Delete(Pfad, True) aus und schau was dann passiert.

    Auf welchen Pfad zeigt den TempDirectoryName?

    PS:

    Da das Programm ohne Probleme durchläuft wenn die MsgBox nicht kommt müsste der vom Virenscanner monierte Code im Block If löschen kommen.
    Der Absturz ist unabhängig davon ob die MsgBox mit ja oder nein beantwortet wird.

    Wenn die MsgBox nicht kommt oder mit DialogResult.Yes bestätigt wird dann ist löschen False. Zumindest soweit ich das sehe.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fakiz“ ()

    Der Austausch hat erstmal nichts gebracht. Nach der Frage wird das Programm beendet und die .exe ist weg.

    TempDirectoryName zeigt auf einen Ordner unter Dokumente mit dem Namen der Datei die geöffnet wird.

    Quellcode

    1. Private Function GetTempDirectoryName(ByVal QuellFileName As String, ByRef Exist As Boolean) As String
    2. Dim UnZipFolder =
    3. IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
    4. IO.Path.GetFileNameWithoutExtension(QuellFileName))
    5. Dim TempDirectoryName = UnZipFolder
    6. Dim i As Integer = 1
    7. Do While IO.Directory.Exists(TempDirectoryName)
    8. Exist = True
    9. TempDirectoryName = UnZipFolder & "(" & i.ToString & ")"
    10. i += 1
    11. Loop
    12. Return UnZipFolder 'TempDirectoryName
    13. End Function

    ggf mit angehängtem Index.

    Den Temp-Ordner habe ich absichtlich nicht verwendet da ich hier schon Probleme hatte dass irgendein Programm auf dem Rechner alles unter Temp gelöscht hat und meine Arbeitssitzung verloren war.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „bazi“ ()

    GetTempDirectoryName ginge auch etwas kürzer.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function GetTempDirectoryName(ByVal QuellFileName As String, ByRef Exist As Boolean) As String
    2. Dim filename = IO.Path.GetFileNameWithoutExtension(QuellFileName)
    3. Dim suffix = (IO.Directory.GetDirectories(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), $"{filename}*").Length + 1)
    4. Exist = suffix > 1
    5. Return $"{filename}{suffix}"
    6. End Function



    Du könntest mal veruschen den Lokalen AppData (Application.LocalUserAppDataPath) Pfad zu verwenden.
    die Änderung des Verzeichnispfades in das Application.LocalUserAppDataPath habe ich übernommen. Das gefällt mir grundlegend besser als in Dokumente zu schreiben.
    Das Problem wurde dadurch aber noch nicht behoben. Auch wenn dort das Verzeichnis schon existiert stürzt das Programm nach der Meldung ab und die .exe ist weg.
    Ja das dachte ich mir schon. Ne kurze Internetsuche bring zu Tage das du da wohl nicht der einzige mit dem Problem bist.

    Trend Micro schrieb:


    Software developers can apply for the Trend Micro GRID program where
    they can submit the application before public release. You may refer to The GRID: Goodware Resource and Information Database for more information.

    Preventing Behavior Monitoring false detections in Apex One