SA:MP Launcher erstellen - Bei Programmstart checken, ob Ordner bzw. Datei vorhanden ist

  • VB.NET

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    SA:MP Launcher erstellen - Bei Programmstart checken, ob Ordner bzw. Datei vorhanden ist

    Guten Abend, liebe Community!
    Ich habe heute Fragen bezüglich meines SA:MP Launcher.
    Undzwar: Ich habe bisher alles hingekriegt, dass wenn man auf einem
    bestimmten Button klickt, den GTA Ordner auswählt & dann wird gecheckt,
    ob die samp.exe vorhanden ist. Soweit alles okay, jedoch kann es sein, möchte
    ich so eine Art "Cheatdetektor" ein programmieren mit eurer Hilfe.
    Die Frage ist: Wie kann ich es machen, dass gecheckt wird ob die
    Standartdateien&Verzeichnisse drinnen sind. (also nur die von GTA) &
    ALLES andere, was nicht in dieser Liste bzw. eig. im GTA sind, wird dann
    eine MSGbox kommen, dass die Dateien gelöscht werden sollen.

    Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Dim sampfad As String
    4. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. If (sampfad.) Then //Hier brauche ich Hilfe
    6. End Sub
    7. Private Sub MonoFlat_Button2_Click(sender As Object, e As EventArgs) Handles MonoFlat_Button2.Click
    8. Dim FolderBrowser As New FolderBrowserDialog
    9. sampfad = MonoFlat_Label2.Text
    10. FolderBrowser.Description = "Bitte wählen ..."
    11. FolderBrowser.ShowNewFolderButton = True
    12. FolderBrowser.RootFolder = System.Environment.SpecialFolder.Desktop
    13. FolderBrowser.SelectedPath = My.Computer.FileSystem.SpecialDirectories.Desktop
    14. If FolderBrowser.ShowDialog = Windows.Forms.DialogResult.OK Then
    15. If File.Exists(FolderBrowser.SelectedPath & "\samp.exe") = False Then
    16. MonoFlat_Label2.Location = New Point(112, 82)
    17. Exit Sub
    18. Else
    19. MonoFlat_Label2.Text = "GTA:SA Pfad: " + FolderBrowser.SelectedPath & "\samp.exe"
    20. sampfad = FolderBrowser.SelectedPath & "\samp.exe"
    21. MonoFlat_Label2.Location = New Point(49, 82)
    22. End If
    23. End If
    24. End Sub
    25. End Class

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

    Grundsätzlich ist das nicht schwer.
    Ich habe einfach zwei Dateien erstellt um das ganze zu veranschaulichen. Dies ist natürlich nicht sicher, beziehungsweise eine gute Kontrolle da, entweder die Datei mit den erlaubten Namen bearbeitet werden könnte, oder die Cheats etc. einfach einen erlaubten Namen habe, wie es eigentlich oft der Fall ist. Du müsstest also meine Kontrolle erweitern, sodass z.B. du Datei mit den erlaubten Datei- und Ordner mit deinem Server syncst. Ebenfalls sollte nicht nur der Name überprüft werden sonder, z.B. auch die Dateigröße, ob diese mit den Originaldateien übereinstimmt.
    Dies sind natürlich nur ein paar Denkanstöße, nun zu der Grundfunktion.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Überprüft ob sich in dem Zielverzeichnis nicht autorisierte Dateien und Verzeichnisse befinden.
    3. ''' </summary>
    4. ''' <param name="folder">Zu überprüfendes Verzeichnis.</param>
    5. ''' <param name="validFiles">Datei welche alle erlaubten Dateinamen beinhaltet.</param>
    6. ''' <param name="validFoldes">Datei welche alle erlaubten Ordernamen beinhaltet.</param>
    7. ''' <param name="deleteIllegalFiles">Gibt an, ob nicht autorisierte Dateien gelöscht werden sollen.</param>
    8. ''' <returns>Gefundene illegale Dateien.</returns>
    9. Private Function CheckForIllegalFiles(folder As String, Optional validFiles As String = "ValidFiles.txt", Optional validFoldes As String = "ValidFolders.txt", Optional deleteIllegalFiles As Boolean = False) As List(Of String)
    10. Dim l As New List(Of String)
    11. Dim vFiles As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines(validFiles)) 'Liest erlaubte Dateien aus der ValidFiles.txt aus
    12. Dim vFolders As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines(validFoldes)) 'Liest erlaubte Ordner aus der ValidFolders.txt aus
    13. If Directory.Exists(folder) Then
    14. For Each file In IO.Directory.GetFiles(folder)
    15. If Not vFiles.Contains(Path.GetFileName(file)) Then 'Überprüft ob die Dateinamen darin enthalten sind.
    16. l.Add(file)
    17. If deleteIllegalFiles Then IO.File.Delete(file)
    18. End If
    19. Next
    20. For Each direct In IO.Directory.GetDirectories(folder) 'Überprüft ob die Ordnernamen darin enthalten sind.
    21. If Not vFolders.Contains(direct.Substring(direct.LastIndexOf("\") + 1, (direct.Length - 1) - direct.LastIndexOf("\"))) Then 'Weil aus irgendeinem Grund bei mir Path.GetDirectoryName nicht funktioniert.
    22. l.Add(direct)
    23. If deleteIllegalFiles Then Directory.Delete(direct)
    24. End If
    25. Next
    26. End If
    27. Return l
    28. End Function


    Diese Funktion macht nichts anderes als die erlaubten Dateinamen aus der ValidFiles.txt, sowie die erlaubten Ordner aus der ValidFolders.txt auszulesen. Beide musst du natürlich zuerst mit den erlaubten Namen (bei den Dateien inklusive Dateiendung) befüllen.
    Anschließend wird überprüft ob das zu überprüfende Verzeichnis diese Datei- und Ordernamen enthält.
    Wenn dies nicht der Fall ist werden sie zur Liste l hinzugefügt. Wenn nun außerdem die Variabel deleteIllegalFiles auf True gesetzt ist,
    werden diese Dateien und Ordner sofort gelöscht.
    Die Funktion gibt danach alle illegalen Dateien und Verzeichnisse in einer List (Of String) zurück.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Okay, so richtig komme ich nicht mit.
    Also das ist die Grundfunktion, du meinst die könnte funktionieren.
    Wo gebe ich die erlaubten Dateinamen & erlauben Ordner ein?

    Dann kann ich wenn man z.B auf "Spielen" klickt, "CheckForIllegalFiles" benutzen?
    Oder wie muss ich das verstehen :C

    Danke aufjedenfall für deine Antwort! @Gather

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

    Okey, das Ganze funktioniert wie folgt:
    Du erstellst, in diesem Fall zwei Testdateien (welche auch auf einem Server hochgeladen sein können etc.), aber nur mal zum testen erstellst du zwei simple .txt Dateien: "Files.txt" und "Folders.txt"
    Diese legts du z.B. in das Verzeichnis in dem sich auch dein Launcher (.exe) befindet.
    In "Files.txt" schreibst du nun z.b:

    Quellcode

    1. samp.exe
    2. README.txt

    usw. hald alle erlaubten Dateien.
    Und das selbe natürlich mit den Ordnern.

    Du klickst nun also auf "Spielen".
    Folglich muss nun die Funktion aufgerufen werden. Dies machst du einfach mit CheckForillegalFiles().
    Bei dieser Funktion siehst du ja, dass diese Parameter verlangt: (folder As String, Optional validFiles As String = "ValidFiles.txt", Optional validFoldes As String = "ValidFolders.txt", Optional deleteIllegalFiles As Boolean = False). Diese sind folgende:
    • folder: Der Pfad der zu untersuchen ist (sampfad)
    • validFiles: Der Pfad zu der (.txt) Datei welche alle Namen der erlaubten Dateien enthält. (In diesem Fall "Files.txt")
    • validFolders: Der Pfad zu der (.txt) Datei welche alle Namen der erlaubten Ordner enthält. (In diesem Fall "Folders.txt")
    • deleteIllegalFiles: Gibt an, ob die illegalen Dateien sofort gelöscht werden sollen. (Dies lassen wir in diesem Bsp. auf False)
    Ich verwende nun eine RichTextBox um dort die illegalen Dateien und Ordner anzuzeigen.

    VB.NET-Quellcode

    1. 'z.B. beim Drücken auf SAMP Überprüfen
    2. For each s in CheckForIllegalItems(sampfad, "Files.txt", "Folders.txt")
    3. Richtextbox1.text &= vbNewLine & s
    4. Next
    5. 'z.B. beim Drücken auf spielen
    6. If MessageBox.Show("Es wurden nicht erlaubte Dateien gefunden, wollen Sie diese löschen.", "Sind Sie sicher?", MessageBoxButtons.YesNo) = DialogResult.Yes Then
    7. CheckForIllegalFiles(sampfad, "Files.txt", "Folders.txt", True) 'Dateien löschen
    8. ElseIf result = DialogResult.No Then
    9. 'Mach was anderes
    10. End If


    Aber wie schon gesagt, und wie du es dir ws denken kannst, ist es ziemlich dumm die, in diesem Fall .txt, Dateien im selben Verzeichnis zu haben wie die .exe deines Launchers.
    Es wäre sinnvoll wenn du diese z.B. von einem FTP server herunterladest, oder direkt vom Webspace ausließt. Dies sind hald ein paar Denkanstöße.

    Aber grundsätzlich macht die Funktion genau das was du willst :)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Vielen Vielen Dank!
    Die letzte Frage bezüglich dieses Themas:
    Kann ich den Inhalt der beiden Textdateien hashen?
    mit MD5 oder sonstwas? damit das halt geschützt ist (falls das was bringt)
    Dann würde ich es auf meinem Webspace hochladen. Ich würde es nur gerne
    absichern. Mfg @Gather
    hashen bringt dir wenig, da dur dann ja nicht die Dateien auslesen kannst.
    Was du machen kannst ist, sie einmal hashen, diesen Hash dann auf deinem Webspace hochladen.
    Anschließend kanns du in der Anwendung die zwei Texdateien wieder hashen und überprüfen ob die erhaltenen Hashes mit denen auf dem Webspace übereinstimmen.
    Wenn nicht verweigerst du einfach ein startes dies Spiels, oder ladest die Dateien erneut herunter.

    Und immer wieder gerne :) Freut mich wenn ich helfen konnte.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    @Gather Ich bin gerade etwas brain-afk.
    Wie downloade ich den String aus der Website & wie
    lese ich den aus & checke dies:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. For Each s In CheckForIllegalFiles(gtapfad, "ValidFiles.txt", "ValidFolders.txt")
    2. MonoFlat_Panel2.Visible = True
    3. MonoFlat_Label10.Visible = True
    4. MonoFlat_Label10.Text = "Es wurden illegale Dateien gefunden! Bitte entferne diese um spielen zu können."
    5. MonoFlat_TextBox2.Visible = True
    6. MonoFlat_TextBox2.Text &= vbNewLine & s
    7. Next
    8. Private Function CheckForIllegalFiles(folder As String, Optional validFiles As String = "ValidFiles.txt", Optional validFoldes As String = "ValidFolders.txt", Optional deleteIllegalFiles As Boolean = False) As List(Of String)
    9. Dim l As New List(Of String)
    10. Dim vFiles As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines(validFiles)) 'Liest erlaubte Dateien aus der ValidFiles.txt aus
    11. Dim vFolders As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines(validFoldes)) 'Liest erlaubte Ordner aus der ValidFolders.txt aus
    12. If Directory.Exists(folder) Then
    13. For Each file In IO.Directory.GetFiles(folder)
    14. If Not vFiles.Contains(Path.GetFileName(file)) Then 'Überprüft ob die Dateinamen darin enthalten sind.
    15. l.Add(file)
    16. If deleteIllegalFiles Then IO.File.Delete(file)
    17. End If
    18. Next
    19. For Each direct In IO.Directory.GetDirectories(folder) 'Überprüft ob die Ordnernamen darin enthalten sind.
    20. If Not vFolders.Contains(direct.Substring(direct.LastIndexOf("\") + 1, (direct.Length - 1) - direct.LastIndexOf("\"))) Then 'Weil aus irgendeinem Grund bei mir Path.GetDirectoryName nicht funktioniert.
    21. l.Add(direct)
    22. If deleteIllegalFiles Then Directory.Delete(direct)
    23. End If
    24. Next
    25. End If
    26. Return l
    27. End Function
    Mit einem WebClient:

    VB.NET-Quellcode

    1. Dim client As WebClient = New WebClient()
    2. Dim hashString As String = client.DownloadString(address)

    msdn.microsoft.com/de-de/library/fhd1f0sw(v=vs.110).aspx

    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    dann:


    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Private Function CheckForIllegalFiles(folder As String, Optional validFiles As String = hashString, Optional validFoldes As String = hashString, Optional dele


    und

    Spoiler anzeigen

    VB.NET-Quellcode

    1. For Each s In CheckForIllegalFiles(gtapfad, hashString, hashString)


    ?
    Nein. Da musst du die Dateien runterladen oder die Funktion ändern.
    Dies bezüglich sie dir das an:
    msdn.microsoft.com/en-us/library/ez801hhe(v=vs.110).aspx

    Aber so in etwa (aus dem Kopf heraus geschrieben)
    Edit:// Einfach ignorieren...

    VB.NET-Quellcode

    1. Private Sub CheckFiles(ByVal validFiles As String, ByVal validFolders As String)
    2. Using wc As New WebClient
    3. If IO.File.Exists(validFiles) Then
    4. If MD5FileHash(validFiles) <> wc.DownloadString("PFAD ZU DER DATEI MIT DEM GÜLTIGEN HASH") Then wc.DownloadFile("PFAD ZU DER DATEI MIT DEN ERLAUBTEN DATEIEN", "ValidFiles.txt")
    5. Else : wc.DownloadFile("PFAD ZU DER DATEI MIT DEN ERLAUBTEN DATEIEN", "ValidFiles.txt")
    6. End If
    7. If IO.File.Exists(validFolders) Then
    8. If MD5FileHash(validFolders) <> wc.DownloadString("PFAD ZU DER DATEI MIT DEM GÜLTIGEN HASH FÜR DIE FOLDERDATEI") Then wc.DownloadFile("PFAD ZU DER DATEI MIT DEN ERLAUBTEN ORDNERN", "ValidFolders.txt")
    9. Else : wc.DownloadFile("PFAD ZU DER DATEI MIT DEN ERLAUBTEN ORDNERN", "ValidFolders.txt")
    10. End If
    11. End Using
    12. End Sub


    Edit:// Unnötig... MD5FileHash


    VB.NET-Quellcode

    1. Private Function MD5FileHash(ByVal sFile As String) As String
    2. Dim MD5 As New MD5CryptoServiceProvider
    3. Dim Hash As Byte()
    4. Dim Result As String = ""
    5. Dim Tmp As String = ""
    6. Dim FN As New FileStream(sFile, FileMode.Open, FileAccess.Read, FileShare.Read, 8192)
    7. MD5.ComputeHash(FN)
    8. FN.Close()
    9. Hash = MD5.Hash
    10. For i As Integer = 0 To Hash.Length - 1
    11. Tmp = Hex(Hash(i))
    12. If Len(Tmp) = 1 Then Tmp = "0" & Tmp
    13. Result += Tmp
    14. Next
    15. Return Result
    16. End Function




    Edit:// @Kenox: Und diese Methode rufst du einfach vor dem CheckForIllegalFiles auf.
    Beziehungsweise ist die Hash-Überprüfung sowieso unnötig, wenn du einfach die Datei jedesmal herunterladen könntest.
    Folglich ignorier den Code einfach, und mach folgendes:

    VB.NET-Quellcode

    1. Using wc as New WebClient
    2. wc.DownloadFile("PFAD ZU DER DATEI MIT DEN ERLAUBTEN DATEIEN", "ValidFiles.txt")
    3. wc.DownloadFile("PFAD ZU DER DATEI MIT DEN ERLAUBTEN ORDNERN", "ValidFolders.txt")
    4. End Using


    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Gather“ ()

    Mh, shit. Ich verstehe es gerade nicht.
    Der Pfad, ist das der wo GTA:SA drinnen steckt?
    Und wenn, wo füge ich "CheckFiles" ein? :O

    @Gather
    Ich habe es bearbeitet. Ist alles unnötig.

    Das ist ja das was du bis jetzt hast:

    VB.NET-Quellcode

    1. For Each s In CheckForIllegalFiles(gtapfad, "ValidFiles.txt", "ValidFolders.txt")
    2. MonoFlat_Panel2.Visible = True
    3. MonoFlat_Label10.Visible = True
    4. MonoFlat_Label10.Text = "Es wurden illegale Dateien gefunden! Bitte entferne diese um spielen zu können."
    5. MonoFlat_TextBox2.Visible = True
    6. MonoFlat_TextBox2.Text &= vbNewLine & s
    7. Next


    Und davor lass einfach den WebClient die Dateien von deinem Webspace runterladen.

    VB.NET-Quellcode

    1. Using wc as New WebClient
    2. wc.DownloadFile("Pfad zu der Datei mit den erlaubten Dateien - AUF DEINEM WEBSPACE - z.B. https://Kenox.de/Validfiles.txt ", "ValidFiles.txt")
    3. wc.DownloadFile("Pfad zu der Datei mit den erlaubten Ordnern - AUF DEINEM WEBSPACE - z.B. https://Kenox.de/Validfolders.txt ", "ValidFolders.txt")
    4. End Using

    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Alles klar, mal wieder vielen Dank!
    Jetzt (soweit) die letzte Frage: Kann man den Code
    von vb.net irgendwie absichern, da ich gehört habe man kann
    Programme wie von Java, VB.NET etc. decompilen. Und da habe ich
    noch nie irgendwas abgesichert. @Gather
    Ja kann man - Stichwort: Obfuskieren - aber wieso?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Oh, ne. das ist dann unnötig.
    Dann nehme ich mir die Chance & frage etwas anderes:
    Ich habe es ja geschafft, dass man seinen GTA Pfad auswählen soll.
    Jedoch wird das nach jedem Programmstart ressetet. Gibt es eine möglichkeit
    das zu speichern z.B in einer INI oder sonst was?
    Entweder eine .Ini, eine andere Datei, oder einfach My.Settings. verwenden.
    Aber für solche kleinen Fragen gibts Google ;)
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Okay, hingekriegt. Nur, das auslesen bzw. abfragen verstehe ich nicht:
    Ich habe derzeit diesen Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If (My.Settings.GTAPfad) Then


    Ich will abfragen, ob ein Wert in My.Settings eingetragen wurde, wenn nicht
    muss man den Pfad auswählen. Nur weiß ich nicht wie ich das abfragen soll. @Gather

    VB.NET-Quellcode

    1. If IO.Directory.Exists(My.Settings.GTAPfad) Then gtapfad = My.Settings.GTAPfad


    dreamincode.net/forums/topic/1…-use-mysettings-in-vbnet/
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Kenox schrieb:

    den Pfad auswählen
    Da gibt es einen FolderBrowserDialog.
    Machst Du ganz schnell Option Strict On.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kannst du mir die Funktion erklären? Also die If Abfrage die du geschickt hast.
    Ich wäre dir mega dankbar, denn Englisch ist nicht wirklich meine stärke.
    @Gather

    //edit: @RodFromGermany Ich weiß c: das alles ist schon gemacht,
    ich habe auch den Pfad ( die er auswählt) in die Mysettings gespeichert.
    Nun möchte ich abfragen, ob ein Wert in der Mysettings steht, also ob er
    einmal den GTA Ordner ausgewählt hatte. Wenn nicht, kommt mein Code,
    also was du geschrieben hast, FolderBrowserDialog. Danke trotzdem!