Game BOT Programmierung

Status
Für weitere Antworten geschlossen.
T

tuKKelteQUila

Gast
Aloha,

ich bin in C++ (Konsolenanwendung) schon recht gut drin und habe mich auch schön öfters mit der Windowsanwendungsprogrammieung beschäftigt.

Was ich aber noch nicht ganz nachvollziehen kann ist, wie manche Leute es schaffen einen Bot, wie zB. die ganzen MMORPG-Bots, zu programmieren.

Rein logisch ist es ja so, dass man erst einmal den Quellcode des Games haben müsste um zu sehen, welche internen Befehle notwendig sind um zB. die Figur zum Laufen zu bringen.

Außerdem versteh ich nicht, wie eine externe Anwendung einfach in das Geschehen einer anderen Anwendung eingreifen kann, obwohl diese eigentlich garkeine Verbindung untereinander aufzeigen (denke mal das gleiche Prinzip findet man auch bei etlichen Cheats vor, die man einfach starten muss und die sich direkt nach Spielstart in die Anwendung reinladen). Wie sowas machbar ist, ist für mich nicht ganz verständlich.

Da ich klein anfangen will, werd ich erst einmal versuchen per Konsolenanwendung und ohne große GUI einen simplen Bot zu erstellen, der beispielsweise nur durch den Befehl "walk" in der Konsole dann anfängt nach vorne zu laufen.

Hat jemand evtl. ein paar Tipps woher ich vielleicht eine Art Tutorial o.Ä. bekommen könnte?
Vorweg: Nein, bei Google hab ich nichts gefunden, obwohl ich mit ihm/ihr schon sehr gut befreundet bin. :)

MfG. tuKKelteQUila
 
Ich könnte mir vorstellen, dass man dafür erst die Pakete (z.B. TCP/IP), die vom Spielserver gesendet/empfangen werden, analysieren muss.
Dann kann man auch in etwa abschätzen wie man beim Programmieren vorgehen muss. Letztendlich kann man genau diese Befehle auch wieder als Pakete an den Server schicken.

Dazu müsste man aber natürlich die jeweiligen Verschlüssungen knacken ;)
 
Ah, sehr guter Ansatz.
Jetzt klärt sich bei mir im Kopf einiges. :p

Werd ich gleich mal mit meinen Programmchen testen. :)
 
So, jetzt hab ich mich mal ran gemacht und so nen kleines süßes Tool auf Ethernetpackete durchgecheckt.

Es heisst SRO Server List und ist gemacht um den Serverstatus der Silkroad Online Server auszuegeben, spricht: saximale Serverslots, verfügbare Serverslots, ect.

Hier meine Ergebnisse:

Klick

Das mag etwas verwirrend aussehen, aber wenn man das Tool kennt, wird es ein wenig logischer:

sro.jpg


Da das Tool ja nur die Aufgabe hat, die Serverdaten auszulesen, habe ich den Serverpart des Packetes genauer analysiert und aufgeteilt:

Klick

Wie du schon meintest, ist der ganze kram verschlüsselt.
Das ist ja alles noch logisch!

Was mich aber stutzig macht ist folgendes (Wegen des ASCII-Code's ist das hier ein wenig anders anzusehen, als in der eigentlichen .txt):
Aege .
.
..L... L
3501 - 3500

---

Alps .
.
..r... r
3501 - 3500

Beide Server sind vollkommen identisch, bis auf den Namen.
Wieso ist dann aber der verschlüsselte Code anders?
Ich versichere, dass der Screenshot des Programms genau in dem Moment des Packetes geschossen wurde, d.h. dass die Daten 100 pro synchron sind.

MfG. tuKKelteQUila
 
Zuletzt bearbeitet von einem Moderator:
Ich hab nicht den blassesten Schimmer :)
Hab sowas aber auch noch nie gemacht bzw. mich noch nicht damit beschäftigt.

Es gibt zahlreiche opensource Emulatoren z.B. für Daoc, Lineage oder WoW. Die Entwickler mussten ja auch auf irgendeine Art (Reverse Engineering) rausbekommen haben, wie die Netzwerkkommunikation vonstatten geht. Nur ob dir das jetzt weiterhilft ist eine andere Frage :)
 
Genau deshalb erhoffe ich mir ja ein wenig Hilfe aus diesem Forum zu erlangen. :)
 
Die Server-Emulatoren für WoW sind teilweise OpenSource da könntest du ev. mal reinschauen. Oder soll es speziell für Silkroad sein?

mfg
 
Ich hätt mich schon gefreut, wenn ich mir meinen Bot spezifisch für Silkroad programmieren könnte.

Wie gesagt, mir fehlt zZ nur das Verständnis in Bezug auf die Daten, die zum Server gelangen.

Ich meine... ich bin ja jetzt schon nen Schritt weiter: Bots schicken Packete zum Server um so ins Spielgeschehen eingreifen zu können. Das erklärt auch einiges. Leider habe ich nicht die blasseste Ahnung wie die Entwickler von ... ich nenn ma keine namen ... etlichen Bots herausgefunden haben, wie die einzelnenen ASCII-Zeichen zu verwerten sind.

Jemand da nen Ansatz?
 
Vielleicht bringt dich dieser Wiki Artikel weiter:
Sniffer
Die Hauptarbeit besteht halt im Auswerten der Pakete. Die eigentliche Botprogrammierung ist nur die Kür.

Ich würde versuchen den Datenverkehr während des Spiels aufzuzeichnen und diese Pakete auszuwerten. Die von oben waren ja nur vom Loginserver oder?
 
Stimmt schon, aber genau darum gehts ja.
Wenn es lediglich die Daten über die Serveraktivitäten sind (ob Slots frei sind oder nicht), dann wird das auswerten der eigentlichen Spielgeschehnisse viel schwerer werden, da ich erst einmal diese entschlüsseln müsste.

D.h. zuerst müsste ich rausbekommen, wie und was ich an den Server schicken muss, damit er den Bot als Spieler auch akzeptiert und wenn ich nicht mal verstehe, wie man den Serverstatus ausließt, dann mag ich mich gar nicht erst an den eigentlichen Bot wagen. :/
 
Ethernet Pakete auswerten wird dir nichts bringen. Wenn du pech hast läuft die Verbindung über SSL und du hast keine Chance den Inhalt auszuwerten. Wenn du einen Bot Programmieren willst, dann ist das auch definitiv der Falsche weg, da du sonst einen eigenen Client schreiben müsstest.
 
Eben, ich seh das wie Enigma, das wichtige am Bot ist ja zudem die Interaktion mit dem Spiel. Gerade bei WoW gibt's ja auch diverse Nachrichten intern, die sich über die Script-Sprache LUA auch auswerten lassen. Ich denke die meisten Spiel-Informationen bei WoW kann man locker über diese Sprache holen... aber mit Sicherheit sagen kann ich es nicht...
 
Erstaunlich, denn zufälligerweise weiß ich, dass es für Daoc einen auf diese Art programmierten Bot gibt bzw. gab.

Kann mir trotzdem einer einen Tipp bezüglich der Pakete geben? Werd mir die Tage (muss noch an einem anderen Projekt arbeiten) das .NET Framework genauer anschauen, da muss irgendwo was dabei sein.
 
Ich glaube nicht, dass du ohne Reverse Engineering bei "modernen" Spielen durch Sniffen der Pakete besonders viel erreichst, da diese so gut wie immer unter Verwendung starker Kryptographie verschlüsselt und signiert wurden. Du müsstest also den Key aus der Anwendung auslesen, was der Komplexität des Ganzen eine zusätzliche Dimension verleihen würde.
Müsste ich einen Bot programmieren, würde ich die Benutzereingaben durch Simulation einer Maus/Tastatur über einen Treiber vortäuschen - das hat den Vorteil geringerer Komplexität und Portierbarkeit zwischen Spielen, außerdem gibt es dazu schon genügend Beispiele - und warum das Rad ein 2. Mal erfinden? :)

