CheatMe 01

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Der Trainer! 8)

Beitrag 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:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
msschulte

Beitrag 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
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag 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:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
msschulte

Beitrag 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:
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
msschulte

Beitrag von msschulte »

Stimmt, geht doch! Hatte es auf das falsche Fenster angesetzt (CheatMe01Test).
Antworten