SaveGame Editor mit Autoit erstellen? (Hex-Editor) (KEIN BOT ODER HACK!)

  • hi leute.

    ich würde gerne nen savegameeditor bauen... leider hab ich kein plan wie ich anfangen soll... hat jemand ne idee?

    im prinziep hab ichs mir so vorgestellt das dass savegame am anfang eingelesen wird... nur leider weiss ich dann schon nich mehr weiter. wie kann ich ne datei in hex so einlesen das ich bestimmte offstets auslesen/editieren kann und nicht die zeilen?

    hoffe ihr könnt mir da ein paar tipps geben oder vielleicht gibts ja schon sowas ähnliches :)

    greez vom gunny

  • Naja das könnte schwer werden zumindest für einen Anfänger.
    Meine Savegames hier sind so aufgebaut, das sie sich mit dem Editor öffnen lassen also kannst du die Wert so per FileRead bekommen.
    Dann musst du deinem Programm eben sagen welchen Wert du für was haben willst.

    Am besten ein GUI:

    Gold: <Testwert>

    Dann ein Button:
    Ändern!


    Dann gibst du dem Button die Funktion.
    StringReplace.


    Dann füllst du den Stringreplace mit den Informationen die du gesammelt hast.
    Zum Beispiel steht in einem Savegame von mir:
    GOLDVALUE = x4356
    Dabei ist x nur so da und 4356 ist der Wert des Goldes.
    Somit soll String Replace dann das daraus machen:
    GOLDVALUE =x<Dein Wert Replaced also ersetzt>

    Möchte dir jetzt nicht alles verraten.
    Nur mal so als tipp =P

  • hi. :)

    danke für deine antwort :)

    ich mein aba savegames von zb anno oder g-police... die kann man nur in hex verändern... also wie son patcher eben... weiste was ich meine?

    das ist jetzt ma nen auszug aus nem stonekeep savegame... insgesammt ises 64kb... das ist jetzt nur der anfang... was ich jetzt will ist zb bei offset 235A den wert 11 auf FF setzen...

    Spoiler anzeigen

    02 00 31 2e 33 00 00 1a 00 1d 00 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c

    Einmal editiert, zuletzt von sir-gunny (28. Mai 2009 um 13:31)

  • Spoiler anzeigen

    02 00 31 2e 33 00 00 1a 00 1d 00 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c 9c 9c 00 00 00 00 00 00 9c ff 9c ff 9c ff 9c ff 0e 00 0f 9c 9c

    also wenn die Struktur immer gleich bleibt, dann könnte man mit den String-Funktionen arbeiten, also StringSplit, StringReplace etc.

    also Wert einlesen, in Hex übersetzen, an der passenden Stelle Einfügen, Datei speichern

    vielleicht so?!?

  • hi... habs jetzt einiger maßen hinbekommen... hab jetzt aba ein problem und zwar wenn die die funktion im lese und schreibmodus nacheinander aufrufe wird im schreibemodus nix zurück gegeben... warum? wenn ich den schreibe modus alleine aufrufe gehts komischerweise...

    Spoiler anzeigen
    [autoit]

    $PD_SaveGame = FileOpen ( @ScriptDir & "\test.sav", 16 )
    If $PD_SaveGame = -1 Then
    MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")
    Exit
    EndIf

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

    ;Schriebt oder liest werte aus einer zuvor geöffneten Datei
    ;Modus : 0 = lesen, 1 = schreiben
    ;Datei : Das Dateihandle weches von FileOpen zurückgegeben wird [muss binär einegelesen werden FileOpen (@ScriptDir & "\test.sav", 16 )]
    ;Offset : Das Offset in der Datei welces ausgelesen oder beschrieben werden soll
    ;Wert : Beim auslesen die Länge in Byt des Wertes, Beim schreiben der zu schreibende Wert in Hex

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

    Func _PatchDatei($PD_Modus = "", $PD_Datei = "", $PD_Offset = "", $PD_Wert = "")
    Local $PD_LeseDatei = "", $PD_WertLesen = "", $PD_WertSchreiben = ""
    $PD_LeseDatei = FileRead ($PD_Datei)
    Switch $PD_Modus
    Case 0
    ;~ $PD_LeseDatei = FileRead ($PD_Datei)
    $PD_WertLesen = BinaryMid($PD_LeseDatei,DEC($PD_Offset)+1,$PD_Wert)
    Return $PD_WertLesen
    Case 1
    ;~ $PD_LeseDatei = FileRead ($PD_Datei)
    ;~ $PD_Offset = (Dec($PD_Offset) * 2) + 3
    $PD_WertSchreiben = StringReplace($PD_LeseDatei,(Dec($PD_Offset)*2)+3, $PD_Wert)
    MsgBox(0,"2",$PD_WertSchreiben)
    Return $PD_WertSchreiben
    EndSwitch
    EndFunc

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

    $Lesen = _PatchDatei(0,$PD_SaveGame,0,1)
    MsgBox(0,"1",$Lesen)
    $Schreiben = _PatchDatei(1,$PD_SaveGame,0,"FF")
    MsgBox(0,"3",$Schreiben)
    FileClose($PD_SaveGame)

    [/autoit]
  • versuchs doch mal mit einem sauberen File-Open und File-Close nach jedem Zugriff ..........

    siehe Hilfe :

    Bemerkungen
    Eine Datei kann nur entweder im Lese- oder im Schreibmodus geöffnet sein - sie kann nicht in beiden geöffnet sein.
    Manche Dateiattribute können ein öffnen einer Datei unmöglich machen.
    Wenn eine Datei im Schreibmodus geöffnet wird, wird die Datei erstellt falls sie nicht existiert.
    Wenn die Bearbeitung der Datei abgeschlossen ist, sollte die Funktion FileClose aufgerufen werden um die Datei zu schließen.

  • danke :) habs jetzt umgeschrieben und funktioniert so wie ich es will... jetzt die frage... wenn ich das so auf dateien anwende die so 1-2 MB groß sind, wird dann der rechner dolle verlangsamt oder ist die ladezeit zu lang?

    Spoiler anzeigen
    [autoit]

    #include <String.au3>

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

    Func _PatchDatei($PD_Modus = "", $PD_DateiPfad = "", $PD_Offset = "", $PD_Wert = "", $PD_WertLaenge = "")
    Local $PD_Datei, $PD_LeseDatei, $PD_WertLesen, $PD_WertSchreiben, $PD_DateiSchreiben
    $PD_Datei = FileOpen ($PD_DateiPfad, 16 )
    If $PD_Datei = -1 Then
    MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")
    Exit
    EndIf
    $PD_LeseDatei = FileRead ($PD_Datei)
    FileClose($PD_DateiPfad)
    Switch $PD_Modus
    Case 0
    $PD_WertLesen = BinaryMid($PD_LeseDatei,DEC($PD_Offset)+1,$PD_Wert)
    Return $PD_WertLesen
    Case 1
    $PD_Datei = FileOpen ($PD_DateiPfad, 10 )
    $PD_WertSchreiben = StringReplace($PD_LeseDatei,(Dec($PD_Offset)*2)+3, Hex($PD_Wert, $PD_WertLaenge*2))
    ;~ Return $PD_WertSchreiben
    $PD_DateiSchreiben = FileWrite ($PD_DateiPfad, Binary($PD_WertSchreiben) )
    If $PD_DateiSchreiben = 0 Then
    MsgBox(0, "Fehler", "Die Datei konnte nicht beschrieben werden.")
    Exit
    EndIf
    FileClose($PD_DateiPfad)
    EndSwitch
    EndFunc

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

    $PD_SaveGame = @ScriptDir & "\test.sav"

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

    $Lesen = _PatchDatei(0,$PD_SaveGame,0,1)
    MsgBox(0,"1",$Lesen)
    $Schreiben = _PatchDatei(1,$PD_SaveGame,0,256,2)
    MsgBox(0,"3",$Schreiben)

    [/autoit]
  • Hallo

    einfach testen (Sicherheitbackup vorher nicht vergessen) und du hast die Antwort,

    mfg (Auto)Bert