Anti Cheat APIs
-
@Code-Walker:
jeden Keystroke zum Server schicken klingt fuer mich nach Wahnsinns-Overkill, damit waere Spielen in Echtzeit ja gar nicht moeglich?
-
Blue-Tiger schrieb:
jeden Keystroke zum Server schicken klingt fuer mich nach Wahnsinns-Overkill, damit waere Spielen in Echtzeit ja gar nicht moeglich?
So wird's aber im Prinzip gemacht.
Dein Client berechnet für sich auch schonmal die Auswirkungen deiner Eingaben. Er wartet also nicht, bis der Server ihm im nächsten Update seine neue Position etc. schickt. Wenn die vom Server empfangenen Daten zu weit von den eigenen abweichen, muss korrigiert werden (z.B. Server hat eine Kollision festgestellt, dein Client aber nicht und läuft fröhlich weiter).
Hier ein guter Artikel dazu: http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Wurde hier irgendwo schonmal gepostet.
-
100% sicherheit wird es niemals geben!
Hab ich ja schon gesagt, nur hängt es ncht davon ab ob sie sich ZU WEIT abweichen sondern sie müssen exakt genau stimmen, und diese überprüfung ist auch sinnlos, da es dem cheater ja nix bringt wenn er sich auf dem clienten schnller bewegt, dnn auf dem server bleibt er langsam!
-
Code-Walker, wir reden aneinander vorbei!
Meine Aussage bezog sich gar nicht auf Cheating. Und die Korrektur ist Client-seitig.
Die Daten können nicht immer exakt stimmen, da immer was dazwischen kommen kann, was der Client nicht voraussehen konnte bzw. in diesem Moment anders sah.
Und du musst lokal die Eingaben direkt verarbeiten, denn wenn du wartest, bis vom Server das nächste Update kommt, kannst du das Spiel total vergessen, weil alle Bewegungen mit etlicher Verzögerung stattfinden.
-
Und du musst lokal die Eingaben direkt verarbeiten, denn wenn du wartest, bis vom Server das nächste Update kommt, kannst du das Spiel total vergessen, weil alle Bewegungen mit etlicher Verzögerung stattfinden.
Das sag ih doch die ganze zeit xD
-
Ich habe das geschrieben, weil Blue-Tiger meinte, das würde anders gemacht! s.o.
-
Achso, naja, es gibt spiele wo das anders gemacht wird, lotr online zum beispiel, da hast du immer nen 1 sek delay ..., aber die sind ja auch dumm^^
-
@Code-Walker
Die Dinge die du hier beschreibst sind Kinderkram und leicht zu beheben. Einen Server zu basteln der nicht zu hacken ist ist relativ easy, man muss nur etwas aufpassen und wissen was man tut.Ein Teil der zugegebenermassen nicht ganz trivial ist, ist Input bereits Clientseitig auszuwerten, und die Daten am Server dann zu prüfen im Sinne von "kann das stimmen". Der Grund ist hier hauptsächlich dass man dem Server hier oft mehr Arbeit aufhalst als einem lieb ist, schliesslich muss der Server das dann für jeden Spieler machen, und bei wirklich vielen Spielern kostet das dann wirklich viel Rechenzeit. Dinge wie Kollisionserkennung etc. (z.B. damit Spieler sich nicht durch Wände durchschummeln können) sind halt aufwändig in der Berechnung.
---
Nur damit du verstehst was ich meine, und warum ich die Grafikkarten-Treiber angesprochen habe: du kennst doch sicher irgendeinen online Shooter, ja?
Nun, wie wäre es für dich als Spieler wenn du durch Wände durchsehen könntest? Doch sicher sehr hilfreich, ja? Geht jetzt ein Licht auf?Oder, wenn du das Protokoll schonmal gehackt hast (was wenn das Spiel vernünftig programmiert ist schonmal garnicht so einfach ist), dann brauchst du nur Daten "mitschneiden", und ein kleines Programm schreiben welches dir eine schöne Map anzeigt (auf einem 2. Monitor vielleicht), wo alle relevanten Objekte drauf sind, wie z.B. andere Spieler die sich gerade von hinten anschleichen wollen oder was auch immer.
Diese Dinge kannst du nicht Serverseitig beheben, d.h. du brauchst irgendetwas was dir halbwegs gut versichert dass auf den Client-PCs nix entsprechendes läuft. So ein Programm ist aber auch nur dann was wert, wenn man die Netzwerkkommunikation mit eben diesem Programm nicht einfach faken kann, sonst schreibt der Cheater sich ein eigenes Programm welches einfach nur immer "alles OK" meldet, und kann wieder lustig drauf los cheaten.
-
@hustbear:
Zwei mal nicht Koreckt! Durch das Wände durchschauen kann man sehr licht verhindern, genauso wie einen Maphack. Man sendet einfach nur das zu was der Spieler auch wirklich sieht! man denkt jetzt für jeden Spieler auf dem Server den sichtbereich aus zu rechnen währe sehr permormance lastig, it es aber nicht. Dabei ist ersteinmal eines wichtig:
Ist es wichtig das der Game-Server möglichst klein ist? Nein!
Man kann einen Gameserver Programmieren der ruhig 30GB groß ist, aber dafür auch sehr schnell läuft. Zur berechnung kann man das ganz einfach machen, man schreibt einfach so etwas wie einen Converter und ein eignes klines Filformat! Der Converter testet für jede Position, oder in Quadraten, was sichtbar ist, und alles was an dieser Position/Bereich sichtbar it, wird eingetragen. Der Server muss dann für den sichtbereich nichts mehr rechnen, er läd einmal die datei für die map, oder greift am besten noch auf MySQL zu, weil Der Server dabei keine 3 GB Datei laden muss, sondern einzelnd zugreifen kann, was wesentlich schneller ist. Er schaut, was er an dieser stelle sehen kann, und sendet ihn dann auch nur das was er sieht. Wenn nun in Spieler hinter der Wand ist, wird er nicht gesehen und ird auch garnicht gesendet! Kolisionserkennung, Naja, Kolisionserkennung mit der Wand muss nicht wirklich permormance lastig sein, ganz ehrlich! Und mit anderen Modellen/Spilfiguren auch nicht! Und man kann Theretisch alles Serverseitig beheben, außer eventuell Bots, aber darübr habe ich mir noch keine gedanken gemacht!
Die Dinge die du hier beschreibst sind Kinderkram und leicht zu beheben.
Ich weiß das es Kinderkram ist, er wollte ein Beispiel haben, um zu vertsehen ie das funktioniert, und ich habe es ihm gegeben. Mit der Website hab ich gemacht um ihn mal zu erläutern das man nicht nur auf Cheater sondern auch auf hacker achten sollte, und ein Server ist nun wirklich leicht zu hacken u nd nur der klinste fehler ermöglicht es!
#########################
Ich wollte noch sagen: Viele gehen davon aus was andere machen, wie andere sich vor Cheatern schützen, wie andere die Grafik, das terrain etc machen... Man ollte eigenes ausdenken, wenn man eigene sachen ausdenkt, it es dem Cheater wieder schwerer zu cheaten, da diese vorgehensweise wie du das Spiel, oder abchnit des spiels programmiert hast noch nicht bekannt ist!
-
@Code-Walker:
zweimal sehrwohl korrekt. Es gibt Gründe warum man gewisse Daten an den Spieler senden MUSS.Wenn der Client ein leises Geräusch spielen will wenn hinter mir jmd. rumläuft, dann muss er wissen dass hinter mir jmd. rumläuft. Natürlich könntest du sagen egal, soll halt der Server bloss schicken "spiel Sound 42 mit Lautstärke 3 und Vektor soundso". Gut, dann kann ich mir aber wieder genau diese Daten visualisieren lassen - alleine der Vektor kann mir schon viel mehr bringen als das Geräusch, welches ich trotz tollem 3D Sound halt nicht SO gut zuordnen kann.
Was den Sichtbarkeits-Test angeht: das möchte ich erstmal sehen. Wenn man sich alles recht einfach macht, bloss indoor, ne shöne Portal-Engine, ja, dann ginge vielleicht noch einiges. Aber sobald es outdoor ist wird das occlusion-culling schonmal sehr aufwändig. (EDIT: vor allem wenn bewegte Objekte dazukommen wo man nixmehr "vorrechnen" kann /EDIT) Oder was ist mit irgendwelchen reflektierenden Gegenständen? Willst du für die auch Serverseitig berechnen was nötig ist um die Reflektion korrekt darstellen zu können? Also ob Spieler X der gerade hinter mir steht in der Reflektion auf Objekt Y (welches ich sehen kann) gerade sichtbar ist?
Oder was ist mit Stellen wo man vielleicht wirklich ein paar Pixel eines Gegners durch irgendwelche Gräser/Bäume/Spalten in Türen/ganz was anderes durchscheinen sieht? Dann *muss* die Position des Gegners am Client bekannt sein, und dieser wird wohl nicht drum herumkommen das Problem mit der Sichtbarkeit einfach so zu lösen indem er den ganzen Gegner einfach rendert, und den Rest der Grafikkarte und deren Z-Buffer überlässt. Und dann bringen diverse Tricks die man mit dem Grafikkarten-Treiber, der D3D DLL oder sonstwas hinbasteln kann auf einmal recht viel.
Nochmal was die Sichtbarkeit angeht: wie fändest du es wenn du ne schnelle Drehung machst, und dann erst vielleicht 100-200ms später ein Gegner irgendwo "aufpoppt" weil der Client einfach vorher noch nicht wusste dass es den überhaupt gibt? Hm. Nicht so toll wenn du mich fragst. Also musst du auch hier Objekte an den Client senden die er noch nicht sehen kann, damit das bei schnellen Bewegungen/Drehungen so aussieht wie es aussehen sollte.
Alles in allem denke ich du stellst dir das recht einfach vor. Zu einfach.
-
Wie gesagt, damit habe ich mich noch nicht richtig beschäftigt, bei einem Spiel mit mega Grafik, reflektionen etc kann das ganze komplizierter werden. Dan noch, wenn jemand läuft, ist es schön wenn man dazu Sound einbindet, aber wenn er läuft und im höhrbereich ist, kann man ruhig die Position mitlifern, denn dann weiß der Spieler doch so wie so wo er ist, dank 3D Sound! Dafür würde dann glaubeich niemand einen cheat schreiben.
-
Ja, glaubst DU dass dafür keiner einen Cheat schreiben würde
Ich als Spieler würde es aber als grosse Hilfe empfinden wenn ich statt einem gaaaanz leisen "trapp trapp" was ich schon fast nichtmehr höre und schongarnicht feststellen kann wo es herkommt einen fetten Pfeil bzw. blinkenden Punkt auf meinem 2. Monitor habe der mit zeigt wo genau der Gegner ist.
Oder dass ich statt ein paar fast schon unbemerkbaren dunkleren/helleren Pixeln die irgendwo durchscheinen einfach die Umrisse der Figur dort sehe die sich hinter dem Busch versteckt, oder eben gleich die ganze Figur, weil der Busch auf einmal halb durchsichtig ist.
Und da fallen mir noch andere Dinge ein, z.B. könnte man diverse Unterschiede die im Original-Spiel kaum sichtbar sind deutlich hervorheben, so dass ich aus zig Metern Entfernung gleich z.B. anhand der Farbe der Spieler-Klamotten sehe was für ne Waffe er hält, und nicht an den 3x3 Pixeln die das Ding gross ist erkennen muss was es ist.
----
Ein konkretes Beispiel: bei bestimmten Versionen von America's Army checken die Server (zumindest einige) ob der Spieler die Schatten eingeschaltet hat, und kicken die die mit Schatten spielen wollen. Weil es nen Bug in einem ATI Grafikkarten-Treiber gibt, der dazu führt dass die Schatten der Spieler durch die Decke von unten sichtbar sind. Was natürlich ein komplett unfairer Vorteil für die ist die mit ATI Karten und eingeschalteten Schatten spielen.
-
Danke code-walker und hustbaer erstmal für die ausführlichen Antworten. Was ich dazu loswerden will:
Was meinen speziellen Fall angeht, so wird das kein MMORPG (das Probleme mit Unmengen von KeyStrokes bekommen würde) und auch kein Ego-Shooter (der Probleme mit Sichtbarkeitsanalyse bekommen würde).
Generell würde ich da gerne unterscheiden zwischen indirektem (Der Cheater verschafft sich einen Vorteil, der aber von anderen Spielern nicht eindeutig indentifiziert werden kann - z.B. verbesserte Sicht und andere Clientseitige Änderungen) und direktem Cheaten(Gezielte Fehlinformationen an den Server, die in der Regel direkt von anderen erkannt werden können - Falsche Highscores, senden falscher Positionen etc.).
Indirektes Cheaten kann man ohnehin nicht verhindern, denke ich. Sie findet schließlich clientseitig statt und nach allem was ich weiß, gibt es mittlerweile Software(Decompiler), die einem mehr oder weniger den Quellcode von Programmen liefern kann. Wenn jemand den Quellcode kennt, kann er den Clienten ohnehin nach Belieben ändern.
Indirektes Cheaten im Multiplayer halte ich für weit weniger problematisch als direktes. Nach dem Motto “was ich nicht weiß, macht mich nicht heiß”, denke ich, würden andere Spieler den Unterschied ohnehin nicht feststellen. Sie könnten maximal erahnen dass jemand soetwas macht. Beweisen können sie es nicht, da schließlich der Datenverkehr zwischen Server und Client gleich bleibt. Sicherlich wäre es schön auch soetwas beheben zu können, aber ich glaube da beißt man sich die Zähne dran aus.Direktes Cheaten hingegen sollte rein theoretisch vermeidbar sein, wenn man von einem unverändertem Programm auf Serverseite ausgeht. Da es ohnehin viel drastischere Möglichkeiten der Manipulation des Spielgeschehens bietet, würde ich hier ohnehin das größte Problem sehen. Senden von Keystrokes ist sicherlich eine gute Idee, wenn die Spielerzahlen im überschaubaren Rahmen bleiben bzw. die Rechenleistung des Servers stimmt. Hier stellt sich bloß die Frage was bei Differenzen im Resultat der Keystrokes zwischen Client und Server zu tun ist, bzw. Wie man solche Differenzen überhaupt aufdeckt. Mein Gedanke hierzu war:
Angenommen der Spieler muss W drücken um vorwärts zu laufen. Der Spieler befindet sich bei position 0. Der Spieler drückt und hält W. Folgendes passiert:
[W wird an den Server gesendet; ClientPos += speed;]{ClientPos = speed; ServerPos= 0;}
[W wird an den Server gesendet; ClientPos += speed;]{ClientPos = 2xspeed; ServerPos=0;}
[W wird an den Server gesendet; ClientPos += speed;]{ClientPos = 3xspeed; ServerPos= speed;} // diesmal gab es also 2 frames Delay
[W wird an den Server gesendet; ClientPos += speed;]{ClientPos = 4xspeed; ServerPos= 2xspeed;} // diesmal gab es wieder 2 frames Delay
Jetzt lässt der Spieler W los, da alle Pakete per UDP geschickt wurden, gehen die letzten verloren(packet loss), Endresultat ist, dass der Spieler auf dem Client auf Position 4xspeed steht und beim Server nur auf 2xspeed. Der Spieler hat hier nicht gecheatet. Dennoch sind die Reultate nicht deckungsgleich. Wie bereits erwähnt, kommt dann noch Kollision mit anderen Spielern dazu die Clientseitig und Serverseitig durch Verzögerung verschiedene Positionen haben. Und wenn noch ein paar Pakete verloren gehen werden die Differenzen natürlich größer.
Das per TCP zu lösen ist Quatsch, weil es eine zu große Latenz ins Spiel bringt. Was man machen könnte ist die Latenz zu begrenzen, sprich: man darf maximal einen 400er ping haben und außerdem regelmäßig vom Server Positionsupdates zu schicken und denSpieler auf dem Client, falls die Differenz zu groß ist, zurechtzurücken. Denke aber, dass so würde jede Menge Geruckel entstehen würde. Wie würde man mit diesem Problem am besten umgehen?Zu den Highscores. Das ist immernoch ein großes Problem. Vorallem, wenn das Spiel im Singleplayer gespielt wird und am Ende Ergebisse ausgetauscht werden sollen.
Die Idee ein Singleplayerspiel tatsächlich im Multiplayer zu spielen halte ich für weniger gut. Multiplayerspiele finden auf mehreren unterschiedlichen Servern statt(auch Listen Server), Singleplayerspiele müssten auf einen einzigen Server zugreifen. Wenn dieser Server dann 1000 Spiele oder mehr gleichzeitig “spielt” zwingt das jeden Rechner in die Knie. Natürlich könnte man die Last aufteilen, aber das geht dann auf den Geldbeutel - vorallem, wenn es ein Freegame wird.
Wie bereits gesagt kann man verschlüsseln. Die Verschlüsselung müsste dann upgedated werden. Ich frage mich gerade, ob mein Professor an der Uni nicht mal dazu was erzählt hatte (hätte ich mal besser aufpassen sollen). Muss ich nochmal die Geschichten von Alice und Bob durchgehen, ob da was Brauchbares bei war. Den Aufwand ständig Client und Serverupdates für die Verschlüsselung zu machen halte ich für ein Freegame wie für nicht vertretbar. Irgendwann will man ja auch mal ein Update zum eigentlichen Spiel machen. Mathegenies? Ideen?Gruß
cman