Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Fremde DirectX Instanzen benutzen? (https://www.delphipraxis.net/36836-fremde-directx-instanzen-benutzen.html)

Wusel 26. Dez 2004 20:27


Fremde DirectX Instanzen benutzen?
 
Hohoho :wink:

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?
Theoretisch müsste es ja möglich sein :gruebel:


Wusel

Wusel 27. Dez 2004 21:06

Re: Fremde DirectX Instanzen benutzen?
 
Weiß keiner wenigstens einen kleinen Tipp? :( Das Fenster zu finden, in dem die Instanz drin ist, ist ja nicht das Problem. Ich muss dann nur meinetwegen an einen Pointer zu der Instanz oder zum Backbuffer oder so bekommen :|

supermuckl 27. Dez 2004 21:08

Re: Fremde DirectX Instanzen benutzen?
 
bei so einer komplizierten frage solltest du evtl mehr gedult aufbringen.. nach 30 minuten gibts sicherlich nur wenige cracks die deinen thread überflogen haben

//edit
ok ein tag mehr hab ich übersehen ;)

Dax 27. Dez 2004 21:09

Re: Fremde DirectX Instanzen benutzen?
 
Du lebst in einer temporalen Spalte :shock: Für dich ist Gestern Heute und Heute Gestern :mrgreen:

edit: Wohl doch nicht :) [end_ot]

Wusel 27. Dez 2004 21:39

Re: Fremde DirectX Instanzen benutzen?
 
@Dax: hm ... ja klar *verwirrt guck*

aber pls back to topic :?

c113plpbr 27. Dez 2004 23:28

Re: Fremde DirectX Instanzen benutzen?
 
Zitat:

Zitat von Wusel
Theoretisch müsste es ja möglich sein :gruebel:

Nicht nur in der Theorie ...
Zitat:

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 ... :twisted: ... das ist aber die absolut komplizierteste methode :zwinker:

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

Wusel 28. Dez 2004 10:38

Re: Fremde DirectX Instanzen benutzen?
 
Also das mit dem 'einfach draufzeichnen' wollt ich ja vermeiden, wegen dem flackern was du schon gesagt hast. Das API-Hooking scheint mir irgendwie ein bisschen kompliziert :gruebel:
ich hab das jetzt so verstanden, dass beim Wrapping einfach eine dll ersetzt wird, welche dann nur Zusatzcode von mir enthält. Beim Hooking muss ich diese dll aber erst injizieren, oder? In beiden Fällen müsst ich ja dann aber den Originalcode wissen *verwirrt*

c113plpbr 28. Dez 2004 13:36

Re: Fremde DirectX Instanzen benutzen?
 
Zitat:

Zitat von Wusel
ich hab das jetzt so verstanden, dass beim Wrapping einfach eine dll ersetzt wird, welche dann nur Zusatzcode von mir enthält.

Jein, da du ja ebenfalls sämtliche Funktionen exportieren musst wie dir original-dll. D.h. es ist vieeel code um nichts. Jede funktion die du exportierst verweist ja wieder auf die original-dll, nur, in manche funktionen wie z.B. in der Present-Funktion steht dann noch etwas code von dir.
Zitat:

Zitat von Wusel
In beiden Fällen müsst ich ja dann aber den Originalcode wissen *verwirrt*

Welche funktionen exportiert werden ist relativ einfach über die Headerdateien herauszufinden, genauso wie die Parameter dieser Funktionen. Daher ist es eigentlich nur viel Copy&Paste ...
Zitat:

Zitat von Wusel
Beim Hooking muss ich diese dll aber erst injizieren, oder?

Ja, aber dafür beschränkst du dich auf das abfangen von ganz bestimmten funktionen, und musst nicht alle (für dich) unwichtigen funktionen auch noch durchkauen. D.h. API-Hooking ist eine art arbeitersparnis, dafür muss man dazu aber etwas mehr wissen, als beim DLL-Wrapping. Aus diesem Grund kann ich dir API-Hooking empfehlen, denn man lernt dabei einiges, und außerdem ist es kein sinnloses copy&paste, welches du für jede DX-Version wiederholen musst ...

ciao, Philipp

Wusel 28. Dez 2004 14:11

Re: Fremde DirectX Instanzen benutzen?
 
ok, ich schau mir mal dann dieses MadCodeHook an und experimentier damit ein bisschen rum :twisted:
Nur irgendwie lassen sich alle andren Packages installieren, nur MadCodeHook nich :shock:

edit: jetzt hats doch geklappt :)

Wusel 29. Dez 2004 20:39

Re: Fremde DirectX Instanzen benutzen?
 
gleich am Anfang sorry wegen dem Doppelposting, aber sonst merkt das ja niemand, wenn ich hier was schreib.

Im MadHookCode ist auch schon ein Beispiel drin, wie man DirectX mit einer injizierten dll hookt. Das klappt auch so mit den Beispielen da für DirectX 7, 8 und 9. Bei dem Spiel, für das ich das ganze Zeug hier mache, ist aber DirectX 8.1 im Einsatz. Ich dachte zuerst, CreateDevice und so sind die gleichen Funktionen, aber falsch gedacht :| Die dll für 8.1 ist D3DX81ab.dll aber da lässt sich keine Funktion mit CreateDevice oder ähnliches finden :(
Bei DirectX 8 und 9 sind je 2 dll's, wobei eine von beiden immer so ähnlich aussieht wie die D3DX81ab.dll. Weiß einer, welche dll dann noch zu DirectX 8.1 gehört, die die CreateDevice oder Direct3DCreate Funktion enthält?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz