Seite 3 von 3

Re: Der Trainer! 8)

Verfasst: 17.06.2007 20:25
von Thorium
msschulte hat geschrieben:Hier der Trainer! 8)

http://www.freenet-homepage.de/jilocasi ... rainer.rar

Dein Schutz ist wirklich nicht schlecht, aber nichts ist unknackbar.

Kurz Beschreibung zum Trainer:

1. Den Trainer bzw. die CheatMe01_byThorium.exe in ein Verzeichnis kopieren.
2. Nur die Trainer.exe starten (er läd die CheatMe01_byThorium.exe selbst).
3. Taste F1 erhöt die Punkte um 10.000; Taste F2 erhöt die Leben um 10.

Avira meckert u.a. - keine Sorge außer nen Trainer steckt weiter nichts drin.
Yea, cool :allright:
Klasse das ich doch noch einen funktionierenden Trainer für mein CheatMe sehen darf. Dann werde ich mich mal ans nächste CheatMe machen. :mrgreen:

Verfasst: 17.06.2007 22:21
von msschulte
An deinem Schutz war insbesondere die Kombination der wechselnden
Position und das damit verbundene Timing Problem interessant.

Mir ist dazu nicht viel mehr eingefallen als den Code zu manipulieren.

Wie wäre es wenn du zu dem Thema hier noch was postest?
Gibt sicher einige die gern mehr erfahren würden.

Über ein ein CheatMe 02 würde ich mich freuen,
ist ein netter Zeitvertreib für zwischendurch.

Ich denke mal nun kommt Antidebugging und Codeprotection hinzu?!

:D

Verfasst: 18.06.2007 06:54
von Thorium
Ok, da es jetzt einen Trainer gibt, gebe ich mal die interessanten Teile des Codes raus:

Code: Alles auswählen

Structure CriticalData
  Score.l
  Lifes.l
  Dead.b
  DeadDelay.l
EndStructure

Global *CritVars.CriticalData
Global ObscureKey.b
Global CriticalDataSize.l

Procedure CryptXor(sData.l, DataSize.l, Key.b)

  !mov ecx,[p.v_DataSize]
  !mov esi,[p.v_sData]
  !mov bl,[p.v_Key]
  
  !CryptLoop:
    !mov al,[esi]
    !xor al,bl
    !mov [esi],al
    !inc bl
    !inc esi
    !dec ecx
    !jecxz CryptLoopEnd
    !jmp CryptLoop
  !CryptLoopEnd:
  
EndProcedure

Procedure InitObscureCriticalData()
  Define Temp.l
  
  CriticalDataSize = SizeOf(CriticalData)
  Temp = AllocateMemory(Random($10000)+1)
  *CritVars = AllocateMemory(CriticalDataSize)
  FreeMemory(Temp)
  
  ObscureKey = Random(126+1)
  CryptXor(*CritVars,CriticalDataSize,ObscureKey)
EndProcedure

Procedure ReObscureCriticalData()
  Define.l TempData, NewMem,i
  Dim Temp.l(100)
  
  TempData = AllocateMemory(CriticalDataSize)
  CopyMemory(*CritVars,TempData,CriticalDataSize)
  For i = 0 To 100
    Temp(i) = AllocateMemory(Random($1000)+1)
  Next
  NewMem = AllocateMemory(CriticalDataSize)
  FreeMemory(*CritVars)
  *CritVars = NewMem
  CopyMemory(TempData,*CritVars,CriticalDataSize)
  FreeMemory(TempData)
  For i = 0 To 100
    FreeMemory(Temp(i))
  Next
  
  CryptXor(*CritVars,CriticalDataSize,ObscureKey)
  ObscureKey = Random(126+1)
  CryptXor(*CritVars,CriticalDataSize,ObscureKey)
EndProcedure
Und so wird das ganze benutzt:

Code: Alles auswählen

;/--------------\
;|Initialisieren|
;\--------------/

;initialisieren der Protection
InitObscureCriticalData()

;festlegen der Lifes zum Spielstart
CryptXor(*CritVars,CriticalDataSize,ObscureKey) ;erst entschlüsseln
*CritVars\Lifes = 3 ;dann Wert setzen
CryptXor(*CritVars,CriticalDataSize,ObscureKey) ;und wieder verschlüsseln
;kann man natürlich auch der Einfachheit halber in eine eigene Prozedur kapseln

;/---------------\
;|in der Gameloop|
;\---------------/

;erneutes Schützen der Daten, diese Prozedur generiert einen neuen
;Schlüssel für die Verschlüsslung, verschlüsselt damit die kritischen Daten
;neu und verschiebt sie zudem noch im Speicher
ReObscureCriticalData()

;dann bevor die Daten benötigt werden einfach komplett alle entschlüsseln
;natürlich möglichst am Anfang der Gameloop
CryptXor(*CritVars,CriticalDataSize,ObscureKey)

;und am Ende der Gameloop wieder verschlüsseln
CryptXor(*CritVars,CriticalDataSize,ObscureKey)
Das ganze ist im Prinzip sehr einfach, da lässt sich noch mehr draus machen aber als nächstes kommt in der tat Codeprotection drann. :mrgreen:

Verfasst: 18.06.2007 09:14
von msschulte
Infos zum Trainer:

Im Game Loop sind die Werte recht kurz unverschlüsselt.
Die Zeit reicht nicht aus um darauf zuzugreifen bzw. diese zu ändern.
Das würde unweigerlich zum Scheitern führen und nem Crash.

Meine erste Idee war den Schlüssel '0dh' auf Null
zu setzen (xor null) und 'inc ebx' zu nop'en.

Aber davon wäre auch der ganze Rest betroffen gewesen.
(z.B. die Strings sind damit ja auch verschlüsselt)

Die zweite Idee war dann den Call zur CryptoXor zu verhindern.
Ich hab also den Call gekillt und an der Stelle den Stack
wieder hergestellt. Also 'add esp, 0ch' und ein 'nop'.

Bin mir nicht sicher ob das die beste Lösung ist.

Um die korrekte PID zu erhalten mußte ich die EXE selbst starten.
Sagmal warum will die GetWindowThreadProcessId nicht? :freak:

Verfasst: 18.06.2007 14:24
von Thorium
msschulte hat geschrieben: Um die korrekte PID zu erhalten mußte ich die EXE selbst starten.
Sagmal warum will die GetWindowThreadProcessId nicht? :freak:
Öhm, daran bin ich nicht schuld. :?
Keine Ahnung, echt, hab sonst keine weiteren Schutzmaßnahmen eingebaut.

Verfasst: 19.06.2007 19:38
von msschulte
Stimmt, geht doch! Hatte es auf das falsche Fenster angesetzt (CheatMe01Test).