"Python code verstecken" Server, Client

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Mittwoch 10. Januar 2007, 13:07

Aah, ich beginne langsam deine Aussage zu verstehen.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Mittwoch 10. Januar 2007, 16:59

Mad-Marty hat geschrieben:
Sr4l hat geschrieben: Projekt PyZip by me is born ^^ wollte mich eh mit dem Thema compremieren befassen :-D
Bitte nicht noch ein Packformat ;) Danke :D

Zur Gameserver Thematik:
Klar kannst du die Kommunikation per SSL etc verschlüsseln und das Proggi
compilen und die exe encrypten etc.
Trotzdem crackt dir jeder mit etwas skill den mist in kurzer zeit weg!

Solche Berechnungen gehören in den Server wie Blackjack schon sagte, das ist einfach so.
Dann bleibt nur noch eine plausibilitätsprüfung der state übertragungen des clients.

Das ist der beste kompromiss, und das der auch nicht perfekt geht siehst du an praktisch allen Multiplayer Games ;)
Back2Topic ;-)

kannst du mir erklären wie ich die exe encrypte kann?
es geht nicht um die Wichtigkeit der Rechnung sondern um das Prinzip irgendwelche Berechnungen vor dem User der am Clienten sitzt geheim zuhalten.
Genau wie auch gerold geschrieben hat mit der shareware.

SSL schützt die Verbindung nicht die Daten an sich.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 10. Januar 2007, 17:54

Sr4l hat geschrieben:kannst du mir erklären wie ich die exe encrypte kann?
Mit GnuPG zum Beispiel. Solltest aber darauf achten, dass du einen guten Schlüssel hast.
Sr4l hat geschrieben:SSL schützt die Verbindung nicht die Daten an sich.
Und was wird in der Verbindung übertragen? Richtig! Die Daten! :twisted:
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Mittwoch 10. Januar 2007, 18:25

Die Daten die über die Leitung gehen sind mir egal ^^.

Ich möchte die Berechnungsformel im Script für die Daten die übertragen werden nicht sichtbar machen ;-) und das ist denk ich nicht möglich in Python wo bei der singelexe von Py2EXE so direkt keine Daten preis gibt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 10. Januar 2007, 18:31

Sr4l hat geschrieben:Die Daten die über die Leitung gehen sind mir egal ^^.
Sind sie dir nicht. Denn solange die Daten auf dem Server nicht manipuliert werden, ist das völlig egal was einer mit seinem Client anstellt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Mittwoch 10. Januar 2007, 18:45

Wenn alles der Server errechnet dann ist mir egal was jmd mit dem clienten anstellt es ist ja dann nur ein "Fernseher" ^^

Ach ich werde mich einfach mal mit RSA beschäftigen und nen cracker coden was auch gerade ein Post im Forum ist. :-D
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Mittwoch 10. Januar 2007, 18:58

Es ist egal, ob du den Client verschlüsselst. Der muss auch irgendwo entschlüsselt werden um ausgeführt zu werden. Und auch die Daten müssen übertragen werden. Du kannst natürlich dafür viel Aufwand mit Crypto treiben, aber das Problem ist einfach, dass du Dinge schützen willst, die von vornherein am falschen Ort sind. Auch SSL kann man angreifen (MitM) und dann sind die Daten plötzlich wieder ungeschützt und können manipuliert werden.

Also, nochmal, warum führst du die Berechnungen nicht auf dem Server aus, wo sie definitiv hingehören?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 10. Januar 2007, 22:03

Hi Sr4l!

Warnung: Alles nur Theorie!!!

Hier ein kleiner Vorschlag. Allerdings weiß ich noch nicht, wie man von C oder von C++ aus den Pfad zum Programm herausfinden, das auf das C-Programm zugreift. Warum das für meinen Vorschlag wichtig ist? Um nur dem dafür vorgesehenen Python-Programm zu erlauben, auf die C-DLL zuzugreifen.

Hier die genauere Erklärung:
Ein Python-Programm (das Spiel) verbindet sich zu einem C-Programm. Diesem C-Programm übergibt das Python-Programm die Werte, die zu übertragen sind und den zufälligen Schlüssel, den der Server übermittelt hat.

Das C-Programm prüft zuerst, ob auch wirklich nur das authorisierte Python-Programm auf das C-Programm zugreift und nicht irgend ein anderes Programm. Dafür muss vom C-Programm aus herausgefunden werden, welches Programm den nun auf das C-Programm zugreift.

Im C-Programm steckt, aufgeteilt auf mehrere Variablen, der SHA-Code des authorisierten Python-Programms. Wenn das C-Programm also herausfinden kann, von welchem Programm aus es aufgerufen wurde, dann könnte das C-Programm evt. auch prüfen, ob das Python-Programm nicht verändert wurde (mit dem SHA-Code). Ob es Probleme mit Dateisperrungen in Windows gibt, das kann ich nicht sagen.

Da jetzt das C-Programm weiß, dass die Daten von einem nicht veränderten Python-Programm kommen, kann dieses C-Programm die Daten auf Plausibilität überprüfen und dann mit Hilfe des Schlüssels in eine verschlüsselte Zeichenfolge umwandeln. Diese Zeichenfolge wird an das aufrufende Python-Programm zurück gegeben.

Das Python-Programm kann sich dann um die Übermittlung der verschlüsselten Zeichenfolge, zum Server, kümmern.

Der Server entschlüsselt die Zeichenfolge.

---------------

Wenn man statt einer einfachen, zufälligen Zeichenfolge, ein Private-/Public-Key Verfahren einsetzt, dann ist die Sache evt. ein bischen sicherer.

Alles lässt sich knacken. Du musst also immer wieder mal ein Update raus bringen, in dem du eine Kleinigkeit am Schlüssel und am Verfahren änderst. So bist du immer einen (kleinen) Schritt voraus.

Dieser Vorschlag steht oder fällt damit, ob das C-Programm den Pfad oder irgendeinen anderer Link zum aufrufenden Python-Programm herausfinden kann. Ebenso wichtig ist es, ob ein gestartetes Python-Programm per SHA gescannt werden kann. Dann ist noch wichtig, wie gut man in einem C-Programm einen Schlüssel verstecken kann.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 10. Januar 2007, 22:06

Y0Gi hat geschrieben:Also, nochmal, warum führst du die Berechnungen nicht auf dem Server aus, wo sie definitiv hingehören?
Hi Y0Gi!

Ich antworte einfach mal an Stelle von Sr4l.

Weil es egal ist, ob ich die Berechnung am Client durchführe und dann einen gefälschten, verschlüsselten String an den Server schicke, oder ob ich dem Server gefälschte Basisdaten (Punktezahl, Anzahl Bonuspunkte, ...) übermittle.
Es geht ja gerade darum, dass diese Daten an den Server übermittelt werden können -- aber nur vom (unveränderten) Original-Python-Programm -- so dass keiner falsche Punktzahlen an den Server schicken kann.

Es soll also keiner dem Server mitteilen können, dass er den Drachen getötet hat, wenn er es noch nicht geschafft hat.

Einfach nur das Python-Programm selbst mit SHA prüfen, genügt nicht, da das Python-Programm einsehbar ist. So kann jeder herausfinden, wie die Daten an den Server übermittelt werden und diese Daten fälschen.

Wenn ich aber irgendwie feststellen kann, dass die Daten wirklich vom unveränderten Python-Programm und von keinem anderen Programm an den Server geschickt werden, dann kann ich mir (halbwegs) sicher sein, dass keine falschen Daten an den Server übermittelt werden.

Die Frage ist: Wie kann ich vom Server aus feststellen, ob mir die Daten untergeschoben, oder wirklich vom unveränderten Python-Programm geschickt wurden?

Einen evt. möglichen Ansatz habe ich in einem vorherigen Beitrag aufgezeigt.

Wenn ich falsch liege -- dann bessert mich aus.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Mittwoch 10. Januar 2007, 23:20

gerold hat geschrieben:
Y0Gi hat geschrieben:Also, nochmal, warum führst du die Berechnungen nicht auf dem Server aus, wo sie definitiv hingehören?
Hi Y0Gi!

Ich antworte einfach mal an Stelle von Sr4l.

Weil es egal ist, ob ich die Berechnung am Client durchführe und dann einen gefälschten, verschlüsselten String an den Server schicke, oder ob ich dem Server gefälschte Basisdaten (Punktezahl, Anzahl Bonuspunkte, ...) übermittle.
Es geht ja gerade darum, dass diese Daten an den Server übermittelt werden können -- aber nur vom (unveränderten) Original-Python-Programm -- so dass keiner falsche Punktzahlen an den Server schicken kann.

Es soll also keiner dem Server mitteilen können, dass er den Drachen getötet hat, wenn er es noch nicht geschafft hat.
OMG, das hat nicht der Client zu entscheiden! Diese Berechnung gehört auf den Server, dann stellt sich diese Frage gar nicht erst.
Die Frage ist: Wie kann ich vom Server aus feststellen, ob mir die Daten untergeschoben, oder wirklich vom unveränderten Python-Programm geschickt wurden?
Gar nicht!
Einen evt. möglichen Ansatz habe ich in einem vorherigen Beitrag aufgezeigt.

Wenn ich falsch liege -- dann bessert mich aus.
Na zum Beispiel ist es egal wie gut der Schlüssel im C-Teil versteckt ist und auf wieviele Variablen er verteilt ist. Interessant ist der Programmpunkt wo entschieden wird, ob der Schlüssel richtig oder falsch ist. Das ist im Regelfall ein einfacher Branch-Befehl. Ich war zu DOS-Zeiten bei Passwortabfragen von Spielen der Art: "Bitte geben sie das X. Wort im Y. Absatz auf Seite Z des Handbuchs ein" immer wieder überrascht wie einfach das fast immer per Debugger mit Breakpoints und Single-Step durch das Programm zu lösen war, in dem man einfach den Punkt herausgefunden hat, wo zwischen Richtig und Falsch entschieden wurde. Dabei war es völlig egal wie kompliziert der Code zum überprüfen war -- am Ende stand ein Branch-Befehl den man einfach nur negieren brauchte. Dann konnte man jedes Wort eingeben -- ausser das richtige. :-)

Das heisst man müsste auch möglichst verschleierten Code schreiben. Wenn man sicher sein will das der C-Compiler den beim optimieren nicht wieder "entwirrt" müsste man wohl auf Assembler zurückgreifen. Das ist alles unheimlich aufwändig. Alles Probleme die man umgeht wenn man alles auf dem Server berechnet.

Die Frage von Y0Gi ist also immer noch nicht beantwortet: Warum muss der Client "schützenswerten" Code enthalten?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 10. Januar 2007, 23:43

BlackJack hat geschrieben:Die Frage von Y0Gi ist also immer noch nicht beantwortet
Hi BlackJack!

Es geht doch gar nicht um irgendwelche Berechnungen -- es geht primär darum, dem Server Daten zu übermitteln, die nur von einem unveränderten Python-Programm stammen dürfen, damit sichergestellt werden kann, dass die Daten nicht manipuliert wurden. Eine Denkansatz dabei war, am Client nicht einsehbare Änderungen an den Daten vorzunehmen und diese am Server wieder zurück zu wandeln. Das war ein Denkansatz.

Ein anderer Denkansatz kahm von mir, indem ich am Client-Computer prüfe ob die Daten auch wirklich vom richtigen Programm kommen und in einem C-Programm die Verschlüsselung vornehme. Kein True oder False, sondern eine mehrstufige Verschlüsselung mit unbekannter (weil im Maschinencode versteckter) Vorgehensweise. Das war ein Versucht, das Problem zu lösen -- ein Denkansatz.

Aber ihr sprecht immer von irgendwelchen Berechnungen die auf den Server müssen. Welche Berechnungen denn? Einzelheiten!

Entweder ich verstehe das Problem nicht oder ihr versteht das Problem nicht.

:shock: ...ich kämpf doch nicht gegen Windmühlen. -- spät es auch ist.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Mittwoch 10. Januar 2007, 23:48

Der Beitrag: Ich antworte einfach mal an Stelle von Sr4l. ...
und der Beitrag hier drüber.

treffen es genau das was ich meine.ich hatte einen weg gesucht das so zu verschlüsseln das ich dem Clienten rechen aufgaben überlassen kann. Türlich kann ich das über nen Server machen aber Server kosten Geld und wenn ich es nur auf einem vorhanden laufe lasse raube ich ihm ressorcen.

Ich könnte alles auf dem Server rechnen lassen trotzdem kann jemand immer noch einfach den Befehl senden attack, attack, attack.....
und würde dann immer noch automatisiert angreifen. dann müsste ich checken wieviel Angriffe er schon gemacht hat usw.

Ich werde es jedoch akzeptieren das es keine vernünftige Lösung gibt.
gummibaerchen
User
Beiträge: 51
Registriert: Samstag 7. Oktober 2006, 15:13

Donnerstag 11. Januar 2007, 00:12

Aber (je nach Game) ist es ja nicht nur ein Kampf.

Zum Beispiel wäre es auch ein großer Vorteil für den User, wenn er 10% schneller laufen könnte (WoW, CS, NFS). Und da gibts bestimmt noch hunderte andere Knackpunkte, die man alle berechnen müsste.

Da kann ich mir schon vorstellen, dass das einen enormen Aufwand bedeutet.

Für kleine Sachen mag Kompilieren und SSL vllt ausreichen, aber gerade bei großen Sachen gibt es doch immer Leute die versuchen zu Reverse-Engineeren.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 11. Januar 2007, 09:49

So, nun mische ich mich auch mal ein... Ich denke es kommt nicht wirklich auf die Art des Spieles an.

Gehen wir mal vom Ideal Fall aus, das man möglichst alles auf dem Server Berechnen kann. Mal zwei Beispiele:

Wenn wir also sowas haben wie ein rundenbasierendes Strategie Spiel, dann kann auf dem Client nur in jeder Runde die Positionen der Figuren geändert werden. Nur die neuen Positionen werden zum Server übermittelt. Der hat dann alle Daten und berechnet den Zug, sendet dann das Ergebnis zurück.

Noch einfacher: Nehmen wir ein Schachspiel. Der User am Client änder eine Position einer Figur und schickt die zum Server. Der wartet auf einen anderen Client oder berechnet seinen eigenen Zug (Spiel gegen Computer).

Ich denke bei beiden Varianten berechnet der Server im Prinzip alles. Dennoch kann man natürlich mit einem gefälschten Client quasi "automatisch" spielen.

IMHO ist der Vorschlag "Berechne alles auf dem Server" keine vollständige Lösung.

Ich frage mich ob es u.a. nicht genau das ist, was in der ganzen Trusted Computing bzw. DRM Diskussion gewollt ist. Man möchte garantieren, das sein Programm unverändert auf dem Client läuft, in einer geschützten Umgebung...

Zweitens Frage ich mich, wie das andere, schon existierende Spiele machen??? Es wird wohl eine Reihe OpenSource-Spiele existieren, die mit Servern arbeiten. Dort könnte man mal nachfragen, was die zum Datenschutz gemacht haben...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Donnerstag 11. Januar 2007, 09:52

Sr4l hat geschrieben:Ich werde es jedoch akzeptieren das es keine vernünftige Lösung gibt.
Wenn die Clients nicht vertrauenswürdig sind, dann musst Du alles auf dem Server berechnen und überprüfen. Da führt kein Weg dran vorbei ohne Lücken zu öffnen. Und natürlich muss man auch dann noch überprüfen ob der Client Aktionen durchführen will, die er gar nicht darf, wie z.B. in der Einheiten-Bewegen-Runde einen Angriff durchführen.

Da können dann zwei Dinge passieren: Das Programm benutzt kaum jemand, und es gibt keine Angriffe, oder das Programm wird sehr gerne benutzt, womit auch die Gefahr der Angriffe stark steigt. Es wird immer irgendwelche Schüler mit genug Zeit und Antrieb geben, die sich reinhacken. Siehe meine Ausführung zu DOS-Spielen. :-)
Antworten