Benutzer mit den meisten Antworten
Blockieren von Cheatprogrammen

Frage
-
Hallo,
Ich habe mir heute die Frage gestellt, was man so alles gegen Cheats benutzen kann. (zB Cheat Engine)
Mir ist zwar bewusst, dass Cheat Engine nur Clientside funktioniert, aber es kann trotzdem für kurze Zeit ohne jeglichen Schutz schaden anrichten, darum möchte ich mal nachfragen, was hier am besten wäre.
In einem Forum habe ich gelesen, dass ein User jeden Wert 2x abspeichert hat. Einmal normal und einmal gehasht. Wenn jetzt die Variable benutzt wird, wird vorher überprüft ob der Hash der normalen Zahl der gleiche Wert wie der, der gehasten hat.
Ob dies nun eine wirklich gute Lösung ist bezweifle ich, und mir ist auch klar, dass ich ein Programm nie zu 100% schützen kann, jedoch möchte ich gerne wissen wie man es gegen einen Großteil schützt.
Mit freundlichen Grüßen
Markus Ö.
Antworten
-
Hallo,
wie du schon selbst gesagt hast, kannst du dich nicht zu 100 schützen. Die Frage ist nur, wie kompliziert du es Cheatern machen willst.
Die Variante mit dem Abspeichern des Hashs halte ich für sinnlos, denn sobald das einmal entdeckt wurde (was schnell gehen dürfte) überschreibt man den Hash einfach mit im Arbeitsspeicher.Ein weiteres Problem ist, dass man Programme dekomplilieren kann. Unter .NET ist es sogar besonders leicht, da meist leicht lesbarer Code wieder heraus kommt. So könnte man sogar die Anwendung neu kompilieren. Ein Obfuscator verändert den Quellcode so, das er nicht mehr so leicht lesbar ist. Das wäre zumindest eine erste Maßnahme. Siehe Decompiler und Obfuscator
Wenn es ein Serverabhängiges Spiel ist, kannst du außerdem die wichtigen Daten mit auf dem Server speichern und einige Plausibilitätsprüfungen durchführen. So wird es unmöglich sich übertrieben weit zu cheaten ohne das du (der Server) es mit bekommt.
Größere Sicherheit kannst du erlangen, sobald die Daten nicht mehr Clientseitig verwendet werden. Natürlich ist es nicht empfehlenswert den Server 10mal in der Sekunde zu befragen.Diese beiden Ideen schützen denke ich vor einem Großteil der Cheater, weil es schon komplizierter wird. Was eventuell auch noch hilft ist das verschlüsseln von einigen Arbeitsspeicher Informationen - zumindest vorläufig.
Sobald es ein Programm gibt, was mit 2 Klicks Arbeitsspeicherwerte verändert, solltest du entsprechend ein Update einspielen das das unterbindet.Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets
Alle Antworten
-
Hallo,
wie du schon selbst gesagt hast, kannst du dich nicht zu 100 schützen. Die Frage ist nur, wie kompliziert du es Cheatern machen willst.
Die Variante mit dem Abspeichern des Hashs halte ich für sinnlos, denn sobald das einmal entdeckt wurde (was schnell gehen dürfte) überschreibt man den Hash einfach mit im Arbeitsspeicher.Ein weiteres Problem ist, dass man Programme dekomplilieren kann. Unter .NET ist es sogar besonders leicht, da meist leicht lesbarer Code wieder heraus kommt. So könnte man sogar die Anwendung neu kompilieren. Ein Obfuscator verändert den Quellcode so, das er nicht mehr so leicht lesbar ist. Das wäre zumindest eine erste Maßnahme. Siehe Decompiler und Obfuscator
Wenn es ein Serverabhängiges Spiel ist, kannst du außerdem die wichtigen Daten mit auf dem Server speichern und einige Plausibilitätsprüfungen durchführen. So wird es unmöglich sich übertrieben weit zu cheaten ohne das du (der Server) es mit bekommt.
Größere Sicherheit kannst du erlangen, sobald die Daten nicht mehr Clientseitig verwendet werden. Natürlich ist es nicht empfehlenswert den Server 10mal in der Sekunde zu befragen.Diese beiden Ideen schützen denke ich vor einem Großteil der Cheater, weil es schon komplizierter wird. Was eventuell auch noch hilft ist das verschlüsseln von einigen Arbeitsspeicher Informationen - zumindest vorläufig.
Sobald es ein Programm gibt, was mit 2 Klicks Arbeitsspeicherwerte verändert, solltest du entsprechend ein Update einspielen das das unterbindet.Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo,
erstmal danke für die rasche Antwort,
Zu deiner ersten Lösung: Ich habe vor kurzen ein C# Spiel dekomipliert und musste feststellen, dass der ganze Code entweder falsch oder absolut schwer zu lesen war, ich hoffe und denke, dass dies Obfusactor ebenfalls für mich erledigt.
Über eine Plausibilitätsprüfungen habe ich auch etwas nachgedacht und werde ich auf jedenfall einführen ins Programm.
Bezüglich Server habe ich nachgedacht, ich habe aber bis heute noch keine Anwendung geschrieben, welche vom Client Daten auf einen Server schickt und der diese Anschließend speichert geschweige den überhaupt einen Server.
Wenn ich ein gutes Codebeispiel oder Anleitungen dazu bekomme wie ich einen Server schreibe, wäre es für mich weniger das Problem vor Cheatern zu schützen.
Dieses Beispiel habe ich mir öfters schon angesehen, nur weiß ich selbst mit meinen Wissen nicht, ob dies das richtige wäre, um Daten vom Client zum Server zu schicken:
http://www.codeplanet.eu/tutorials/csharp/4-tcp-ip-socket-programmierung-in-csharp.htmlMit freundlichen Grüßen
Markus Ö.
- Bearbeitet Bashesz Samstag, 7. Juni 2014 20:17
-
-
Hallo,
danke für die Antwort, habe eben probiert das Programm nachzuschreiben. Auf meinen eigenen Rechner hat alles einwandfrei funktioniert. Wenn ich jedoch den Client von einen anderen PC aus starte kommt keine Verbindung zum Server an. Der andere Rechner auf welchen ich es getestet habe war nicht in meinen Netzwerk. Die Firewall wurde ebenfalls ausgeschalten zum testen.
Da meine Englisch Kenntnisse nicht besonders gut sind kann ich mir gerade nur sehr schwer vorstellen, was der Programmierer dieses Snipsets mit folgenden Text gemeint hat:
The client can be either run from the same machine as the server or from a different machine. If run from a different machine then a network connection should exist between the machines running the server and client programs
Bezüglich was ich brauchen würde wäre ein ganz einfach Server, welcher Daten zum Client schicken kann und auch Daten (string, int) empfangen kann und anschließend abspeichert, wobei ich bemerkt habe, dass dies im Beispiel schon vorhanden ist.
Mit freundlichen Grüßen
Markus Ö.
- Bearbeitet Bashesz Samstag, 7. Juni 2014 21:57
-
Hi Markus,
wenn die Rechner nicht im selben Netzwerk sind kann es natürlich nicht Funktionieren.
Wenn du den anderen Rechner nicht anpingen kannst, kommst du nicht dran.
(Das ist auch grob die Aussage des Englishen Textes. Da viele Beispiel in Englisch sind, sollte man als Entwickler schon Englisch können. Nimm dir die Zeit und übersetzt dir den Text in Ruhe, der Rest kommt dann mit der Zeit. Mein Englisch hat in der Schule auch nur für eine 5 gereicht).
Grundlegend sendet ein Server keine Daten von sich aus an einen Client, sondern Antwortet auf eine Anfrage. Wenn es "nur" darum geht Daten zu verwalten bietet sich eine Datenbank an. Da hast du mit den EF einen ziemlich einfachen zugriff.
Deine Anforderung Daten zwischen Server und Client auszutauschen, ist so allgemein gehalten, dass man da nichts wirklich genaues zu sagen kann. Wenn du nicht genau weißt, was du brauchst kann man da schwer weiterhelfen. Am besten ist es dann, dass was du genau machen möchtest möglichst genau zu beschreiben.
MFG
Björn
-
Hallo,
Sorry erstmals für meine schlechte Erklärung.
Wie Koopakiller es oben richtig bemerkt hatte, geht es um ein Spiel, in welchen man gegen andere Spieler mit einen Avatar antritt und dadurch Erfahrung und Gold erhält. Um aber sich durch jegliche Cheatprogramme keinen Vorteil zu erschaffen muss ich vor jeden Angriff/Einkauf die/das Angriffswerte/Vermögen am besten neu auslesen. Entweder aus einer Datenbank oder aus einem Server, welcher für jeden Spieler eine Textdatei anlegt mit deren Werten. Wobei ich von mir aus mehr zum Server denke.
Wie du es beschrieben hast, dass ein Server nur antwortest ist mir bewusst, und daher denke ich, dass es möglich wäre die Werte über den Server nach der Anfrage des Clients zu schicken.
Bezüglich des Problems, dass andere Rechner keine Verbindung bekommen habe ich etwas über Port Forwarding gelesen, da ich derzeit mein Internet über einen A1 Stick beziehe. Wäre dies eine Möglichkeit wieso es ebenfalls nicht funktioniert?
Ich hoffe ich konnte es nun etwas genauer Beschreiben.
Mit freundlichen Grüßen
Markus Ö.
-
Bevor du die Daten in eine Textdatei auf einen Server Speichert, solltest du eine Datenbank benutzen.
Wenn 2 Avatar gegen einander Antreten sollen, gehen ich mal von 2 Computer aus. Wie soll den dar die Kommunikation statt finden.
Echtzeit oder eher Runden basiert ?
- Bearbeitet Palin Sonntag, 8. Juni 2014 14:54
-
Hallo,
Das ganze Angriffssystem basiert über ein Zufallsprinzip. Es gibt mehrere Werte, zB ein Character greift dann zuerst an, wenn er mehr Speed als der Gegnerische hat, ebenfalls kann es passieren (Durch Glück), dass ein zweiter oder mehrere Angriffe hintereinander stattfinden, anschließend greift der andere Spieler an. Das ganze geht solange, bis einer Tod ist. Der gegnerische Spieler muss dazu nicht Online sein, da ja alles durch Glück und die Formeln passiert. Der ganze Kampf dauert Maximal 1 Minute und anschließend bekommt man seine Belohnung und kann ganz normal weitermachen.
bezüglich Server nochmal, da ich derzeit nur den Server nur auf meinen Computer laufen haben werde, und vorerst viel Zeit investieren werde, bevor es überhaupt einmal richtig spielbereit ist, denke ich aber, dass es gleich gut bis hin zu besser wäre, vorerst alles auf meinen Rechner zu speichern. Oder wieso ratest du mir hier zu einer Datenbank? Wenn es Möglich wäre, die Werte vor dem Kampf im Hintergrund runterzuladen würde es mich gar nicht stören. Ich habe selbst erst 2 Anwendungen mit Datenbanken programmiert, wobei beim Zugriff das Programm immer für kurze Zeit wie "eingefrohren" war bis es alles heruntergeladen hat.
EDIT: Da ich aber nicht nur meine Werte sondern auch die des Gegner runterladen muss, könnte es dann hierbei zu noch längeren Verzögerungen kommen? Da ich die Ladegeschwindigkeit so schnell wie Möglich halten möchte.
Mit freundlichen Grüßen
Markus Ö
- Bearbeitet Bashesz Sonntag, 8. Juni 2014 15:17
-
Eine Datenbank kannst du auch erst mal auf deinen Rechner laufen lassen, die macht den Zugriff auf die Daten im Gegensatz zu einer Textdatei einfacher und schneller. Und ob sie dann lokal auf den Rechner liegt oder irgendwo im Internet ist dann auch recht egal.
Grundlegend kannst du einen Service (z.B. WCF) auf den Server bereitstellen, der die eigentlichen Berechnungen macht. Also anstatt die Werte von A und B an den Client zu geben, kannst du sagen der Client Ruft den Server auf und sagt nur A tritt gegen B an und der Server übernimmt dann die Berechnung. Und liefert dann A oder B gewonnen zurück. Das verhindert auch eine Manipulation der Werte, da sie "nie" im Speicher des Client sind.
-
Hallo,
Erstmal danke für die Antwort, darüber habe ich gar nicht nachgedacht, dass während des Kampfes etwas manipuliert werden könnte.
Wenn ich dich richtig verstanden habe, dann wählt der Client A seinen Gegner B aus und schickt dies zum Server, der Server hohlt sich nun die Werte von der Datenbank und berechnet wer gewinnt, anschließend wird es zurück gegeben.
Wenn ich das richtig Verstanden habe wäre das echt eine gute Lösung nur habe ich da eine Frage dazu:
- Da ich vorerst keinen Animierten Kampf machen kann würde ich gerne einen Kampflog einbauen. Dh es erscheint danach ein Textblock wo zB drinnen steht:
Spieler A hat Spieler B 500 Schaden zugefügt. Spieler B hat noch 100 Lebenspunkte.
Spieler A hat den Angriff von Spieler B ausgewichen. Spieler A hat noch 600 Lebenspunkte.
Spieler A hat Spieler B 750 Schaden (Krittisch) zugefügt. Spieler B wurde besiegt.
Wäre dies mit deiner oben genannten Möglichkeit umsetzbar?
Mit freundlichen Grüßen
Markus Ö.
-
Ja der Service kann auch eine Liste von Texten zurück geben.
Vor einigen Jahren hab ich mal ein "Online Rollenspiel" gespielt. Was recht einfach gestrickt war. Mit seinen Freunden konnte man sich zu einer Gruppe zusammen tun. 1x am Tag ging die Gruppe zu einen festgelegten Zeitpunkt in ein Dungon mit der Ausrüstung die Vorher festgelegt war. Die Kämpfe im Dungon würden dann mit gewissen Zufallszahlen vom Server berechnet und man bekam ein Ergebnis zurück. Wie welcher Kampf gelaufen ist. Da die Gegner im Dungon gewisser stärken hatte konnte man seinen Charakter dementsprechend ausrüsten, bzw. Festlegen welche Artaken er verwenden sollte.
-
Hallo,
Danke, dann ist das Problem einmal gelöst.
Ich habe mir eben einen Beitrag zu WCF Service durchgelesen wo eine simple helloworld + name Application geschrieben wurde, der user hat hierbei 3 Startprogramme (Den Client, den DevServer und den Service). Nun stellt sich für mich die Frage, wenn ich jetzt jemand anderen den Client schicke und er davon Daten emfangen will, muss ich dann meine IP Adresse eingeben oder ist der Server mit der Class im Client eingebunden? Oder verstehe ich da gerade etwas komplett falsch.
Hier der Beitrag: http://www.codeproject.com/Articles/531332/Implementing-a-Basic-Hello-World-WCF-Service-v
Mit freundlichen Grüßen
-
Hallo,
Okey, das heißt dann Im Client und im Server trage ich meine IP Adresse jeweils ein und der Client connecten beim Aufruf auf dem Server?.
Gibt es hier noch spezielle Ports welche ich beachten muss, dass eine Verbindung rein und rauskommen kann?
Mit freundlichen Grüßen
Markus Ö.
-
Nur der Client muss die IP Adresse kennen.
Es gibt gewisse Standard Ports die du nicht verwenden solltest.
Kleine Hinweis noch, Schau das du eine mehrschichtige Architektur verwendest. Wenn du dann feststellst das du z.B. die Logig doch beim Client brauchst kannst du das dann einfacher ändern.
p.s. markiere mal Toms Antwort als Antwort und erstell für andere Fragen eine neue Post. Das hilft anderen gegebenen Falls eine Lösung für ihr Problem zu finden.
- Bearbeitet Palin Sonntag, 8. Juni 2014 19:55
-
Hallo,
Zu deinen 2. Link denke ich hast du etwas falsches reingestetellt hast, da es bei deinen Post geht welche Visual Studio Version sie benutzen. Sollte das als Teils Frage gelten, ich benutze Visual Studio 2013 Ultimate.
Danke nochmals für die ganzen Antworten, ich werde nun die nächste zeit herum basteln und mich bei Rückfragen wieder im Forum melden.
Mit freundlichen Grüßen
Markus Ö.