Konstante Variablen veränderbar?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

code van damme

Betreff: Konstante Variablen veränderbar?

BeitragMi, Dez 15, 2010 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Kann man Konstante-Variablen (Const) mit absoluter Sicherheit nicht verändern?

Dass das Programm an sich es nicht kann, ist klar. Aber wie sieht es mit externen Programmen aus, die die Werte im Arbeitsspeicher verändern können?

Brauche das nämlich für ein Online-Spiel, bei dem potenzielle Cheater nicht ihre Spieler-ID verändern dürfen.

Freue mich auf jede Antwort!

MfG
c-v-d

Firstdeathmaker

BeitragMi, Dez 15, 2010 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
konstante sind nur vom Programcode selbst her nicht änderbar. Im binary der exe können sie jedoch durchaus geändert werden. An welche Art von Cheatschutz hast du denn gedacht? Und wolltest du jedem Spieler eine eigens für ihn kompilierte Exe zukommen lassen? Das wäre viel zu aufwendig.

Cheatersicherheit erreichst du nur dadurch, dass ALLE cheatrelevanten Aktionen auf dem Server passieren. Sprich Punkteberechnung, Trefferwertung etc. Das Client-Program sollte nur für in/output zuständig sein.

Üblich ist z.B. auch, Punktestände, Geld etc. nur mit Offsets zu speichern. D.h. du hast eine Variable points:int in der die Punkte gespeichert werden und eine Variable points_offset:int in der du zu Anfang ein variables Offset speichers.

Wenn du die Punkte setzen möchtest, schreibst du points = neuerWert + points_offset
Wenn du die Punkte (z.B. zum auf dem Bildschirm anzeigen) auslesen möchtest, schreibst du: points - points_offset

Dadurch kann man mit den weit verbreiteten Cheat-Tools nix mehr anfangen, weil der Wert nicht so im Arbeitsspeicher vorkommt. Ist aber wie gesagt nur bedingt sicher, besser ist es, das auf dem Server berechnen zu lassen.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

code van damme

BeitragMi, Dez 15, 2010 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Alle wichtigen Aktionen passieren ja auch auf den Server. Dieser sendet dann seine Daten an alle Clienten.

Das Problem ist aber, dass ich gerade ein Online-Kartenspiel mittels GNet programmiere. Der Server sendet also alle Spielkarten (auch die der Mitspieler) an alle Klienten.

Das Client-Programm soll dann überprüfen, ob die empfangene Karte, der eigenen Spieler-ID dazugehört. Wenn ja, wird die Karte aufgedeckt. Wenn nein, gehört diese karte einem Mitspieler und wird verdeckt.

Das Senden der Karten geschieht mittels verschlüsselten Code.

Da man wie du sagtest die Konstanten Variablen verändern kann, werde ich wohl auch die Spieler-ID verschlüsselt übertragen...

Danke für die Antwort!

Ana

BeitragMi, Dez 15, 2010 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin in dem Thema nicht so drin, aber als außenstehende erscheint es mir so als wäre es einfacher und sicher, wenn der client für alle eignen karten eine anfrage sendet, und dann nur diese zurück bekommt?

Bestimmt hast du das schon bedacht und einen guten grund es so zu machen, würde mich aber interessieren warum das nicht geht
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

code van damme

BeitragMi, Dez 15, 2010 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
GNet kann soweit ich weiß nicht Daten an einen bestimmten Klienten senden.

GNet erstellt "Globale" Objekte auf die jeder zugreifen kann.

So habe ich es zumindest verstanden und darauf dann meinen Code aufgebaut.

Firstdeathmaker

BeitragMi, Dez 15, 2010 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann ist das Konzept sowieso unsicher. Also die Clienten sollten wirklich nur die Karten zugesendet bekommen, die sie auch wirklich sehen können. Sonst gibt es zig verschiedene Varianten wie man cheaten kann.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

ToeB

BeitragMi, Dez 15, 2010 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn man bei GNet nicht an bestimmte personen senden kann, dann schik doch einfach in der nachricht mit an wen die Daten gehen ? Also SpielerID+"Karte1:PikAss/Karte2:KreuzNeun" etc...

und dann nur die Karten die aufgedekt werden für alle vom server dann senden !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

code van damme

BeitragMi, Dez 15, 2010 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
So hatte ich es auch vor, nur man kann soweit ich weiß auch eingehende Daten von GNet mit externen Programm abfangen und anzeigen lassen. So sieht man auch was andere Spieler-IDs für Karten haben.

Irgendwie komme ich mit GNet auf keinen grünen Zweig...

Vielleicht sollte ich doch lieber die BnetEx Mod von Vertex nehmen...

Schade, GNet finde ich genial einfach. Confused

das wurgel

BeitragMi, Dez 15, 2010 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest die vom Server zur verfügung gestellten Daten auch verschlüsseln. Das würde es zwar nicht unmöglich, aber deutlich schwieriger machen.
1 ist ungefähr 3
 

code van damme

BeitragMi, Dez 15, 2010 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja so war ja auch der Plan.

Bin gerade noch am hin- und herüberlegen ob ich den Code neu schreiben soll auf BNetEx-Basis oder mit GNet weiterarbeite und die Daten verschlüssel.

Kleine Nebenfrage: Ist BNetEx bugfrei? Also funktioniert alles einwandfrei auf Windows, MacOS und Linux?

Thunder

BeitragMi, Dez 15, 2010 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Konstanten könnten verändert werden, weil ihr Wert im Arbeitsspeicher liegt. BlitzMax selber wird das nicht zulassen und auch aus eingebundenen Assembler- und C-Dateien heraus ist das schwer.
Durch Reverseengineering kann man die ausführbare Datei so patchen, dass andere Werte verwendet werden. Das ist aber sehr aufwendig.

Ich würde dir empfehlen BNetEx zu nehmen und dem Client nur das zu senden, was er auch wirklich sehen soll (zudem ist das eine Entlastung für den Client und die Verbindung Server-Client).

mfg Thunder

Edit: Mit dem ersten Absatz hab ich im Grunde das gemeint, was Noobody sehr ausführlich und schön beschrieben hat...
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am Mi, Dez 15, 2010 22:39, insgesamt einmal bearbeitet

Noobody

BeitragMi, Dez 15, 2010 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Konstanten funktionieren ein wenig anders als "nicht veränderbare Variablen". Ihr Wert wird bei der Kompilation berechnet und alle Stellen, wo die Konstante vorkommt, werden durch den errechneten Wert direkt ersetzt. Danach werden konstante Ausdrücke noch vereinfacht. Hat man z.B. "1.0/( KONSTANTE^25 ), so kann das Ergebnis nach dem Ersetzen der Konstante direkt ausgerechnet werden.

Am Ende hat man also nicht einfach eine Variable im Arbeitsspeicher, deren Wert man verändern kann, sondern man müsste alle Stellen in der Exe, in der sie auftritt, aufspüren und abändern. Falls die Konstante in einem bereits zur Kompilierzeit errechneten Ausdruck drin war, ist es ziemlich unmöglich, die Stelle nachher in der Exe noch zu finden und entsprechend abzuändern.

Du fährst mit Konstanten also relativ sicher; viel problematischer ist es aber, dass du alle Karten an alle Spieler versendest. Ich habe GNet nie verwendet, aber selber etwas mit BNetEx zu basteln halte ich für sicherer. BNetEx ist, soweit ich mich erinnere, relativ bugfrei.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

code van damme

BeitragMi, Dez 15, 2010 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hört sich doch schon viel besser an...

Demnach wäre das doch eine relativ sichere Variante:

1. Client erstellt bei Programmstart eine zufällige Spieler-ID und speichert sie als Konstante ab

2. Server sendet alle Karten in verschlüsselter Form an alle Clienten mit der jeweiligen Information, welche Karte zu welcher Spieler-ID gehört.

3. Die Clienten überprüfen nun, ob die Karten zu der eigenen Spieler-ID gehören. Wenn ja, Werden die Karten entschlüsselt und der Client bekommt nur seine Karten angezeigt.


- Cheater können somit nicht die eigene Spieler-ID verändern (um z.B. andere Spieler-IDs anzunehmen, um deren Karten zu sehen)
- Cheater müssen lediglich die Karten entschlüsseln (was ich für schwierig halte, da jede Karte einen eigenen Code hat, z.B. 5379569 und dieser nochmals mit einem geheimen Schlüssel Xor-verschlüsselt wird). Und selbst dann wissen die nicht genau, welche Karte zu welchem Spieler gehört.


Was meint ihr? Wäre das ne akzeptable Lösung, oder sollte ich doch auf BNetEx umstellen?

ToeB

BeitragMi, Dez 15, 2010 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub du hast es nicht ganz verstanden, eine Konstante wird BEIM KOMPILLIEREN in dem Programm festgesetzt, das heißt JEDES Programm würde die SELBE ID besitzen !

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

code van damme

BeitragMi, Dez 15, 2010 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso.

Gut, dann muss die Spieler-ID entweder verschlüsselt übertragen werden, oder BNetEX. Tendiere eher zu zweitem...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group