Variablen auf Änderungen überwachen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kirito
Beiträge: 11
Registriert: 23.01.2018 13:54

Re: Variablen auf Änderungen überwachen

Beitrag 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
~ Lately, there are days I can’t even remember the other world.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Variablen auf Änderungen überwachen

Beitrag von RSBasic »

@¯\_(ツ)_/¯
Wer weiß, vielleicht wird euer Wunsch irgendwann umgesetzt: https://www.purebasic.fr/english/viewto ... =3&t=70970
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Variablen auf Änderungen überwachen

Beitrag 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:
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Variablen auf Änderungen überwachen

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Variablen auf Änderungen überwachen

Beitrag von Mijikai »

Vielleicht geht es mit Breakpoints.
- VirtualProtect_() -> #PAGE_GUARD
- SetThreadContext_() -> #EXCEPTION_SINGLE_STEP
- bzw. Structured Exception Handling
Antworten