Seite 2 von 2

Re: Variablen auf Änderungen überwachen

Verfasst: 13.03.2018 14:46
von Kirito
Ich schließe mich natürlich allen Vorrednern an, aber um trotzdem mal eine "Lösung" festzuhalten - hier ein schnelles Snippet:

Code: Alles auswählen

Enumeration 
  #Change_NotFound
  #Change_False
  #Change_True
EndEnumeration

Global NewMap Vars.l()
Global NewMap Keys.s()

Procedure _checkChange(*Var, reset=0)
  If Not *Var Or Not FindMapElement(Vars(),Str(*Var)) Or Not FindMapElement(Keys(),Str(*Var))
    ProcedureReturn #Change_NotFound
  EndIf 
  
  cache = PeekL(*Var)
  UseMD5Fingerprint()
  
  If cache <> Vars(Str(*Var)) Or Keys(Str(*Var)) <> StringFingerprint(Str(cache), #PB_Cipher_MD5)
    If reset = 1
      PokeL(*Var, Vars(Str(*Var)))
    EndIf 
    ProcedureReturn #Change_True
  EndIf 
  
  ProcedureReturn #Change_False
EndProcedure 

Procedure _makeChange(*Var, Value)
  If Not *Var : ProcedureReturn #Change_NotFound : EndIf 
  
  PokeL(*Var, Value)
  UseMD5Fingerprint()
  Vars(Str(*Var)) = Value
  Keys(Str(*Var)) = StringFingerprint(Str(Value), #PB_Cipher_MD5)
  
  ProcedureReturn #Change_True
EndProcedure 


OpenConsole("Now let's have some fun!")

Define x.l

PrintN("0 = Not Found")
PrintN("1 = Var has not changed")
PrintN("2 = Var has changed!")
PrintN("")


Print("Set x = 20 --- Returned ") : PrintN(Str(_makeChange(@x, 20)))
Print("Has x changed? Returned ") : PrintN(Str(_checkChange(@x)))
PrintN("")

x = 30 ;Let's asume this is by access from outside
PrintN("[Var got changed to 30]")
Print("Has x changed? Returned ")   : PrintN(Str(_checkChange(@x,1)))
PrintN("[Used auto-reset as Param]") 
Print("Has x changed? Returned ")   : PrintN(Str(_checkChange(@x)))
PrintN("X = "+Str(x))
PrintN("")

PrintN("==============================")
Input()
An sich funktioniert es, allerdings hat es mehrere Defizite.
1) die Abgleich-Vars sind in einer globalen Liste.
2) ein echter Hacker kann es trotzdem umgehen
3) Die Performance ist Müll ... (du wirst nicht nur eine Variable haben)
4) Dein Hauptaugenmerk sollte erstmal darauf liegen alle Funktionen fertig zu haben.

Mfg,
Kirito

Re: Variablen auf Änderungen überwachen

Verfasst: 04.07.2018 16:31
von RSBasic
@¯\_(ツ)_/¯
Wer weiß, vielleicht wird euer Wunsch irgendwann umgesetzt: https://www.purebasic.fr/english/viewto ... =3&t=70970

Re: Variablen auf Änderungen überwachen

Verfasst: 07.07.2018 22:10
von DarkSoul
In der objektorientierten Programmierung ist das mit einer privaten Membervariable und einem Setter leicht erledigt. Purebasic ist aber imperativ und besitzt soetwas nicht. Dir bleibt nur SetXYZ().

Lässt sich trotzdem alles umschiffen. Der Cracker ruft dann halt einfach SetXYZ() auf, um den Variablen die gewünschten Werte zuzuweisen. So ein Setter ist eher dazu da, Programmierfehler zu vermeiden und dass durch Bugs und Fehlbedienungen keine ungültigen Werte in den Variablen landen, die zu Fehlfunktionen führen.

Selbst, wenn die Lizenzprüfprozedur noch so stark gegen Manipulation abgesichert wird - Dann wird sie notfalls mit einem einzigen GoTo() komplett überbrückt bzw. dein Überwachungsevent einfach deaktiviert. Das geht notfalls auch durch Patchen der Programmdatei mittels Hex-Editor. Wer cracken will, der findet die entsprechenden Bytes, die verändert werden müssen.

Du könntest beim Start alle ausführbaren Programmteile auf Manipulationen überprüfen. Aber auch das kann der Cracker leicht außer Gefecht setzen.

Das einzige, was halbwegs klappt, wäre, dass das Spiel von einem Onlineserver abhängig ist, ohne den nicht sinnvoll gespielt werden kann. Dann verkaufst du lediglich den Spielaccount und stellst die eigentliche Clientsoftware von vorneherein gratis bereit (so wie bei Minecraft). Dann bringt Cracken nicht viel... :mrgreen: Wer hier die Gebühren einsparen will, muss sich halt mit inoffiziellen Servern zufriedengeben, wodurch der Spielspaß gemindert wird. Wer auf dem "großen" Server spielen will, muss halt blechen.... :lol:

Re: Variablen auf Änderungen überwachen

Verfasst: 08.07.2018 09:49
von RSBasic
Bei einem Setter geht es nicht immer darum, dass es sicher vor Manipulation sein soll. Es gibt auch andere Anwendungsfälle.
Wie bei C# gibt es auch bei der SQL-Datenbank die Möglichkeit, Trigger zu erstellen, um bestimmte Vorgänge zu automatisieren, wenn beispielsweise eine Zelle eines Datensatzes geändert wurde.

Re: Variablen auf Änderungen überwachen

Verfasst: 08.07.2018 10:04
von Mijikai
Vielleicht geht es mit Breakpoints.
- VirtualProtect_() -> #PAGE_GUARD
- SetThreadContext_() -> #EXCEPTION_SINGLE_STEP
- bzw. Structured Exception Handling