Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

05.08.2013, 05:06

Code schützen durch C++-Assembly

Ich entwickle momentan ein Spiel in c#.
Da dies aber durch eine Veröffentlichungsplattform eine gewisse Sicherheit bieten soll, habe ich eine Unterklasse zum BinaryWriter bzw. BinaryReader geschrieben, die das ganze etwas, ich sag mal "confused".
Das Problem ist, wenn ich das jetzt in C# kompiliere, kann jeder den Code einsehen. Es ist illegal aber was bringts, krieg ich nicht mit, nacher gibts bloß Hacker.
Deswegen dachte ich mir, ich schreibs in C++ und verwende DllImport.
Schützt das meinen Code dann? Gibt es BinaryWriter und BinaryReader in C++, oder muss ich eine C#-Schnittstelle erstellen, deren Kern C++ importiert? Wichtig ist, dass die Klasse dann in C# benutzbar ist und der C++ Code trotzdem undekompilierbar ist. (Ich denke mal nicht, da die Klassen ja auf .NET basieren).

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

05.08.2013, 06:37

C++ ist genauso dekompilierbar. Man muss halt nur Assembler können, was jetzt nicht gerade schwer ist.
C++ hat zwar auch die Möglichkeit für binäres Lesen und Schreiben (wäre ja gruselig, wenn nicht), aber besitzt nicht die Klassen BinaryReader oder BinaryWriter. Natives C++ ist eben etwas ganz anderes und kennt die .Net Bibliotheken eben nicht. C++/CLI dürfte die kennen. Aber am Ende hast Du rein gar nichts gewonnen.
Wenn Du deinen Code wenigstens etwas schützen willst, Visual Studio kommt mit Dotfuscator im Gepäck. Auch das wird einen Hacker aber nicht aufhalten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

05.08.2013, 08:27

Was genau soll hier eigentlich "confused" werden?
Ich finde die Frage etwas konfus ;)

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

4

05.08.2013, 08:51

Klingt so, als wollte der Threadersteller Obfuscation.

Es stimmt schon, dass man auch C++ dekompilieren kann, aber bei C# klappt das ähnlich wie bei Java richtig gut.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

05.08.2013, 09:23

Ich meine mich daran erinnern zu könen, dass ein solches oder ähnliches Thema bereits gab. Und auch dort wurde schon darauf hingewiesen, dass solche Sicherheitsmaßnahmen nur eine gewise Hürde darstellen, die durchaus bewältigt werden können. Wenn es nicht gerade einen Grund gibt, warum dein Code über diesen Zeitraum keines Falls analysiert werden darf, dann ist ein solches Unterfangen grundsätzlich nicht den Aufwand wert, den man dort hineinstecken müsste.

Du solltest dir überlegen, was du daraus eigentlich zu befürchten hättest. Ist es wirklich nur das Hacking des Spiels?
Wenn ja: warum solle das schlecht sein? Bei sowas, sollte es denn tatsächlich vorkommen, müssen nicht nur Aimbots und Wallhacks entstehen, sondern auch Abwandlungen vom Spiel, die das eigentliche Spiel sogar noch etwas interessanter machen können.
Und bei Hacks musst du dir überlegen, ob diese wirklich ein Problem darstellen.
Ist es ein Spiel, welches nicht über Internet gespielt werden kann? -> Wo ist das Problem?
Ist es ein Spiel mit Onlinefunktionalität? -> Serverseitige Prüfungen, nur relevante Daten übertragen etc. ...

Und in bereits angesprochenem Thema wurde auch gesagt: das alles wird erst dann relevant, wenn dein Spiel bekannt genug ist.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

6

05.08.2013, 15:21

Das Spiel an sich ist mir egal, wenn jemand modifikationen anstellt soll er das tun, alles prima.
Wenn jemand aber User-Accounts hackt?
Also die GUID eines Accounts speichere ich über meinen Stream. So kann der User eindeutig identifiziert werden. Falls jemand herausfindet wie er die GUID ändert ist es nicht so toll, weil er die GUID anderer User nicht kennt.
Außerdem erfolgt kein Anmeldeprozess auf dem Server.
Statistikdaten werden auch gespeichert und ich möchte nicht dass jemand diese verändert also würde ich gerne das ganze in C++ auslagern. Ich kenne Leute die können einen Decompiler bedienen wenn ich sie aber nach
MOV, EAX und JMP frage ist Feierabend, also halte ich das für sicherer.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

05.08.2013, 15:24

Das ist nicht sicher. Auch nicht sicherer.
Eine GUID in einem Webdaten-Strom würde ich ohnehin nicht per Decompiler suchen, sondern per Wireshark, also einem Netwerk-Analyse-Tool. Statistiken können auch dann verändert werden, wenn Du das in C++ packst. Assembler ist nun echt nicht schwer zu lernen, das war meine zweite Sprache damals. Ich habe schon komplette Programme darin geschrieben und andere Leute ebenfalls.
Das ist Schutz für gar nix.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

8

05.08.2013, 15:39

(...)Außerdem erfolgt kein Anmeldeprozess auf dem Server.(...)


Das ist dein Sicherheitsproblem.

Stell dir vor, dein Spiel wäre eh Open Source. Das Sicherheitssystem, dass du dann entwickelst,
wird deutlich mehr taugen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

05.08.2013, 15:44

Es gibt allerdings kein Sicherheitssystem, welches es nicht erlauben würde einen alternativen Client in einer Client-Server-Architektur zu bauen und somit falsche Daten an den Server zu übermitteln - wie eben gefälschte Statistiken oder ähnliches.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

05.08.2013, 15:56

Wenn es um Highscores geht, dann ist "Security by obscurity" wohl das einfachste Mittel der Wahl. D.h. diverse Prüfsummen berechnen und mitschicken, und der Server gleicht die ab. Natürlich kann man durch Ansehen des Quelltexts immer herausfinden, wie die Prüfsummen berechnet werden, und kann dann die Punktzahl verändern.

Eine nicht ganz so einfach zu implementierende Alternative: Das Spiel zeichnet sämtliche Eingaben des Spielers auf (z.B. "zum Zeitpunkt 462 hat der Spieler die Taste 'Links' gedrückt" oder "zum Zeitpunkt 7291 war die Joystickstellung -23, 120"), und der Server spielt das Spiel sozusagen nach. Danach weiß er die Punktzahl, die der Spieler erreicht hat. Dazu muss das Spiel deterministisch laufen (Zufallsgeneratoren sind möglich, indem man den Seed mitschickt). Das schützt gegen einfache Manipulationen der Punktzahl, aber nicht gegen Cheats wie z.B. Aimbots. Auf den ersten Blick könnte man denken, dass dabei große Datenmengen zum Server geschickt werden müssen. Aber die halten sich in Grenzen. Bei Tasten muss man nur ein Event mit einem Zeitstempel schicken. Bei analogen Achsen muss man den Wert potenziell jedes Frame schicken, aber wenn man das quantisiert und ein bisschen komprimiert, sollte das kein Problem darstellen.

Werbeanzeige