Einzelnen Beitrag anzeigen

Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Fremde DirectX Instanzen benutzen?

  Alt 28. Dez 2004, 00:28
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
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat