Frage/Problem bezüglich FileRead

  • Hallo AutoIt,de!

    Ich hab mich hier mal Registriert da ich ein Problem hab. also erst mal zur Vorgeschichte.

    Ich hab mir ein relativ großes Programm gemacht. Dieses Programm möchte ich an meine Freunde weitergeben. Was das Programm kann bzw. macht ist in diesem Falle nicht relevant. Nun hab ich dass Problem dass ich das Programm schützen möchte vor anderen Leuten denen ich nicht vertraue. Ich hab schon mir darüber einen Kopf gemacht und werde folgendes nutzen:

    1. Es wird über einen Md5 Hash eine HWID (Hardware - ID) erstellt
    2. Diese wird in einer Variable gespeichert
    3. Es wird von einem FTP Server (auf Kilu.de) eine .txt Datei heruntergeladen. In ihr steht in jeder Zeile eine HWID (Hardware - ID) von einem PC dem es erlaubt ist das Programm zu benutzen
    4. Es wird jede HWID aus der .txt ausgelesen und mit der erzeugten HWID (siehe dazu 1.) verglichen
    5. Wenn die eine HWID mit einer einzigen HWID in der .txt Datei übereinstimmt soll zu einer Function gewechselt werden bzw. soll das Programm freigeschalten werden. Wenn keine HWID in der .txt mit der HWID vom Nutzer übereinstimmt wird eine Fehlernachricht ausgegeben.

    Also das habe ich bereits davon abgearbeitet:

    - 1. ist vollkommen Funktionstüchtig
    - 2. auch
    - 3, auch. Die Datei wird vom FTP heruntergeladen
    - 5. auch

    Mein Problem liegt in 4. Das Downloaden der .txt Datei ist kein Problem, aber das Vergleichen schon. Denn in der .txt Datei steht ja nicht nur eine HWID sondern mehrere. Diese müssen alle verglichen werden. Und da sich die Anzahl der HWID`s ständig ändert (mal welche hinzu,mal welche hinweg) ist dies einfach zu kompliziert für mich.

    Mein Programm möchte ich nicht Posten! Soviel sei gesagt, es ist kein Bot, kein Hack und auch kein Virus! Es ist absolut legal, ich möchte es nur vor anderen Schützen! Ich hoffe ihr könnt mir helfen.

    Mit freudlichen grüßen, Gh0st

    Einmal editiert, zuletzt von Gh0st (27. Juli 2011 um 15:33)

  • Kurz und knapp man kann eine Autoitscript nicht effektiv schützen, da es sehr einfach zu decompilieren geht und damit jeder Schutz recht einfach auszuschalten ist.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hallo Ghost,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die deutsche Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/Tutorial Sehr hilfreich ist auch das Buch von peethebee

    und jetzt zu deinem Problem: Lies die Textdatei mit

    [autoit]

    _FileReadToArray

    [/autoit]

    und verwende danach

    [autoit]

    _ArraySearch

    [/autoit]

    um festzustellen ob eine bestimmte ID im Array ist,

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (27. Juli 2011 um 11:40)

  • Ein wirklicher Schutz ist es dennoch nicht.

    Schwachstellen:

    - Autoit Scripte können leicht dekompiliert werden, auch der Obfuskator bringt kaum zusätzlichen Schutz. Dadurch reicht ggf. schon das ändern eines einzigen Zeichens im dekompilierten Quellcode um deine Prüfung unwirksam zu machen.
    - Du integrierst FTP Zugangs Daten ins Script? Dann achte darauf, dass diese wenigstens nur Leserechte besitzen.
    - Internetverbindung und ein Webspace der wirklich immer erreichbar ist wird benötigt. Free Webspace ist da nicht unbedingt das Wahre.
    - Du schreibst, dass nach einmaliger Verifizierung dauerhaft freigeschaltet wird, das bedeutet du speicherst das Prüfergebnis irgendwo (ini Datei / Registry ?) Ebenfalls angreifbar, je nachdem wie du das abgesichert hast.
    - Du veröffentlichst eine komplette Keyliste auf deinem Server, besser wäre ein PHP Script, dass je nach übergebener HWID ein true oder false oder besser einen verschlüsselten code zurückgibt, das würde dann auch bedeuten, dass du keine FTP Daten mehr ins Script einbauen müsstest und eine lokale Dateiprüfung entfällt. Die Datei könnte ja auch manipuliert werden.

    Das wirkliche Hauptproblem wird aber immer die Dekompilierbarkeit bleiben. Dagegen kannst du dich kaum schützen. Den ein oder anderen Weg gibt es um das deutlich zu erschweren, einfach mal ein wenig suchen. Die Frage ist aber auch immer ob sich der ganze Aufwand lohnt. Am besten verhinderst du von Anfang an, dass das Script in falsche Hände gelangt, dann brauchst du dir auch keine Gedanken machen.

  • Wegen Decompilern mache ich mir keine Angst. Meine AutoIt Scripte sind undecompilebar da sie gepackt sind und sehr gut mit unveröffentlichen Obfuscatoren geschützt sind. Und solche gesicherten Programme können nur durch debuggen richtig analysiert werden. Um den zu decompilen müsste man mit PE Scanner, Hexscanner und Debugger (zB OllyDbg) die "Verpackung" lösen, und dass geht nur manuell und sehr langsam. Doch debuggen von AutoIt ist auch sehr schwer da man erst die "IsDebbugerPresent" Calls Noppen (0x90) müsste :P

    Und mit dem _FileReadToArray und _ArraySearch komme ich wenig klar. Könnt ihr mir dazu ein Script geben? Und wenn ihr mir ein Script gebt, dann bitte mit vielen kommentaren. Denn ich finde AutoIt kann man am besten an Beispielen lernen die gut kommentiert sind. Ich hoffe ihr seht mich nicht an einen C&P´ler (Copy & paste) an denn ich kenne zwar AutoIt schon seit knapp 2 Jahren aber Arrays sind bisher immer meine riesige Schwäche.

    Mfg Gh0st

  • Versteh mich nicht falsch, aber da du dich scheinbar recht gut im Thema Reverse Engineering auskennst sollten Arrays doch wohl wirklich nichts kompliziertes für dich sein. Hast du dir die Hilfeeinträge zu den beiden genannten Funktionen überhaupt mal angesehen? Dort sind doch sogar lauffähige Beispielscripte dabei. Du hast es doch auch geschafft die FTP Funktionen und unzählige andere zu verstehen, immerhin sprichst zu von einem relativ großen Programm.

    Hier noch ein Tutorial das allgemein auf Arrays eingeht: http://wiki.autoit.de/wiki/index.php/Tutorial#Arrays

  • Und mit dem _FileReadToArray und _ArraySearch komme ich wenig klar. Könnt ihr mir dazu ein Script geben?

    Ein solcher SuperCrack wie du sollte doch in der Lage sein die Hilfe zu lesen. Erst einen undecompilierbaren Bot bauen und dann an dieser Kleinigkeit scheitern?

    [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $avArray[6]

    [/autoit][autoit][/autoit][autoit]

    for $i = 0 to 5
    $avArray[$i] = "String" & $i
    Next

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($avArray, "$avArray")

    [/autoit][autoit][/autoit][autoit]

    $sSearch = InputBox("_ArraySearch() Demo", "Welcher String soll gesucht werden?")
    If @error Then Exit

    [/autoit][autoit][/autoit][autoit]

    $iIndex = _ArraySearch($avArray, $sSearch)
    If @error Then
    MsgBox(0, "Nicht gefunden", '"' & $sSearch & '" wurde in dem Array nicht gefunden.')
    Else
    MsgBox(0, "Gefunden", '"' & $sSearch & '" wurde in dem Array an Stelle ' & $iIndex & " gefunden.")
    EndIf

    [/autoit]

    Falls du mehr Hilfe benötigst stell wenigstens deine zu urchsuchende Textatei ein,

    mfg autoBert

  • Nunja jeder hat seine Stärken und schwächen. Außerdem funktioniert die Hilfedatei auf Ubuntu nicht -.- Muss mal das OS wechseln und dann schau ich nochmal. und danke für das Beispielscript ich schau es mir sofort an :D

    EDIT: Also damit ihr mal seht wie so eine HWID aussieht, dass hier ist die HWID meines Computers:

    0a994a2bb2ccac7c243b36e6eec43714

    Das ist eine HWID. Die wird übe einen MD5 Hash gemacht und ist jedes mal gleich, also wenn ich an meinen pc eine neue generiere kommt wieder diese raus. Von PC zu PC ist die verschieden, aber kein PC hat 2 HWID´s (esseidenn er besitzt eine VM [Virtuelle Maschiene wie VMWare]). Nunja jetzt müsst ihr euch vorstellen dass da nicht nur eine HWID drin steht sondern knapp 5-7. Hier mal in AutoIt Code (der nicht funktioniert, soll ja nur Bsp. sein) wie der Vorgang im Ganzen ablaufen soll:

    Die FUnc sind alle unwichtig, die heißen in echt nicht so. Dass heir soll nur der einfache Verarbeitungsvorgang sein. Das ist absoluten EVA - Prinzip (EIngabe - Verarbeitung, Ausgabe) ^^ Nunja wie ihr seht, mir fehlt die Funktion "_VergleicheHWIDs". Da brauch ich Hilfe :O

    mfg Gh0st

    Einmal editiert, zuletzt von Gh0st (27. Juli 2011 um 14:07)

  • Außerdem funktioniert die Hilfedatei auf Ubuntu nicht


    Ähm ja, aber der Browser und die deutsche Online Hilfe funktioniert ja wohl auch unter Linux. Davon ab... du verwendest eine Scriptsprache für Windows, dann solltest du doch wohl auch unter Windows programmieren und testen.


  • Ähm ja, aber der Browser und die deutsche Online Hilfe funktioniert ja wohl auch unter Linux. Davon ab... du verwendest eine Scriptsprache für Windows, dann solltest du doch wohl auch unter Windows programmieren und testen.


    Ja ich hab gerade Betriebssystem gewechselt (Windows 7 Home Premium). Les bitte den Post mal über deinen, da habe ich die Vorgangsweise meines "Checkers" erklärt. Vielleicht kannst du mir helfen ^^

  • Benutz bitte den Autoit Quellcode Tag -->

    Erster Fehler ist schonmal, dass dein Funktionskopf so nicht stimmt, denn du willst ja zum einen die aktuelle hwid als auch den pfad zur Textdatei übergeben, was ja schonmal gut durchdacht ist.
    Sollte also eher so ausschaun:

    [autoit]


    Func _VergleicheHWIDs($id,$path)
    ;...
    Endfunc

    [/autoit]

    So und wo dein Problem nun noch liegt weiss ich nicht. Die beiden relevanten Funktionen wurden dir ja genannt.

    1. Datei anhand des übergebenen Pfades mit _filereadtoarray einlesen. Zuvor muss ein Array in der Funktion deklariert werden in das der Dateiinhalt dann gespeichert wird.
    2. Das deklarierte und befüllte Array nach der übergebenen id mit _arraysearch durchsuchen und den Rückgabewert der Suche auswerten.
    3. Die Funktion je nach Rückgabewert der suche entweder mit return 1 bei einem Fund oder mit return -1 bei keinem Fund verlassen. Ggf. willst du noch weitere Rückgabewerte einbauen um Fehler auswerten zu können, wie zum Beispiel eine nicht existierende Datei...

    Feritg.

  • Ich verstehe! Also so:

    [autoit]


    #Include <File.au3>
    #Include <Array.au3>
    Func _VergleicheHWIDs($ID,$Path)
    Local $HWID = $ID ;ID Deklarieren
    Dim $aArray[6] ;Array anlegen
    _FileReadtoArray($Path,$aArray) ;Array aus dem File auslesen
    $Arraysearch = _ArraySreach($aArray,$HWID) ;Nach der HWID in dem Array "$aArray" suchen
    If $Arraysearch =1 Then ;wenn ein fund besteht
    MsgBox(0,"Check","Succesfully checked. You are registred") ;erfolg
    Else ;ansonsten
    MsgBox(0,"Check","Succesfully checked. You are not registred") ;fehlschlag
    Endif
    Endfunc

    [/autoit]

    So hier? Bin mir nicht sicher mit "Dim $aArray[6]" denn es kommen ja viele Freunde noch hinzu und da weiß ich nciht ob 5 Slots reichen. kann ich dass unbegrenzt hoch machen? Ja ich weiß, bin ein Array noob :D

  • Halo Ghost,

    wenn du schon die Hilfe nicht liest oder verstehst könntest du wenigstens dein Skript testen. Einfach mehr als 6 Eintrrägen in die Textdatei einfügen, starten => wundern.

    mfg autoBert

  • Die Größe des Arrays spielt keine Rolle, du müsstest es glaube ich nicht mal als solches deklarieren, es dürfte genügen einfach nur die Variable zu deklarieren. _filereadtoarray nutzt die Variable dann als Array und dimensioniert dieses abhängig vom Dateiinhalt.

    EDIT:

    [autoit]


    $Arraysearch = _ArraySreach($aArray,$HWID) ;Nach der HWID in dem Array "$aArray" suchen
    If $Arraysearch =1 Then ;wenn ein fund besteht

    [/autoit]

    Das ist btw. falsch. Zum einen natürlich den Funktionsnamen falsch geschrieben, zum anderen liefert Arraysearch beim Fund den Treffer Index im Array und nicht zwangsläufig eine 1. du musst hier also entweder prüfen ob der Rückgabewert >= 1 ist oder aber du prüfst in die andere Richtung, also ob nichts gefunden wurde, denn dann ist der Rückgabewert immer -1. Siehe dazu auch die Hilfe zur Funktion.

    2 Mal editiert, zuletzt von misterspeed (27. Juli 2011 um 15:07)

  • Ahh danke euch allen ^^ Es funktioniert perfekt. Er downlaodet die Datei und Prüft ob die HWID übereinstimmt. Danke euch allen für die perfekte Hilfe! Hier so sieht mein Script jetzt aus:

    [autoit]


    FileInstall("HWID.dll", @ScriptDir & "\HWID.dll")
    FileDelete(@ScriptDir & "\HWIDs.txt")
    Func _Check($HWID,$Path)
    Local $ID = $HWID ;ID Deklarieren
    Dim $aArray ;Array anlegen
    _FileReadtoArray($Path,$aArray) ;Array aus dem File auslesen
    $Arraysearch = _ArraySearch($aArray,$ID) ;Nach der HWID in dem Array "$aArray" suchen
    If $Arraysearch >= 1 Then ;wenn ein fund besteht
    MsgBox(0,"Check","You are allowed to use this programm!") ;fehlschlag
    Else ;ansonsten
    MsgBox(0,"Check","You are not allowed to use this programm!") ;fehlschlag
    Exit
    Endif
    Endfunc

    [/autoit][autoit][/autoit][autoit]

    Global $MyHWID = _GetHWID()

    [/autoit][autoit][/autoit][autoit]

    Func _GetHWID()
    $Result = DllCall(@ScriptDir & "\HWID.dll", "str", "GetHWID")
    If IsArray($Result) Then
    Return $Result[0]
    Else
    Return SetError(1, "", False)
    EndIf
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    _Check($MyHWID,@ScriptDir & "\HWIDs.txt")

    [/autoit]

    Danke nochmal! Wünsche euch allen noch einen schönen Tag! Das Thema kann geschlossen werden, die Frage ist perfekt beantwortet worden :D