Pakete senden mit AutoIT

08/12/2017 04:47 Florian.K#1
Kann mir jemand sagen, ob es möglich ist Pakete mit AutoIT zu senden (Geht um das Spiel NosTale)
Gibt es dafür nen tutorial oder kann mir jemand vllt sagen wie es ausschauen müsste?

MfG !:)
08/12/2017 04:58 warfley#2
Ja es sollte problemlos möglich sein.

Spiele verwenden meist UDP zum kommunizieren (oftmals noch tcp für den Chat oder andere Teile die eine zuverlässige Datenübertragung benötigen).

Auf die schnelle habe [Only registered and activated users can see links. Click Here To Register...] gefunden, keine Ahnung ob es was taugt.
08/12/2017 15:29 BladeTiger12#3
Aber NosTale nutzt TCP.
Es sind auch schon viele Snippets für C++ Online, wie man Packete sendet & Empfängt.
Auch die Hooks in denen alle Send/Recv Packete geloggt werden können.
08/12/2017 15:59 warfley#4
Quote:
Originally Posted by BladeTiger12 View Post
Aber NosTale nutzt TCP.
Es sind auch schon viele Snippets für C++ Online, wie man Packete sendet & Empfängt.
Auch die Hooks in denen alle Send/Recv Packete geloggt werden können.
Naja wenn es sich um TCP handelt ist es etwas komplizierter, aber nicht unmöglich.
Bei TCP werden Verbindungen an Sockets gebunden, wenn du nun also Pakete in der selben Verbindung wie ein Spiel senden willst, benötigst du eine Kopie des Socket Deskriptors. Das benötigt etwas arbeit mit der Windows API, und ist außerdem nicht vollständig in AutoIt möglich. [Only registered and activated users can see links. Click Here To Register...]

Das Problem ist, unter Windows sind Sockets Prozessgebunden, und um ein Socket zu kopieren, muss die WinAPI funktion DuplicateSocket aus dem Ursprungsprozess aufgerufen werden. Das könntest du darüber realisieren, dass du in einer nicht interpretierten Sprache (z.B. C) eine DLL schreibst, welche du in den Prozess lädst, und die dann DuplicateSocket ausführt, und den neuen Deskriptor dann in eine Datei schreibst. Den kannst du dann mit Autoit auslesen, und dann mittels [Only registered and activated users can see links. Click Here To Register...] die Pakete senden.

Das Hauptproblem wird aber sein das TCP gesichert ist, und daher Protokolle die auf TCP aufbauen meist so designet werden, dass sie mit unerwarteten Paketen nicht zurecht kommen. Außerdem beim lesen hast du dann das Problem der Gleichzeitigkeit der Prozesse. Es ist mehr oder weniger Glückssache ob dein Prozess vor dem Spiel die Daten abruft (da diese aus dem Netzwerkpuffer entfernt werden sobald sie gelesen wurden)

Deutlich einfacher statt also blind Pakete drauf los zu senden wäre es den Informationsfluss zu alternieren. Das wäre u.a. möglich durch das überschreiben der Senderoutine im Hostprozess durch eine eigene Funktion. Allgemein auch als Hooking bezeichnet (auch wenn ich diesen Ausdruck nicht mag). Das hat den Vorteil das dein Programmcode im Prozesskontext des Hostprozesses läuft, du also Vollzugriff auf den Virtuellen Speicher des Prozesses hast. Der Nachteil ist allerdings, dass ein entsprechender Anticheat das recht leicht erkennen kann. Außerdem ist das in AutoIt nicht direkt möglich, sondern benötigt auch wieder eine nicht Interpretierte Sprache.

Eine weitere Möglichkeit wäre es die Daten durch einen Proxy zu senden, welcher die Daten vom Spiel empfängt, analysiert, möglicherweise moduliert, und dann zum eigentlichen Server sendet. Das wäre zwar grundsätzlich in AutoIt möglich, und eigentlich recht leicht, allerdings hat auch diese Methode ein Problem. Wenn die Verbindung verschlüsselt ist, kann das ganze relativ schnell sehr schwer werden. Angenommen die Schlüssel werden über einen Typischen RSA zertifizierten Schlüsseltausch ausgetauscht. Dieser ist grundsätzlich zwar für einen man-in-the-middle Angriff angreifbar, indem du selbst einen Schlüsseltausch mit dem Server (mit dem eigenen RSA Zertifikat) durchführst, und dann einen Separaten mit dem Klienten (mit deinem eigenen RSA Zertifikat), und holst dir dann für jede Verbindung ein eigenes Passwort.
Wenn jetzt das ganze noch durch eine Trustet Authority zertifiziert wird, hast du erst mal damit keine Chance. Dann müsst du die TA überprüfung im Hostprozess umgehen, und dann ist die vorhin benannte Methode des Hookings widerum schon wieder einfacher (da du auch dann mit AutoIt nicht weit kommst)
08/13/2017 10:37 BladeTiger12#5
@warfley: Wie gesagt^^ Ist mittlerweile alles Online. Wie das bei NosTale funktioniert ist auch ganz einfach. Die Cryption ist Online und auch sehr einfach gehalten ein Schlüsselaustausch findet nicht statt. Selbst die Packete kann man mit dem reinen Auge lesen, nach dem decrypten natürlich. Es sind einfach "string" die umhergesendet werden und mit Space getrennt werden.

Falls du nur Packete senden willst, hat dir @Warfley eine Möglichkeit genannt. Aber sehr aufwändig. Deswegen würde ich dir eigtl. raten, dass du es direkt in einer am Besten .Dll schreibst und die Funktionen direkt aufrufst. Natürlich könntest du auch einfach die Bytes von einer Funktion in den anderen Prozess schreiben, den String irgendwohin speichern und mit CreateRemoteThread diese Aufrufen. Ist aber auch aufwändig. Damit könntest du aber auf jeden Fall einfacher Packete senden. Recv' wäre damit vieel zu aufwändig.
08/13/2017 11:58 Shadow992#6
Quote:
Originally Posted by BladeTiger12 View Post
@warfley: Wie gesagt^^ Ist mittlerweile alles Online. Wie das bei NosTale funktioniert ist auch ganz einfach. Die Cryption ist Online und auch sehr einfach gehalten ein Schlüsselaustausch findet nicht statt. Selbst die Packete kann man mit dem reinen Auge lesen, nach dem decrypten natürlich. Es sind einfach "string" die umhergesendet werden und mit Space getrennt werden.

Falls du nur Packete senden willst, hat dir @Warfley eine Möglichkeit genannt. Aber sehr aufwändig. Deswegen würde ich dir eigtl. raten, dass du es direkt in einer am Besten .Dll schreibst und die Funktionen direkt aufrufst. Natürlich könntest du auch einfach die Bytes von einer Funktion in den anderen Prozess schreiben, den String irgendwohin speichern und mit CreateRemoteThread diese Aufrufen. Ist aber auch aufwändig. Damit könntest du aber auf jeden Fall einfacher Packete senden. Recv' wäre damit vieel zu aufwändig.
Entweder das oder man bemüht einfach einmal Google, findet damit eine schöne UDF/Library vom guten Shadow und ein passendes Beispiel in Nostale. :D

Ist zwar zu 99% so nicht mehr funktionstüchtig, aber das Prinzip hat sich seit es Computer gibt nicht/kaum verändert von daher: Probiers aus!

Thread: [Only registered and activated users can see links. Click Here To Register...]

Edit:
Auch wenn das erst einmal nur Loggen ist, funktioniert das Senden natürlich ähnlich, Sende-Funktion überschreiben/hooken oder alternativ die Values richtig in die Packet-Arrays, Socket-Buffer u.ä. schreiben.
08/13/2017 13:37 BladeTiger12#7
Quote:
Originally Posted by Shadow992 View Post
Entweder das oder man bemüht einfach einmal Google, findet damit eine schöne UDF/Library vom guten Shadow und ein passendes Beispiel in Nostale. :D

Ist zwar zu 99% so nicht mehr funktionstüchtig, aber das Prinzip hat sich seit es Computer gibt nicht/kaum verändert von daher: Probiers aus!

Thread: [Only registered and activated users can see links. Click Here To Register...]

Edit:
Auch wenn das erst einmal nur Loggen ist, funktioniert das Senden natürlich ähnlich, Sende-Funktion überschreiben/hooken oder alternativ die Values richtig in die Packet-Arrays, Socket-Buffer u.ä. schreiben.
Stimmt :D. Da war ja mal was. Das habe ich damals auch benutzt. Ziemlich nützlich und einfach zu verwenden. Aber daran habe ich jetzt gar nicht mehr gedacht. Wird auf jeden Fall noch funktionieren, wenn man die Patterns anpasst.