Kommunikation mit injizierter DLL

05/26/2010 20:38 Ultimat3#1
Hey, ich hab mal ne Frage und hoffe das das hier die richtige Section ist. Ich würde ganz gerne wissen, wie man, wenn man eine DLL in einen fremden Prozess injected hat, am besten mit dieser kommuniziert. Ich würde nämlich gerne einen kleinen Multi-Speedhack mit GetTickCount hook schreiben (die DLL ist schon fertig und läuft auch), nur weiß ich nicht wie ich mit der injizierten DLL dann kommunizieren soll um z.B. die Geschwindigkeit zu regulieren. Die Geschwindigkeit in eine Datei zu speichern erscheint mir irgendwie ziemlich unsauber. Ist es irgendwie möglich, Funktionen in der injizierten DLL aufzurufen (vom externen Interface aus)? Ich code übrigens mit VC++. Hoffe auf Hilfe, jeder der etwas nützliches antwortet bekommt ein Thanks, danke schon mal im Vorraus :)
05/26/2010 20:43 Shadow992#2
Quote:
Originally Posted by Ultimat3 View Post
Hey, ich hab mal ne Frage und hoffe das das hier die richtige Section ist. Ich würde ganz gerne wissen, wie man, wenn man eine DLL in einen fremden Prozess injected hat, am besten mit dieser kommuniziert. Ich würde nämlich gerne einen kleinen Multi-Speedhack mit GetTickCount hook schreiben (die DLL ist schon fertig und läuft auch), nur weiß ich nicht wie ich mit der injizierten DLL dann kommunizieren soll um z.B. die Geschwindigkeit zu regulieren. Die Geschwindigkeit in eine Datei zu speichern erscheint mir irgendwie ziemlich unsauber. Ist es irgendwie möglich, Funktionen in der injizierten DLL aufzurufen (vom externen Interface aus)? Ich code übrigens mit VC++. Hoffe auf Hilfe, jeder der etwas nützliches antwortet bekommt ein Thanks, danke schon mal im Vorraus :)
Ich kenn mich zwar auf diesem Gebiet nicht so gut aus , aber ich würde es über eine TCP-Connection probieren , am besten an den Localhost , dann sollte es gehen ;)
05/26/2010 20:54 Akorn#3
Ansich könntest du ja den Regler mit dem du die geschwindichkeit angibst mit in die dll einbauen. Ansonsten musste dich mal über interprocess comunication informieren, die wird bei windows meist einfach mit sockets realiesiert.
05/26/2010 20:59 Ultimat3#4
Danke für eure Antworten schon mal, an eine TCP connection hatte ich auch schon gedacht. Aber wie macht es denn z.B. Cheat Engine? Diese gewaltigen Datenmengen können ja nicht einfach per TCP übertragen werden, oder? Das Beste wäre imo wirklich, wenn es eine Möglichkeit gäbe, Funktionen in der injizierten Instanz der DLL aufrufen zu können. Weiß jemand, ob sowas möglich ist?
05/27/2010 04:19 P-a-i-n#5
das geht ganz einfach wenn dein timer eine zeit hat
machst int a = 100; z.B a ist dann die zeitangabe für die sekunden bzw millisekunden
dann könntest du per hotkey die zeit hochsetzen
so hier z.B#
if (GetKeyState(VK_F12)<0)a++ ; zum hochsetzen

if (GetKeyState(VK_F11)<0)a--; zum runtersetzen

nachteil man sieht nicht wie hoch oder tief die zeit eingestellt wird
aber wenn du was mit DX hast kannst du die zeit ausgeben lassen

das würde dann so aussehen

DeinFunktionZumStringsZeichnen(10, 10, D3DCOLOR_ARGB(255, 255, 0, 0 ),Front,"Zeit: %d", a )

aber wie du es machst mußt du wissen gibt viele wege der einfachste find ich ist die zeit in eine ini bzw config zu schreiben ;)
05/27/2010 11:41 xNopex#6
[Only registered and activated users can see links. Click Here To Register...]

Tutorial zu Interprozesskommunikation
05/27/2010 15:07 Ultimat3#7
Ein DX Hook würde mich wieder auf eine bestimmte DX Version festlegen und Hotkeys find ich persönlich auch nicht so toll. Die Idee mit den Pipes finde ich sehr gut, danke, hast mir sehr geholfen, xNopex :) Kann closed werden ^^
05/27/2010 16:41 Bot_interesierter#8
Es gibt noch die Möglichkeit einer shared section
[Only registered and activated users can see links. Click Here To Register...]
Das ist wohl die schnellste Methode für IPC
Dabei teilt jede Instanz der DLL sich die Shared Section, also ist es über diese Möglich zwischen den Instanzen der DLL Daten zu transferieren, das Prinzip ist eigentlich das Gleiche wie bei den Pipes, nämlich das ein Buffer zwischen mehreren Prozessen geteilt wird, nur kommt man mit einer Shared Section ohne Windows API calls aus und kann die Kommunikation damit günstiger Implementieren als über Pipes, allerdings ist das mit etwas mehr Aufwand verbunden als das Verwenden von Pipes.
Wenn du ein Bespiel für Shared Memory suchst, dann schau dir den Source Code von WoW!Sharp an, die DLL welche WoW!Sharp in WoW injizierte benutzt Shared Memory für die Kommunikation mit dem C# teil des bots, allerdings ist das nicht Optimal implementiert, wenn man das so macht wie WoW!Sharp ist es nur möglich eine DLL auf einmal zu Injekten.
05/28/2010 18:21 ilovenoodles#9
CreateFileMapping
MapViewOfFile
memcpy
05/29/2010 07:51 buFFy!#10
NamedPipes
GUIMessages

Denke mal Pipes sind da am schnellsten
05/29/2010 19:39 schlurmann#11
Wenn du sowieso hookst bietet sich ein ingame GUI an. Ist leicht zu realisieren und macht es sowohl für dich als auch den Benutzer einfacher.
05/30/2010 17:39 Ultimat3#12
Danke für eure Antworten, hab mich jetzt für Named Pipes entschieden, reicht für mein Vorhaben vollkommen aus ^^
05/31/2010 00:26 MrSm!th#13
Ich würd sagen Pipes, FileMappings (sind doch auch für inter process communication oder?) oder auch Messages.

Gibt ja WM_DATA oder so als Messagetyp.

Da wäre auch noch die sehr unflexible, unelegante nooblike Version mit einer gemeinsam genutzten Datei (ini, txt oder sonst was), würde ich aber nich empfehlen ;D

TCP halte ich dafür auch nicht so besonders, auch wenn es sich mit dem Localhost verbindet, meckert in dem Falle normalerweise die Firewall.

Quote:
Danke für eure Antworten schon mal, an eine TCP connection hatte ich auch schon gedacht. Aber wie macht es denn z.B. Cheat Engine? Diese gewaltigen Datenmengen können ja nicht einfach per TCP übertragen werden, oder? Das Beste wäre imo wirklich, wenn es eine Möglichkeit gäbe, Funktionen in der injizierten Instanz der DLL aufrufen zu können. Weiß jemand, ob sowas möglich ist?
CE kommuniziert glaube ich per FileMappings oder Pipes...denke mal eher Pipes, da es schneller geht.