Zitat von
Wusel:
Theoretisch müsste es ja möglich sein
Nicht nur in der Theorie ...
Zitat von
Wusel:
Kann mir jemand irgendwie erklären oder 'nen Tipp geben, wie ich auf DirektX Instanzen von anderen Programmen zugreifen kann? Also sowohl davon etwas zu lesen, als auch selber zB Text hinein zu schreiben?
Ok, ich versuch dir mal die Grundlagen davon zu erklären ...
Die einfachste (und auch schlechteste
) Methode Text in ein Spiel einzublenden, ist einfach in sehr kurzen abständen per z.B. TextOut auf den
DC des Spiels zu zeichen. Das größte Problem dabei ist, dass der Text flimmert, weil das zeichen eines neuen Frames nicht synchron zum zeichnen des Textes abläuft.
Das bedeutet, dass du nicht nur einfach so drauflos zeichnen kannst, sondern, du musst es auch noch im richtigen moment tun. Nun, bei
DirectX 8-9 wird durch den Aufruf der Present-Funktion ein neuer Frame gezeichnet (bei
DirectX 7 geschieht das durch den Aufruf der Flip-Funktion).
Außerdem benötigst du in allen fällen einen Pointer zum IDirect3DDevice, wenn du etwas mit
DirectX eigenen Funktionen zeichnen willst.
Aber all dies nutzt dir nichts, wenn du keinen eigenen, ausführbaren Code in der Fremd-Anwendung hast, denn über Prozessgrenzen hinweg werden Funktionsaufrufe (welche du z.B. um Text anzuzeigen benötigst) sehr kompliziert, wenn nicht unmöglich.
Für dieses Problem gibt es nun 2 (mir bekannte) Lösungsansätze:
DLL-Wrapping und
API-Hooking/
DLL-Injection
Beim
DLL Wrapping erstellst du eine
DLL, welche exakt die selben Funktionen, welche z.B. die d3d9.dll exportiert, ebenfalls exportiert. Die Original-
DLL wird dann durch deine "fake"-
DLL ersetzt, wobei die "Fake"-Funktionen deiner
DLL die Original-Funktionen aus der (umbenannten) originalen d3d9.dll aufrufen. Nun musst du nurnoch irgendwo in deiner "Fake"-Present-Funktion Code unterbringen (vor dem aufruf der originalfunktion), welcher dann z.B. Text auf den (an die Present-Funktion übergebenen) Backbuffer zeichnet.
Das Spiel läd dann hinterher deine
DLL anstatt der originalen, und ruft auch deine Funktionen auf, welche dann einfach die originalfunktionen aus der umbenannten originaldll aufrufen, wobei aber bei manchen noch dein eigener Code ausgeführt wird.
Diese Methode funktioniert zwar, ist aber sehr (zeit-)aufwendig zu programmieren, und funktioniert bei einer neueren/älteren
DirectX-Version schon nichtmehr korrekt.
Beim
API-Hooking wird eine Funktion durch verändern von verschiedenen Adressen im Speicher eines Prozesses durch eine andere (eigene) Funktion ersetzt. In fremden Prozessen funktioniert das natürlich nur dann, wenn sich diese Funktion im prozesseigenen Speicher befindet. Daher wird eine
DLL zuerst in den Speicher des fremden Prozesses "injeziert" (der Prozess wird dazu "gezwungen" die
DLL zu laden), welche dann diese Funktionen "ersetzt".
Allerdings muss man recht viel von der Struktur eines Interfaces verstehen, damit man diese Funktion(en) auch Hooken kann.
Diese Methode ist etwas komplizierter, dafür aber "klüger", und auf jedenfall empfehlenswerter.
Falls du diese Methode verwenden willst, kann ich dir die MadCodeHook-Library empfehlen, die es in der MadCollection auf
http://www.madshi.net/ für nichtkommerzielle zwecke kostenlos (ohne source) zum download gibt. Da ist dann alles, von
API-Hooking bis zur
DLL-Injektion mit einigen Beispielen drin.
Ok, mir fällt noch ne methode ein: Du schreibst einen Treiber ...
... das ist aber die absolut komplizierteste methode
Zum Thema "lesen" hab ich da aber relativ wenig ahnung. Kommt natürlich ganz draufan was du lesen willst, bzw. wie das wo gespeichert ist, aber da sollten normale "Trainer"-Methoden ausreichen, sprich die Adressen im Speicher ausfindig machen, und dann z.B. per ReadProcessMemory auslesen.
Warum schreib ich zu diesem Thema eigentlich immer mega-posts?!? Und bin ich hier eigentlich der einzige, der sich mit diesem Thema etwas auskennt?
Ich hoffe, dass dies dir weitergeholfen hat ... wenn nicht, dann benutze mal die suche, ich z.B. hab zu diesem Thema schon mehrere Posts verfasst ...
ciao, Philipp