AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Fremde DirectX Instanzen benutzen?
Thema durchsuchen
Ansicht
Themen-Optionen

Fremde DirectX Instanzen benutzen?

Ein Thema von Wusel · begonnen am 26. Dez 2004 · letzter Beitrag vom 9. Jan 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#1

Fremde DirectX Instanzen benutzen?

  Alt 26. Dez 2004, 20:27
Hohoho

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


Wusel
  Mit Zitat antworten Zitat
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#2

Re: Fremde DirectX Instanzen benutzen?

  Alt 27. Dez 2004, 21:06
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
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Fremde DirectX Instanzen benutzen?

  Alt 27. Dez 2004, 21:08
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
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Fremde DirectX Instanzen benutzen?

  Alt 27. Dez 2004, 21:09
Du lebst in einer temporalen Spalte Für dich ist Gestern Heute und Heute Gestern

edit: Wohl doch nicht [end_ot]
  Mit Zitat antworten Zitat
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#5

Re: Fremde DirectX Instanzen benutzen?

  Alt 27. Dez 2004, 21:39
@Dax: hm ... ja klar *verwirrt guck*

aber pls back to topic
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

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

Re: Fremde DirectX Instanzen benutzen?

  Alt 27. Dez 2004, 23: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
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#7

Re: Fremde DirectX Instanzen benutzen?

  Alt 28. Dez 2004, 10:38
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
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*
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

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

Re: Fremde DirectX Instanzen benutzen?

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

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#9

Re: Fremde DirectX Instanzen benutzen?

  Alt 28. Dez 2004, 14:11
ok, ich schau mir mal dann dieses MadCodeHook an und experimentier damit ein bisschen rum
Nur irgendwie lassen sich alle andren Packages installieren, nur MadCodeHook nich

edit: jetzt hats doch geklappt
  Mit Zitat antworten Zitat
Benutzerbild von Wusel
Wusel

Registriert seit: 27. Sep 2003
Ort: Riesa
54 Beiträge
 
Delphi 6 Personal
 
#10

Re: Fremde DirectX Instanzen benutzen?

  Alt 29. Dez 2004, 20:39
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 Uhr.
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