JavaScript Wo ist der Quellcode bei C&C online?

mercsen

Lt. Commander
Registriert
Apr. 2010
Beiträge
1.679
Wo ist der Quellcode bei C&C online? Wie JS verstecken?

Hallo CB Gemeinde.

Meine Frage hat nur indirekt etwas mit Programmierung zu tun, aber wüsste auch nicht wo ich sie sonst stellen soll.

Habe gerade die News gelesen das C&C nun als online Version zur Verfügung steht und als langwieriger Fan der Serie und stets neugieriger Entwickler dachte ich mir das dies doch mal eine super Möglichkeit wäre sich ein wenig von der Mechanik abzuschauen. Es ist ein reines Browserspiel und basiert auf HTML 5, das gesamte Spiel wird auf einem canvas Objekt gezeichnet, deshalb mutmaße ich mal das es zum großen Teil auf JavaScript basieren sollte.
Ich finde nur leider keinerlei Programm Logik in den Skripten die, die Seite lädt. Im Debugger sehe ich das regelmäßig mit dem EA Server kommuniziert wird, kann mir auch den call stack das XHR Objekts anzeigen lassen, aber nicht wie gewohnt von der Konsole in den Code springen! Ich sehe auch nicht aus welcher Datei und in welcher Zeile der Request gestartet wurde, nur eine lange Auflistung von Klasse und Methoden, eben den Call Stack.

Das war schon mal komisch.
Dann dachte ich dass ich eben den umgekehrten Weg gehe und habe mir mit dem DOM Inspektor mal ein paar Elemente angeschaut und überprüft was für EventHandler auf diesen Objekten registriert sind. Sind wirklich verdammt viele. Doch auch hier finde ich nur ein sehr merkwürdiges Verhalten vor, welches von dem abweicht was ich gewohnt bin.

Ich sehe das alle - zumindest alle die ich mir angeschaut habe - in der Datei undefined in der Zeile 70.000 irgendwas stehen. Klicke ich dann auf die Datei um zum Quellcode zu kommen gelange ich aber nur zur Ressourcen Ansicht, welche komischerweise auch bis auf den Hauptframe gar keine Elemente enthält außer eine kleine Datei im local storage.

(Einigen wird wohl aufgefallen sein das ich den Chrome debugger nutze)

Die einzigen JS Dateien die ich sehe sind welche um den rechtsklick zu unterbinden oder Media Dateien zu laden, wenn kein local Storage zur Verfügung steht.

Jetzt meine Frage: Wie machen die das??

Die können das ja wohl unmöglich alles vom Server berechnen lassen?

Ein Blick in die Request hat mir gezeigt das dies aber wohl doch der Fall ist, leider kommen die Daten zwar im Klartext und im JSON Format rüber, sind ohne Erklärung nicht zu verstehen und ich kann einfach nichts finden wer dieses reuest rausschickt und wo es verarbeitet wird.

Als Initiator steht immer nur "other", das macht mich wahnsinnig. Ich werde keine ruhe mehr finden bis ich das Rätsel gelöst habe!

Die reuqests gehen in meinem Fall immer an https://prodgame08.alliances.commandandconquer.com/26/Presentation/Service.svc/ajaxEndpoint

Was mich auch sehr stutzig macht das unzählige JS Dateien geladen werden deren Aufgabe ich nicht zu deuten vermag, aber ständig taucht dort das Wort "Chrome" auf

Vlt. kennt ja einer den Weg dorthin, ansonsten hoffe ich auf eine rege Diskussion :)
 
Zuletzt bearbeitet:
Ich vermute (ungesehen / ungeprüft) das im Hintergrund auf dem Server Node.js als I/O Framework auf dem Server dient. evt. auch eine Distribution diverser Statischer Inhalte per CDN.

Die Frage ist: Was genau interessiert dich daran?
Wie es technisch umgesetzt wurde?

Ah, sehe schon. Es wird auch auf die Comet-Technologie gesetzt ...
 
Zuletzt bearbeitet:
Ähm, ich denke nicht das es der Betreiber gerne sieht wenn man in seinem Quellcode rumschnüffelt!
Und ich denke auch das da ein paar sehr gute Leute dran sitzen, die genau wissen wie sie das verhindern können...

Ich denke er will sehen wie das Spiel "funktioniert", also die Algorithmen/Logik dahinter, weniger die programmiertechnische Umsetzung.
 
Zuletzt bearbeitet:
das wird sicher vieles von der Serverseite aus gesteuert - alleine um das Manipulation beim Client zu verhindern.
Denke mal das ist ein zu komplexes Projekt um das mal eben im Rahmen des Forums innert Minuten auseinanderzunehmen.
 
Ah, ok... Den wie von der technischen Seite her scheint es so zu sein wie ich bereits vermutet habe:

CDN, Comet, in diesem Falle auch ein IIS-Server...

Kann ehrlich gesagt noch immer nicht nachvollziehen, warum das so interessant sein soll :)
 
excalibur1976 schrieb:
Ich vermute (ungesehen / ungeprüft) das im Hintergrund auf dem Server Node.js als I/O Framework auf dem Server dient. evt. auch eine Distribution diverser Statischer Inhalte per CDN.
trotzdem muss der Client Code für die Logik haben.


Ich denke mal, dass irgendwo für dich unsichtbar der Code geladen und ausgeführt wird. Z.B. mittels WebSockets den kompletten JavaScript Code an den Client senden und dort dann mittels eval() ausführen, so wäre zumindest zu erklären, dass kein Code gefunden wird.
 
@KnolleJupp: genau falsch. mich hat weniger interessiert wie das spiel funktioniert sondern die technik dahinter. Ich habe bisher gar keine erfahrung im bereich spiele und HTML 5 sammeln können, finde das thema aber hoch interessant. Man lernt ja nie aus. Beim durchgucken habe ich halt gemerkt das ich durch das verwendete system kein bisschen durchsteige da techniken verwendet werden die mir bis dato gänzlich unbekannt sind.
Wie das spiel funktioniert ist mir absolut schnuppe, zumal man sich soetwas auch selber erarbeiten kann. ich habe selber schon an einem uralten browser game mit gearbeitet (was leider nie über den alpha status kam und zu zeiten entwickelt wurde als über web 2.0 noch nicht mal nachgedacht wurde :( (war damals als ogame klone und lern projekt geplant))

mir ging es ehr darum wie die es schaffen die programmlogik so dermaßen gut zu verschleiern da ich selber ein Projekt am laufen habe zur Personalverwaltung und dort auch gerne den Code so gut es geht verstecken möchte. Da mir das nicht gelungen ist lasse ich den server halt alle anfragen verifizieren, was aber ein erheblicher aufwand ist.

Mich hat es einfach fasziniert das ich einfach so absolut gar nix finden konnte, nichtmal die resourcen die genutzt werden und der debugger absolut nicht das verhalten an den Tag legt, welches ich gewohnt bin.

Cheaten oder ideen klauen war absolut nicht meine Intention. (höchstens ein wenig inspiration ;))

@excalibur1976: interessant ist es - zumindest für mich - aus den oben genannten gründen. Ich kenne es nicht möchte es aber verstehen :) Sieht mir aber wirklich ein wenig zu kompliziert aus um es hier breit zu treten, aber ein paar schlüßelwörter wurden ja schon in den Raum geworfen, ich werde mal gucken was ich da recherchieren kann.

Wissen ist macht und ich strebe die weltherrschaft an :p ;)


Danke erstmal soweit :)
 
Zuletzt bearbeitet:
Mercsen schrieb:
mir ging es ehr darum wie die es schaffen die programmlogik so dermaßen gut zu verschleiern da ich selber ein Projekt am laufen habe zur Personalverwaltung und dort auch gerne den Code so gut es geht verstecken möchte. Da mir das nicht gelungen ist lasse ich den server halt alle anfragen verifizieren, was aber ein erheblicher aufwand ist.
Sollte man das nicht grundsätzlich immer machen? Ich würde dem User kein bisschen vertrauen. Im Zweifelsfall kann er absolut alles manipulieren.
 
Klar, aber trotzdem muss man es den Leuten ja nicht zu leicht machen die sachen zu manipulieren. Man kann den HTML und JS teil ja leider beliebig ändern oder einfach selber nen gefakten HTTP Request an den server schicken ;)
Was ich btw. auch des öfteren mache da ich gerne Seiten auf ihre sicherheit teste, just 4 fun. So hab ich mir schonmal karten für ein festival bestellt bevor der offizielle Verkauf auf der Seite gestartet ist ;)
Bei C&C scheint des aber schwerer und sowas wünsche ich mir in Zukunft auch :D
 
Viel wichtiger finde ich persönlich die Fähigkeit, HTML5/JS - Content zu liefern, den nicht sofort jeder Achtklässler kopieren und nachbauen kann. Einer der letzten großen Pluspunkte von Flashgames gegenüber HTML5-Varianten ist doch, dass dir keiner ohne Weiteres in die Karten gucken kann. Das Höchste der Gefühle wäre ein Decompiler, dasselbe kannst du aber auch bei jedem Stück regulärer Software sagen. Es ist schon ein gewaltiger Unterschied, ob jemand nachm Decompiling nur n Berg Assembler-Code hat oder ob er, wie bei JS üblich, jede einzelne Funktion mehr oder weniger im Klartext hat. Selbst nach Anwendungen eines Kompressors wie YUI kann man JS immer noch leidlich lesen und verstehen.
 
In dem Fall würde nur helfen das komplette Bild vom Server rendern zu lassen und anschließend einfach anzeigen lassen, benötigt natürlich viel rechenpower und ne schnelle Leitung. Obowohl es solche services ja schon gibt. Vlt. schafft ja die Integration von NaCL abhilfe ;)
 
Ohne es mir auch nur im geringsten angeschaut zu haben vermute ich, dass es insgesamt nicht viel anders als bei anderen Spielen läuft: Der Server ist für die gesamte Spiellogik zuständig und ist die Autorität die den Spielzustand bestimmt.
Der Client ist hauptsächlich für die Eingaben des Nutzers und das Anzeigen der (eingeschränkten) Sicht desselben zuständig.
 
Natürlich, so ist es ja immer, wenn Daten synchronisiert werden.
Aber um bei dem Beispiel Browsergame zu bleiben: Angenommen, du hast ne richtig geniale Funktion für dein Rendering geschrieben, ein neues "Carmack's Reverse". Diesen Code musst du beim Client ausführen, nicht auf dem Server. Wenn du jetzt nicht der ganzen Welt quasi im Klartext auf die Nase binden willst, wie dein Renderer funktioniert, dann musst du den Code irgendwie verbergen.
 
Javascripte für Browsergames etc. werden normalerweise durch einen Minifier und/oder Obfuscator geschickt, bevor sie auf den öffentlichen Server geladen werden. Diese Programme entfernen z. B. Kommentare, Zeilenumbrüche und Leerzeichen, oft ersetzen sie auch die Variablen- und Funktionsnamen durch bedeutungslose Bezeichner (normalerweise ein bis zwei Buchstaben lang). Das hat mehrere Zwecke: zum einen sorgt es tatsächlich dafür, dass nicht jeder mal eben in den Code schauen kann, zum anderen verkleinert es die Datei und spart so Bandbreite.

Ganz verbergen kann man den Code nicht, denn der Browser muss ihn ja bekommen, um ihn ausführen zu können - und alles, was der Browser bekommt, kann sich auch der jenige abgreifen, dem er gehört.
 
Ich schick die meisten meiner JS-Codes auch durch n yui-compressor (is ja nur n Einzeler in der Shell), das ist nix neues für mich. Trotzdem kann man aus diesem Code noch grundlegende Funktionsweisen ablesen, und zwar weit einfacher als das bei dekompiliertem Binärcode möglich wäre.
Spätestens wenn du auf Frameworks zurückgreifst kannst du z.B. schonmal nicht jeden Zugriff auf Funktionen und Klassen des Frameworks maskieren, außer du würdest das Framework GENAU so maskieren.

Und wenn ich Mercsen richtig verstanden hab und er sich nicht total verguckt hat, dann kriegt bei C&C der Browser zwar sein Script irgendwie, aber man selbst als menschlicher Code-Schnüffler findet den Kram kaum bis gar nicht.
 
Daaron schrieb:
Und wenn ich Mercsen richtig verstanden hab und er sich nicht total verguckt hat, dann kriegt bei C&C der Browser zwar sein Script irgendwie, aber man selbst als menschlicher Code-Schnüffler findet den Kram kaum bis gar nicht.

Richtig und darum geht es ja. Dass man mit einem Obfuscator den Code verschleiern kann ist ja shcön und gut, Mercsen findet aber seiner Aussage nach gar keinen Code.
Somit wird auch der Code nicht in irgendeiner Form per JavaScript-DAtei eingebunden.

Ich bleibe dabei, dass der Code per WebSockets oder ServerSentEvents an den Client geschickt wird und dort direkt per eval() ausgeführt wird. Da würde man den Code wirklich erst finden, wenn man sich richtig Mühe gibt. Man könnte ja mal eval umdefinieren, dass es die Daten auch auf der Console ausgibt.
 
Leute das halbwissen hier ist grausam

Sicherlich gibts eine .js datei :)

Die wird nur im Hintergrund geladen - am einfachsten kommt man mit Firefox und Firebug dran - mit Fiddler2 könnte man dann das ganze vom HTTP-Stream abgreifen

Das Source-File hat gute 125000 Zeilen und ist gut lesbar

z.b:

Code:
ClientLib.Vis.Region.RegionNPCBase.prototype.get_HasIncommingAttack$0=function()
{
var $createHelper;
var serverStep=ClientLib.Data.MainData.GetInstance$9().get_Time$3().GetServerStep$0();
var endStep=(this.get_LockdownEndStep$0() - ClientLib.Data.MainData.GetInstance$9().get_Server$0().get_PostCombatBlockedForNonAllianceSteps$1());
if(ClientLib.Data.MainData.GetInstance$9().get_AllianceCombatState$0().GetLockStepForTarget$0(this.get_Id$0()) == endStep)
{
endStep=(this.get_LockdownEndStep$0() - ClientLib.Data.MainData.GetInstance$9().get_Server$0().get_PostCombatBlockedForAllSteps$1());
}
if (!this.m_Obj.isAttacked)
{
return ((endStep - serverStep) > 0);
}
return true;
};

wie man das dann jedoch ordentlich bearbeitet und versteht ist eine andere Frage ;)

Das Spiel selbst besteht wie jedes andere klarerweise auch aus CLient und Server-Seite, somit hat die Client-Seite nur Status-Variablen und das ganze grafische, Berechnungen finden dann aber am großteils Server statt
 
aber die konnte ich net finden, obwohl ich alle JS datein angeschait habe die der debugger mir zeigte :-/
 

Ähnliche Themen

Zurück
Oben