|
You last visited: Today at 07:48
Advertisement
D3D9.dll - VTable
Discussion on D3D9.dll - VTable within the General Coding forum part of the Coders Den category.
01/27/2012, 08:49
|
#16
|
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
|
die neuere ida versionen kommen nich mit alten debug infos klar (sind überhaupt welche in der d3d9.dll?)
|
|
|
01/27/2012, 12:03
|
#17
|
elite*gold: 0
Join Date: Aug 2011
Posts: 10
Received Thanks: 0
|
Nene, in der D3D9.dll sowieso nicht. Aber IDA versucht (optional) beim Analysieren Symbole von Microsoft herunterzuladen, falls verfügbar...
Aber du meinst also, dass es auf jeden Fall an IDA liegt?
Weil weder Pro 6.0 noch, Free 4.9 liefern mir passende Ergebnisse...
|
|
|
01/27/2012, 16:21
|
#18
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Was hier für ein Müll verbreitet wird..
1. Die EndScene ist virtuell, sie wird nicht und kann auch nicht exportiert werden
2. Die VTable IST am Anfang des Device! Allerdings dereferenzierst du falsch.
3. Pain du laberst Mist. Über Direct3DCreate9 wird gar nichts gezeichnet, das ist eine Initialisierungsfunktion. Ich glaube, ich weiß, was du meinst und damit lägest du richtig (auch wenn es ein absoluter overkill wäre), aber BITTE lern endlich, dich gescheit auszudrücken! Auch Deutschnachhilfe wäre nicht verkehrt.
|
|
|
01/27/2012, 16:23
|
#19
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
urgh, dann liegt die vtable doch am anfang der device, dann hab ich beim testen mist gebaut...
dachte doch...
probier ich nachher nochmal^^
|
|
|
01/27/2012, 18:03
|
#20
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Kleine Korrektur zum vorherigen Post:
@TE: Du hast doch richtig dereferenziert, ich hatte nen kleinen Denkfehler.
(geht nun auch an ***)
Die VTable wird von VisualStudio (und den meisten anderen Compilern auch) durch ein simples Array mit den Funktionsadressen realisiert.
Für jede virtuelle Funktion gibt es einen Eintrag und für jede Klasse, die von der Oberklasse abgeleitet wird, gibt es eine eigene Table.
Natürlich hat nicht jedes Objekt die Table selbst, sondern das erste Element ist nur ein Pointer auf jene (dein Doppelpointer hat mich erst verwirrt).
Da DX im Grunde nur auf virtuelle Funktionen setzt, um so die Implementierung zu verstecken, gibt es in einer Dll für ein bestimmtes System auch nur eine einzige Klasse, die abgeleitet wird und dementsprechend eine andere VTable hat, als die Basisklasse (welche in dem Fall gar keine hat, da sie abstrakt ist und keine ihrer Methoden definiert).
Diese ist aber, wie gesagt, nur in der Dll verfügbar.
Außerhalb ist sie gar nicht bekannt, man kennt ja schließlich auch nicht die Deklaration (nur die der Basisklasse), da wird also auch nichts exportiert.
Das einige Debugger und Analyse Tools die Namen anzeigen können, hat andere Gründe.
Schaut mal in die Export Table. Die virtuellen Methoden wie EndScene werden nicht exportiert (was auch gar nicht möglich ist).
Nur eine Funktion, die einem einen Pointer auf ein Direct3D9 Objekt liefert (oder ein Objekt, das von diesem abgeleitet ist) und mit diesem kann man wiederum ein Device erstellen, welches die Methode EndScene anbietet - via VTable - ein Export ist gar nicht notwendig.
Das was Pain vermutlich auch meinte, ist die Technik, die Methode D3DCreate9 oder so zu hooken und dann wiederum die CreateDevice Methode zu hooken, um dann den Device Pointer abzufangen.
Dann könnte man entweder, wie es der TE versucht, direkt die VTable patchen und die eigene Adresse einfügen (was einige auch tun, es ist also möglich ;O) oder ein komplett eigenes Dummy Device zurückgeben, welches alle Methodenaufrufe einfach an das originale weiterleitet, bis auf die, die man hooken möchte.
Das macht aber wie gesagt zu viel Arbeit und bringt mehr Nachteile als Vorteile.
Und weiterhin wird mit der Methode D3DCreate9 nicht gezeichnet ;O
|
|
|
01/27/2012, 18:22
|
#21
|
elite*gold: 0
Join Date: Aug 2011
Posts: 10
Received Thanks: 0
|
Ah, da kommt doch Licht an die Sache
Der Code stimmt, das er nicht funktioniert liegt einfach daran, dass es ein wenig spät war als ich das Device im Speicher gesucht habe
BTW: Was ist die gängiste bzw. erfolgreichste bzw. aktuellste Methode um z.B. EndScene zu hooken?
|
|
|
01/27/2012, 21:07
|
#22
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Gängigste und erfolgreichste sicherlich FindPattern, dazu ist man damit am flexibelsten.
Dafür können Anti-Cheats es am einfachsten detecten und in seltenen Fällen geht es nicht.
Die CreateDevice Hook Methode ist schwerer zu erkennen, ist aber sehr viel aufwändiger und muss durchgeführt werden, bevor das Device erstellt wurde!
Pointer Hooks (sprich den VTable Pointer oder die Pointer in der VTable zu modifizieren) sind auch schwer zu detecten, aber die hatten andere Nachteile, welche mir gerade nicht einfallen :f
|
|
|
01/28/2012, 02:13
|
#23
|
elite*gold: 0
Join Date: Aug 2011
Posts: 10
Received Thanks: 0
|
Ich denke den VTable zu modifizieren, ist eine saubere Lösung. Der Nachteil wird wahrscheinlich der Aufwand sein das Device im Spiel zu finden...daran hab ich mir schon die Zähne ausgebissen... :/
|
|
|
01/28/2012, 02:27
|
#24
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Ähm...Search Pattern?
Die andere Variante wäre die bereits erwähnte Variante mit dem Hook von Direct3DCreate9.
|
|
|
01/28/2012, 13:30
|
#25
|
elite*gold: 0
Join Date: Nov 2009
Posts: 1,258
Received Thanks: 396
|
Kann sein das die Rechtschreibung nicht die beste war ist eben so wenn man 11 Stunden arbeiten war da hat die Konzentration gelitten, es gibt eben auch Leute die arbeiten gehen und nicht nur abhartzen.
Aber klar geht man auf Direct3DCreate9 ist nur das Adapterstück für alles man brauch ja den DevicePointer der ist ja für alles zuständig.
Da ist es recht gut beschrieben.
Ich bin eben kein verkackter Dozent der es gut erklären kann.
Man braucht den DeviePointer ja nicht mal suchen da gibt es sehr gute Beispiele mit Source, ist dann eben der V-Table Hook, auch der beste in meinen Augen wenn man mehr als nur die EndScene brauch ist man ja nur am Pattern.
Vorteile bei dem V-tables man brauch keine Adresse und kein Pointer da alles selbstständig geholt wird.
2 Bsp.
Der cleane

Der fertige
Und mir kann keiner sagen das es noch leichter geht.
|
|
|
01/28/2012, 18:00
|
#26
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Du brauchst doch nur einmal nach der VTable suchen, dann kannst du jede Funktion des Device hooken Oo
Quote:
|
Aber klar geht man auf Direct3DCreate9 ist nur das Adapterstück für alles man brauch ja den DevicePointer der ist ja für alles zuständig.
|
Trotzdem wird über diese Funktion nicht gezeichnet und in ihr kann man auch nichts zeichnen.
Deine nervigen Bemerkungen zu Hartz4 kannst du dir sparen, Arbeit ist keine Entschuldigung dafür.
|
|
|
08/06/2013, 12:48
|
#27
|
elite*gold: 0
Join Date: Aug 2013
Posts: 1
Received Thanks: 0
|
Der Thread ist zwar schon etwas älter aber ich habe dennoch mal eine Frage.
Ich hantiere mit einer dx9 engine herum.
Dort kann ich beim programmieren den Pointer auf die dx9 device bekommen.
Wie müsste ich eine lib/dll beginnen um mittels dieses pointers in dem jeweiligen dx9 fenster zu agieren?
Es soll eine 2D lib werden, da ich einiges an Funktionen brauche die dort nicht implementiert sind.
|
|
|
08/06/2013, 20:49
|
#28
|
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
|
Quote:
Originally Posted by _______________
Hm... ja gut, ist im prinzip die Pattern Methode...
Was ich nun gern wissen würde, wie dieser
Code:
if ( (*(BYTE *)(Base+i+0x00))==0xC7
&& (*(BYTE *)(Base+i+0x01))==0x06
&& (*(BYTE *)(Base+i+0x06))==0x89
&& (*(BYTE *)(Base+i+0x07))==0x86
&& (*(BYTE *)(Base+i+0x0C))==0x89
&& (*(BYTE *)(Base+i+0x0D))==0x86 )
return (DWORD_PTR *)(Base + i + 2);
Teil zusammen gekommen ist (0x06, 0x89, 0x68, ...). Klar, da wird nach einem Muster gesucht, welches der VTable in der D3D9.dll ist... aber wie könnte ich das Muster finden, bzw. woher weiß ich, dass ich genau nach DEM Muster suchen muss...muss ich wirklich die gesammte DLL reversen?
BTW: Hab das Forum wiedergefunden, woher ich meine Methode hatte:
Gruß
|
Nein, das ist nicht die VTable. Die kannst du nicht über ein Pattern finden. Nicht zuverlässig zumindest. Das was du da siehst ist ein Konstruktor der sachen zu 0 initialisiert und _vfptr setzt (also virtual function pointer, das was du suchst). Soweit ich weiß ist dieses oft genutzte Pattern der Konstruktor von CD3DBase. Sieht so aus auf Windows 7:
Du musst eigentlich nur von IDirect3D9::CreateDevice zurückgehen, schauen wo der Konstruktor der Basisklasse CD3DBase aufgerufen wird. Als Programmierer weißt du dann ja automatisch das da _vfptr gesetzt werden muss.
Eine andere Möglichkeit EndScene zu finden wäre über Symbole. Microsoft stellt da fürs debuggen Symboldateien bereit, die du über dbghelp benutzen könntest um die Funktion zu finden.
Das alles klappt aber nur weil EndScene nicht wirklich eine virtuelle Funktion ist. Wäre das so müsstest du anders vorgehen, dann könnte die Funktion für jede erstellte Device anders aussehen weil je nach Settings ein anderer Konstruktor verwendet werden könnte. Auf Windows 8 wird da z.T. auch oft ein Wrapper vor die Reset Funktion geschoben. Nicht nur bei IDirect3DDevice9Ex.
Hups eben gesehen, dass ich auf einen Necro-Thread antworte. Naja ich wars nicht.
|
|
|
08/07/2013, 18:08
|
#29
|
elite*gold: 1
Join Date: Mar 2011
Posts: 828
Received Thanks: 1,395
|
Fals es jemand benötigt, hier eine Liste mit sämtlichen VTable Indizes des IDirect3DDevice9 Interfaces:
Code:
const
VTD3D9_QUERYINTERFACE = 0;
VTD3D9_ADDREF = 1;
VTD3D9_RELEASE = 2;
VTD3D9_TESTCOOPERATIVELEVEL = 3;
VTD3D9_GETAVAILABLETEXTUREMEM = 4;
VTD3D9_EVICTMANAGEDRESOURCES = 5;
VTD3D9_GETDIRECT3D = 6;
VTD3D9_GETDEVICECAPS = 7;
VTD3D9_GETDISPLAYMODE = 8;
VTD3D9_GETCREATIONPARAMETERS = 9;
VTD3D9_SETCURSORPROPERTIES = 10;
VTD3D9_SETCURSORPOSITION = 11;
VTD3D9_SHOWCURSOR = 12;
VTD3D9_CREATEADDITIONALSWAPCHAIN = 13;
VTD3D9_GETSWAPCHAIN = 14;
VTD3D9_GETNUMBEROFSWAPCHAINS = 15;
VTD3D9_RESET = 16;
VTD3D9_PRESENT = 17;
VTD3D9_GETBACKBUFFER = 18;
VTD3D9_GETRASTERSTATUS = 19;
VTD3D9_SETDIALOGBOXMODE = 20;
VTD3D9_SETGAMMARAMP = 21;
VTD3D9_GETGAMMARAMP = 22;
VTD3D9_CREATETEXTURE = 23;
VTD3D9_CREATEVOLUMETEXTURE = 24;
VTD3D9_CREATECUBETEXTURE = 25;
VTD3D9_CREATEVERTEXBUFFER = 26;
VTD3D9_CREATEINDEXBUFFER = 27;
VTD3D9_CREATERENDERTARGET = 28;
VTD3D9_CREATEDEPTHSTENCILSURFACE = 29;
VTD3D9_UPDATESURFACE = 30;
VTD3D9_UPDATETEXTURE = 31;
VTD3D9_GETRENDERTARGETDATA = 32;
VTD3D9_GETFRONTBUFFERDATA = 33;
VTD3D9_STRETCHRECT = 34;
VTD3D9_COLORFILL = 35;
VTD3D9_CREATEOFFSCREENPLAINSURFACE = 36;
VTD3D9_SETRENDERTARGET = 37;
VTD3D9_GETRENDERTARGET = 38;
VTD3D9_SETDEPTHSTENCILSURFACE = 39;
VTD3D9_GETDEPTHSTENCILSURFACE = 40;
VTD3D9_BEGINSCENE = 41;
VTD3D9_ENDSCENE = 42;
VTD3D9_CLEAR = 43;
VTD3D9_SETTRANSFORM = 44;
VTD3D9_GETTRANSFORM = 45;
VTD3D9_MULTIPLYTRANSFORM = 46;
VTD3D9_SETVIEWPORT = 47;
VTD3D9_GETVIEWPORT = 48;
VTD3D9_SETMATERIAL = 49;
VTD3D9_GETMATERIAL = 50;
VTD3D9_SETLIGHT = 51;
VTD3D9_GETLIGHT = 52;
VTD3D9_LIGHTENABLE = 53;
VTD3D9_GETLIGHTENABLE = 54;
VTD3D9_SETCLIPPLANE = 55;
VTD3D9_GETCLIPPLANE = 56;
VTD3D9_SETRENDERSTATE = 57;
VTD3D9_GETRENDERSTATE = 58;
VTD3D9_CREATESTATEBLOCK = 59;
VTD3D9_BEGINSTATEBLOCK = 60;
VTD3D9_ENDSTATEBLOCK = 61;
VTD3D9_SETCLIPSTATUS = 62;
VTD3D9_GETCLIPSTATUS = 63;
VTD3D9_GETTEXTURE = 64;
VTD3D9_SETTEXTURE = 65;
VTD3D9_GETTEXTURESTAGESTATE = 66;
VTD3D9_SETTEXTURESTAGESTATE = 67;
VTD3D9_GETSAMPLERSTATE = 68;
VTD3D9_SETSAMPLERSTATE = 69;
VTD3D9_VALIDATEDEVICE = 70;
VTD3D9_SETPALETTEENTRIES = 71;
VTD3D9_GETPALETTEENTRIES = 72;
VTD3D9_SETCURRENTTEXTUREPALETTE = 73;
VTD3D9_GETCURRENTTEXTUREPALETTE = 74;
VTD3D9_SETSCISSORRECT = 75;
VTD3D9_GETSCISSORRECT = 76;
VTD3D9_SETSOFTWAREVERTEXPROCESSING = 77;
VTD3D9_GETSOFTWAREVERTEXPROCESSING = 78;
VTD3D9_SETNPATCHMODE = 79;
VTD3D9_GETNPATCHMODE = 80;
VTD3D9_DRAWPRIMITIVE = 81;
VTD3D9_DRAWINDEXEDPRIMITIVE = 82;
VTD3D9_DRAWPRIMITIVEUP = 83;
VTD3D9_DRAWINDEXEDPRIMITIVEUP = 84;
VTD3D9_PROCESSVERTICES = 85;
VTD3D9_CREATEVERTEXDECLARATION = 86;
VTD3D9_SETVERTEXDECLARATION = 87;
VTD3D9_GETVERTEXDECLARATION = 88;
VTD3D9_SETFVF = 89;
VTD3D9_GETFVF = 90;
VTD3D9_CREATEVERTEXSHADER = 91;
VTD3D9_SETVERTEXSHADER = 92;
VTD3D9_GETVERTEXSHADER = 93;
VTD3D9_SETVERTEXSHADERCONSTANTF = 94;
VTD3D9_GETVERTEXSHADERCONSTANTF = 95;
VTD3D9_SETVERTEXSHADERCONSTANTI = 96;
VTD3D9_GETVERTEXSHADERCONSTANTI = 97;
VTD3D9_SETVERTEXSHADERCONSTANTB = 98;
VTD3D9_GETVERTEXSHADERCONSTANTB = 99;
VTD3D9_SETSTREAMSOURCE = 100;
VTD3D9_GETSTREAMSOURCE = 101;
VTD3D9_SETSTREAMSOURCEFREQ = 102;
VTD3D9_GETSTREAMSOURCEFREQ = 103;
VTD3D9_SETINDICES = 104;
VTD3D9_GETINDICES = 105;
VTD3D9_CREATEPIXELSHADER = 106;
VTD3D9_SETPIXELSHADER = 107;
VTD3D9_GETPIXELSHADER = 108;
VTD3D9_SETPIXELSHADERCONSTANTF = 109;
VTD3D9_GETPIXELSHADERCONSTANTF = 110;
VTD3D9_SETPIXELSHADERCONSTANTI = 111;
VTD3D9_GETPIXELSHADERCONSTANTI = 112;
VTD3D9_SETPIXELSHADERCONSTANTB = 113;
VTD3D9_GETPIXELSHADERCONSTANTB = 114;
VTD3D9_DRAWRECTPATCH = 115;
VTD3D9_DRAWTRIPATCH = 116;
VTD3D9_DELETEPATCH = 117;
VTD3D9_CREATEQUERY = 118;
|
|
|
 |
|
Similar Threads
|
[Tutorial] Hooking, Detours, VTable etc.
08/21/2018 - Coding Tutorials - 5 Replies
Da man öfters hier im Forum die Frage aufkommen sieht "Wie male ich etwas auf ein Spiel" und "Wie sende ich Tastendrücke an mein spiel?!?111"
Präsentiere ich hiermit stolz pünktlich zu Neujahr mein Tutorial rund ums Hooking, Detours, Searchpattern, VTables etc.
27 Seiten geballte Informationen mit 2 Beispielen für einen DirectInput und einen D3DHook.
Download: HookingTutorial.rar | xup.in
GL & HF
|
d3d9.dll i help
10/22/2011 - S4 League Hacks, Bots, Cheats & Exploits - 5 Replies
All you need to
HyperCam 3
site of download : HyperCam - download powerful screen capture software / HyperCam
1 opening which is a hack
2 open HyperCam 3
3 run the launcher
4 close HyperCam 3
5 enjoy
|
[C++] VTable Hook
10/15/2011 - Coding Tutorials - 1 Replies
schnell erklärt was das hier is:
eine "andere" methode vtable funktionen zu hooken, die meisten hooken direkt die funktion!
diese funktion hier nicht, es wird nur der vtable eintrag überschrieben... vorteil: es wird keine backup funktion benötigt da die gehookte funktion nicht + geändert wird! zwar nur eine kleinigkeit, finde ich trotzdem einfacher als immer CreateHook((void*)VTable, hookVTable4,true,true); zu callen!
ich werds nicht weiter erklären, man sollte es verstehen:
PBYTE...
|
d3d9.dll
10/05/2011 - S4 League - 1 Replies
any one have any idea i got erorr
d3d9.dll
|
All times are GMT +1. The time now is 07:48.
|
|