Den "Input" für den Bot zu bekommen ist die tatsächliche Schwierigkeit - mein erster Ansatz wäre hier ein "blinder" Bot, welcher nur jene Daten auswertet, die der User ohnehin zu Gesicht bekommen würde (z.B. über Parsen der Logfile). Andere Möglichkeiten wäre das Durchsuchen des Speichers des "Opferprozesses" - hier kann ich dir aber kaum weiterhelfen.

BTW: Das .NET Framework kann vieles - aber definitiv *nicht* Packetsniffen. Sieh dir mal WinPCAP an, das ist der Packet Capture-Treiber für bekannte Sniffer wie Wireshark - der kann es. (Klar kann man auch einen eigenen Treiber schreiben, aber wozu?). Aufgrund oben genannter Gründe wäre Sniffing für mich in dem Fall allerdings nicht das Mittel der Wahl - probier es aber ruhig einmal aus. Evtl. ist der verwendete Verschlüsselungsalgorithmus ja auch schlampig implementiert (z.B. kein IV), dann kannst du auf sehr elegante Weise botten.

LG
Alexander
 
Das war wohl ein kleines Missverständnis: ich weiß, dass es im .NET Framework keinen Packetsniffer gibt. Es gibt aber sicherlich eine/einige Klassen um (TCP/IP-) Pakete lesen zu können (ob verschlüsselt oder nicht ist zweitrangig). Wie gesagt, habe mich damit jetzt nicht genau beschäftigt und kann's leider auch nachwievor nicht machen, da noch andere Projekte vorrangig sind im Moment .
Links zu opensource Packetsniffern habe ich mir schon vor einiger Zeit bereitgelegt um zu checken, ob sie für sowas geeignet sind.

Der interessierte Leser kann sich ja mal den Packetlogger vom DoL (dawn of light) Projekt anschauen. Sowas in der Art meinte ich :)

Gruß,
sam
 
Es gibt z.B. einen WinPcap Wrapper für C#. Pakets sniffen geht damit wunderbar...
 
mhh, ich wollte ich damit auch mal ein wenig beschäftigen. welche programmiersprache ist denn dafür am besten geeignet, java,c++? oder z.b. bei wow eher mit lua.
danke für die hilfe
 
lua ist ja nur eine Scriptsprache die oft (zB bei WoW) für Erweiterungen etc benutzt wird.

Welche ist eigentlich egal, es kommt natürlich auch darauf an wie der Bot funktionieren soll, also direkt per Netzwerk, oder Eingaben ins Spiel simulieren.
Sprachen, die das können sind wie du schon sagtest Java und C++ aber natürlich auch z.B. C, C#, VB, Pascal etc.
 
Ich denke, das ihr den falschen Ansatz wählt, die Pakete erst zu sniffen und dann noch zu interpretieren, ist denke ich nicht die Beste Lösung.
Da ein Bot ja ähnlich wie ein Trainer funktioniert, denke ich ist es sinnvoller, die Aktionen des Programmes im Prozessor zu analysieren und direkt in den Programmablauf einzugreifen.
Diesen Eingriff erreicht man, indem man immer wenn eine bestimmte Funktion, wie zum Beispiel Vorwärts laufen, im Prozessor stattfindet (wie diese Funktion in Maschinencode aussieht müsste man vorher herausfinden) eine Sprungmarke setzt, die auf einen anderen Speicherbereich zeigt, indem man nun seine Aktion ausführen kann und nach erfolg der eigenen Aktion eine Sprung zur Orginalfunktion im Prozessor durchführt.

Leider habe ich selbst so etwas noch nicht probiert, sondern kenne lediglich die theoretischen Grundlagen dafür.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben