![]() |
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 |
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 :|
|
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 ;) |
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] |
Re: Fremde DirectX Instanzen benutzen?
@Dax: hm ... ja klar *verwirrt guck*
aber pls back to topic :? |
Re: Fremde DirectX Instanzen benutzen?
Zitat:
Zitat:
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 ![]() 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 |
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* |
Re: Fremde DirectX Instanzen benutzen?
Zitat:
Zitat:
Zitat:
ciao, Philipp |
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 :) |
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? |
Re: Fremde DirectX Instanzen benutzen?
Meines Wissens nach benutzt auch DirectX 8.1 die d3d8.dll . Die andere (D3DX81ab.dll) brauchen (seltsamerweise) nur Delphiprogramme ... :lol:
oder irre ich mich da? ciao, Philipp |
Re: Fremde DirectX Instanzen benutzen?
*den alten Kram hier wieder hochkram* :mrgreen:
Also bei meinem Problem bin ich jetzt schon ein Stückchen weiter gekommen. Die schlechte Seite: Diese Anwendung (das Spiel) ignoriert injizierte Dlls. Die gute Seite: Hab mich ein bisschen erkundigt und jemanden gefragt, der es geschafft hat das DirectX Device dieses Spiels zu benutzen. Er hat mir gesagt, dass er den IAT Table gepatcht hat, also Import Table Patching Bin jetzt auf der Suche, wie diese Liste der importierten Funktionen verändert. In der MadCollection steht auch was. Falls jemand noch empfehlenswerte Docus oder Tuts hat zum Thema Import Table Patchen (ITP) hat, kann sie gerne hier posten, ich bin sicher es wird mir helfen :) Wusel` |
Re: Fremde DirectX Instanzen benutzen?
Jetzt sag mal, was ist das denn für ein Spiel?
"Ignoriert injezierte Dlls", wie soll den das gehen? entweder ist eine dll injeziert, dann ist sie im speicher des programms, oder sie ist nicht injeziert, dann ist sie auch nicht im speicher des programms. Aber wenn sie injeziert ist, dann wird die dll-main-funktion aufgerufen, und du kannst dort code ausführen. Ignorieren geht nicht. Manche Programme können allerdings DLL-Injektionen abblocken (z.B. virenscanner, firewalls), sprich eine Injektion ist so nicht möglich. Allerdings sind manche (geschützten) Programme, wie z.B. ZoneAlarm trotzdem anfällig gegen DLL-Injektionen, und zwar gegen das automatische Injezieren, bei z.B. einem neu erstellten Prozess. D.h. wenn die dll schon vorher in alle laufenden prozesse injeziert wird, wird sie (bei madcodehook) auch in alle neuen prozesse injeziert, was bedeutet, dass du das spiel evtl. so kriegen kannst. ImportTable patchen ist warscheinlich nicht allzu schwer, allerdings verstößt eine veränderte exe-datei meist gegen die Lizenzvereinbarungen ... :roll: achja, deine letzte frage betrifft das thema dieses threads doch irgendwie nimmer, sprich, mach nen neuen thread auf, sonst findet deine frage (fast) keiner, und die richtigen "experten" können dir nicht antworten ;) ... ciao, Philipp |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz