AutoIt - .ini verschlüsseln

12/19/2010 13:08 Nakroma2#1
Hallo,
Ich mache gerade ein Spiel und speicher die Settings in einer save.ini datei.
Meine Frage, damit man das Level nicht auf Hundert setzen kann oder so, wäre:
Wie kann ich die .ini in meiner Gamedatei verschlüsseln, aber so, das sie autoit auch noch erkennt?

Mfg
12/19/2010 13:17 lolerrr#2
da musst du dir einen Algorythmus ausdenken wie der etwas verschüsselt und wie wieder entschlüsselt den solltest du dir selber ausdenken damit niemand drauf kommt btw wenn du ein spiel mit Autoit machst solltest du dir was zum crypten holen z.B. Themida damit man es nicht einfach decompiled und so den Algorythmus raus kriegt bzw den quelltext Obfuscaten damit der nicht zu einfach gelesen wird! wenn du ihn nicht Cryptest

Alternativ kannst du die Highscores auch in der Registry sprichern da solltest du aber auch alles Obfuscaten bzw den Highscore verschlüsseln

/edit habe dir mal ein Beispiel Programm geschrieben(scheib mich mit deinem skype namen an wenn du einen hast um das zu kriegen!)
12/19/2010 20:28 Nakroma2#3
Hab leider kein Skype
12/19/2010 20:38 maxi39#4
es gibt auch ganz einfache möglichkeiten:
1. das lvl unteradrem namen abspeichern
2. die .ini im Temp ordner abspeichern
3. Die .ini einem andren namen geben und nicht save.ini
4. eine eigene Verschlüsselung schreiben z.b 1 ist A und 2 ist B
usw...
ansonsten schließe ich mich dem oberen an
12/19/2010 21:36 ZeraPain#5
_StringEncrypt()
12/20/2010 18:15 Nakroma2#6
Okey Danke
12/20/2010 19:35 lolerrr#7
_StringEncrypt() das ist ja toll einfach drcompilen und passwort auslesen deshalb ist eine verbindung aus beidem Methoden gut 1=a.... und _StringEncrypt() so habe ich es gemacht(kann ich dir wenn du willst schicken
1. das lvl unteradrem namen abspeichern tya einfach mal alles ändern ftw
2. die .ini im Temp ordner abspeichern-toll dann is sie i wann gelöscht
3. Die .ini einem andren namen geben und nicht save. ini-boah das ist klug aber wenn nur eine ini da ist warum nich die einfach öffnen?
12/20/2010 22:13 ZeraPain#8
Quote:
Originally Posted by lolerrr View Post
_StringEncrypt() das ist ja toll einfach drcompilen und passwort auslesen deshalb ist eine verbindung aus beidem Methoden gut 1=a.... und _StringEncrypt() so habe ich es gemacht(kann ich dir wenn du willst schicken
1. das lvl unteradrem namen abspeichern tya einfach mal alles ändern ftw
2. die .ini im Temp ordner abspeichern-toll dann is sie i wann gelöscht
3. Die .ini einem andren namen geben und nicht save. ini-boah das ist klug aber wenn nur eine ini da ist warum nich die einfach öffnen?
wenn du mit der logik dran gehst dann kannst du sowieso machen was du willst, weil wenn man es decompiled, dann ists egal was du anwendest. man kanns immer herausfinden.
12/20/2010 22:49 maxi39#9
das beste ist immer noch alles über einen server zu machen, wo das lvl und andere wichtige daten gespeichert sind
12/21/2010 08:23 -AmA-#10
Quote:
Originally Posted by maxi39 View Post
das beste ist immer noch alles über einen server zu machen, wo das lvl und andere wichtige daten gespeichert sind
ich bezweifle das jemand der noch keine Konfigurationsdatei verschlüsseln kann, einen Server skripten kann...

@Topic:
1. werte in ini abspeichern
2. Datei mit einer bereits vorhandenem Algorythmus verschlüsseln

beim auslesen einfach rückwärts... also entschlüsseln und danach werte lesen

Edit:
Hab im Forum gesucht:
Quote:
Code:
Func _XXTEA_Encrypt($Data, $Key)
    $Data = Binary($Data)
    Local $DataLen = BinaryLen($Data)
    If $DataLen = 0 Then
        Return ""
    ElseIf $DataLen < 8 Then
        $DataLen = 8
    EndIf

    Local $Opcode = '0x83EC14B83400000099538B5C2420558B6C242056578B7C9DFCF7FB89C683C606C74424180000000085F68D76FF0F8EEA000000896C24288D4BFF8D549D00894C2410895424148974242081442418B979379E8B4C2418C1E90281E103000000894C241C31F6397424107E568B5424288BCF8B6CB204C1E9058D14AD0000000033CA8BD58BC7C1EA03C1E00433D003CA8B5424188BDE81E303000000335C241C8B4424308B1C9833D533DF03D333CA8B542428010CB28B0CB2463974241089CF7FAA8B5424288BCF8B2AC1E9058D14AD0000000033CA8BD58BC7C1EA03C1E00433D003CA8B5424188BDE81E303000000335C241C8B4424308B1C9833D533DF03D3FF4C242033CA8B542414014AFC8B4AFC8B54242089CF420F8F2DFFFFFF5F31C05E5D5B83C414C21000'
    Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
    DllStructSetData($CodeBuffer, 1, $Opcode)

    Local $V = DllStructCreate("byte[" & Ceiling($DataLen / 4) * 4 & "]")
    DllStructSetData($V, 1, $Data)

    Local $K = DllStructCreate("byte[16]")
    DllStructSetData($K, 1, $Key)

    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
                                                    "ptr", DllStructGetPtr($V), _
                                                    "int", Ceiling($DataLen / 4), _
                                                    "ptr", DllStructGetPtr($K), _
                                                    "int", 0)

    Local $Ret = DllStructGetData($V, 1)
    $CodeBuffer = 0
    $V = 0
    $K = 0
    Return $Ret
EndFunc

Func _XXTEA_Decrypt($Data, $Key)
    $Data = Binary($Data)
    Local $DataLen = BinaryLen($Data)
    If $DataLen = 0 Then Return ""

    Local $Opcode = '0x83EC10B83400000099538B5C241C55568B742420578B3EF7FB69D0B979379E81C256DA4CB5895424180F84DD000000897424248D4BFF8D149E894C2410895424148B4C2418C1E90281E103000000894C241C8B742410837C2410007E528B5424248B6CB2FC8BCD8BD7C1E905C1E20233CA8BD78BC5C1EA03C1E00433D003CA8B5424188BDE81E3030000008B44242C33D7335C241C8B1C9833DD03D333CA8B542424290CB28B0CB24E89CF85F67FAE8B5424148B6AFC8BCD8BD7C1E905C1E20233CA8BD78BC5C1EA03C1E00433D003CA8B5424188BDE81E3030000008B44242C33D7335C241C8B1C9833DD03D333CA8B542424290A8B0A89CF814424184786C861837C2418000F8535FFFFFF5F31C05E5D5B83C410C21000'
    Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
    DllStructSetData($CodeBuffer, 1, $Opcode)

    Local $V = DllStructCreate("byte[" & Ceiling($DataLen / 4) * 4 & "]")
    DllStructSetData($V, 1, $Data)

    Local $K = DllStructCreate("byte[16]")
    DllStructSetData($K, 1, $Key)

    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
                                                    "ptr", DllStructGetPtr($V), _
                                                    "int", Ceiling($DataLen / 4), _
                                                    "ptr", DllStructGetPtr($K), _
                                                    "int", 0)

    Local $Ret = DllStructGetData($V, 1)
    $CodeBuffer = 0
    $V = 0
    $K = 0
    Return $Ret
EndFunc


Func _RC4($Data, $Key)
    Local $Opcode = "0xC81001006A006A005356578B551031C989C84989D7F2AE484829C88945F085C00F84DC000000B90001000088C82C0188840DEFFEFFFFE2F38365F4008365FC00817DFC000100007D478B45FC31D2F775F0920345100FB6008B4DFC0FB68C0DF0FEFFFF01C80345F425FF0000008945F48B75FC8A8435F0FEFFFF8B7DF486843DF0FEFFFF888435F0FEFFFFFF45FCEBB08D9DF0FEFFFF31FF89FA39550C76638B85ECFEFFFF4025FF0000008985ECFEFFFF89D80385ECFEFFFF0FB6000385E8FEFFFF25FF0000008985E8FEFFFF89DE03B5ECFEFFFF8A0689DF03BDE8FEFFFF860788060FB60E0FB60701C181E1FF0000008A840DF0FEFFFF8B750801D6300642EB985F5E5BC9C21000"
    Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
    DllStructSetData($CodeBuffer, 1, $Opcode)

    Local $Buffer = DllStructCreate("byte[" & BinaryLen($Data) & "]")
    DllStructSetData($Buffer, 1, $Data)

    DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
                                                    "ptr", DllStructGetPtr($Buffer), _
                                                    "int", BinaryLen($Data), _
                                                    "str", $Key, _
                                                    "int", 0)

    Local $Ret = DllStructGetData($Buffer, 1)
    $Buffer = 0
    $CodeBuffer = 0
    Return $Ret
EndFunc
Beispiel code:
Code:
$satz=Inputbox("","Gib den zu verschlüsselnden Satz ein")
$key=Inputbox("","Gib das passwort ein")
$encrypt=_XXTEA_Encrypt($satz, $key)
Msgbox(0,"test",$encrypt)
$decrypt=_XXTEA_Decrypt($encrypt, $key)
$decrypt=BinarytoString($decrypt)
Msgbox(0,"test",$decrypt)
ungetestet
Made by Shadow992
12/21/2010 13:27 MrSm!th#11
Quote:
da musst du dir einen Algorythmus ausdenken wie der etwas verschüsselt und wie wieder entschlüsselt den solltest du dir selber ausdenken damit niemand drauf kommt
blödsinn, er sollte einen bekannten wie AES nehmen.
ist doch schwachsinn, sich einen total schlechten und unsicheren selbst auszudenken; lass das mal lieber die profis machen.

Quote:
Quote:
_StringEncrypt() das ist ja toll einfach drcompilen und passwort auslesen deshalb ist eine verbindung aus beidem Methoden gut 1=a.... und _StringEncrypt() so habe ich es gemacht(kann ich dir wenn du willst schicken
1. das lvl unteradrem namen abspeichern tya einfach mal alles ändern ftw
2. die .ini im Temp ordner abspeichern-toll dann is sie i wann gelöscht
3. Die .ini einem andren namen geben und nicht save. ini-boah das ist klug aber wenn nur eine ini da ist warum nich die einfach öffnen?
nein, das ist totaler müll.
wenn man einfach decompilen kann um das passwort für StringEncrypt zu lesen, kann man es auch einfach für deine methode machen.

wie gesagt, nimm eine richtige verschlüsselung und speicher das passwort im internet ab.
autoit ist wegen der dekompilierfreude eine recht unsicherer sprache und deshalb nicht wirklich für verschlüsselungen geeignet, die das passwort im code enthalten.
wenn du es aus dem internet ausliest (am besten da auch verschlüsselt) machst du es den leuten ein bisschen schwerer, als wenn du es statisch im programm hast (selbst in anderen sprachen könnte man durch reverse engineering den key finden).

der algorithmus darf ruhig bekannt sein (alles andere ist auch blödsinn, schließlich kann man ihn ja leicht herausfinden), aber das passwort muss geheim gehalten werden.

mein tipp: wenn du spiele schreibst, ist autoit eh nicht die geeigneste sprache.

Quote:
das beste ist immer noch alles über einen server zu machen, wo das lvl und andere wichtige daten gespeichert sind
^this

Quote:
ich bezweifle das jemand der noch keine Konfigurationsdatei verschlüsseln kann, einen Server skripten kann...
bitte was???

das würde gerade mal ein bisschen php verlangen und wenn er autoit kann sollte eben php lernen auch kein problem sein.
holt er sich noch nen free webspace mit ftp und mysql und fertig.
12/21/2010 20:20 lolerrr#12
Quote:
der algorithmus darf ruhig bekannt sein (alles andere ist auch blödsinn, schließlich kann man ihn ja leicht herausfinden), aber das passwort muss geheim gehalten werden.
jo das ist das haupt problem da kann man auch string encrypt nehmen wenn man das Programm evrschlüsselt(crypted) mit Themida oder so (ja unacker und so) dann is das nicht so das Problem mit dem decompilen.....

Quote:

mein tipp: wenn du spiele schreibst, ist autoit eh nicht die geeigneste sprache.

Zitat:
das beste ist immer noch alles über einen server zu machen, wo das lvl und andere wichtige daten gespeichert sind
joa server is nich sooo toll wegen sql injection und so was wenn man das mit php macht und wenn man es decompiled könnte man auch so falsche high scores an den server schicken....

jo mach i was anderes wie c++ für dein spiel wird wohl am besten sein
12/22/2010 00:11 MrSm!th#13
wenn man vernünftig escapet ist das kein problem.
und mal ganz ernsthaft:

sql injection ist unwahrscheinlicher, als dass sich ein 0815 noob nen decompiler schnappt und das programm decompilet.
12/22/2010 09:53 Nakroma2#14
Ich kann einigermaßen php. Aber wie liest man den Server bitte aus?
12/22/2010 10:14 Loveskill#15
speicher doch alles auf einen free ftp server ab ...^^