D3D9.dll - VTable

01/25/2012 15:22 _______________#1
Guten Tag,

habe mir letztens ein paar Tutorials zum Thema Direct3D Hook angeschaut. Dabei wurde z.B. die EndScene-Funktion mittels VTable gehookt.

Die VTable wurde in der D3D9.dll gesucht und gefunden.
ABER: Wenn ich jetzt diese DLL in z.B. IDA Pro 6.0 öffne, sehe ich, dass die EndScene Funktion garnicht exportiert ist...

Angenommen ich hätte jetzt kein Tutorial gesehen und würde die Adresse (bzw. das SearchPattern) nicht kennen. Wie könnte ich das finden?

Gruß
01/25/2012 16:10 MoepMeep#2
Lern reversen.
01/25/2012 23:00 P-a-i-n#3
Die V-Tables muss man nicht suchen, weil sie schon da sind, man muss nur die Nummern wissen. :P

Wenn du deine DLL in Ida anschaust oder Olly was hast du davon du expotierst sie ja nicht wirklich, du fängst sie nur zur Laufzeit ab und hängst dein Käse mit rein um die richtige Funnktion zu sehen mußt du schon die D3D9.dll laden viel wirst du da eh nicht sehen ist eben nur die EndScene, könntest auch die BeginnScene hooken ist genau das selbe wird nur als erstes gerendert.

Die EndScene hat eigentlich gar nicht so wichtig beim Hooken brauch man sie eigentlich garnicht du kannst ja direkt Direct3DCreate9 ansprechen bei einem Spiel da läuft es automatisch durch die EndScene da es ja gerendert werden muss, ist eben nur der Knotenpunkt wo alles zusammenläuft.

Und wenn du die EndScene suchst geht es wie oben schon gesagt, ein Spiel erstellt ein Fenster im also W32-Anwedung meist findest du weit oben auch wieder den Begriff "Direct3DCreate9" da es nicht gesagt ist das ein Spiel auf die EndScene zugreift sondern direkt auf den läuft alles auf Direct3DCreate9 hin auf deutsch auch der DevicePointer genannt.

Einfachst art ihn zu finden Spiel starten oder was auch immer mit Dx zutun hat, mit Ollydbg attachen und dann in das Module gehen kann die exe sein oder auch ein DLL je nach Spiel unterschiedlich.

Dann Rechtsklick -> search for ->All intermodular calls so dann haste schonmal eine Liste was alles in dein module reinläuft.
klickste oben nochmal auf Destination dann ist es etwas geordnet und da siehst du auch wenn was aus der d3d9.dll kommt meist ist es eben Direct3DCreate9 oder auch die EndScene das ist von Spiel zu Spiel anders und es muss nicht immer die exe sein kann auch aus einer DLL kommen wie bei der Battlefield-Series kommt alles aus der RenderDx9.dll

Gibt eben mehrere möglichkeiten wie du es machen kannst, kannst auf die EndScene zugreiffen oder direkt Device ansteuern, gerendert wird alles so oder so.

Vorteil bei den DevicePointer ansprechen den kannst du in deinem Arbeitsspeicher auf X-beliebige Adressen legen mittels Detour.

Am besten lädst du dir ein DirectXFenster wo runter und übst da, da ist es sehr leicht weil es nicht wirklich viele Funktionen sind die da reinlaufen, da hat man einen schönen Überblick und es ist nicht so schwer wie bei einem Spiel.

Den DevicePointer kriegst du dann leicht bei Olly in dem ESP-Register raus.
Und mal was am Rande wenn du auf den Device gehst brauchst du nicht den Pointer du kannst auch die Funktion mittendrin Hooken kommt weit besser, entgeht oft der Detection auch bri Hackshield, wenn es nur einer cleaner ESP-Hack sein soll.

Aber das ist alles noch recht leicht, man kann viel zu sagen weit schwerer wird es dann wenn den den playermanager brauchst weil ohne Playermanager kein Spieler angaben und ohne Spieler wo sollen die Boxen,Namentags,Distancetags etc hin ;) das ist weit schwerer zu finden.

Befass dich lieber mit Ollydbg mit IDA ist richtig gut um sich die Funktionen anzuschauen aber mit Olly die vorarbeit leisten ist weit besser, da hat man es auch in IDA leichter.

Wie du es machst ist dir überlassen, viele wege führen nach Rom,der Weg der für dich am leichtesten ist mußt du selber finden und gehen.

Wirklich gute Tut's dafür kenne ich nicht die meisten sind nur Bruchteile und das jemand richtig zu erklären ich glaube da kann man schon ein kleines Buch schreiben drüber, man lernt aus den erfahrung also Denken - Probieren - Denken - Probieren es wird oft in die Hose gehen aber wenn man es dann geschaft hat weiß man wie es geht aber das braucht Zeit.

kauf dir noch ein gutes Directx-Buch wo du was über die Directx-Caps lernst die sind auch sehr brauchbar.
Gutes Buch ist das find ich von meinem DX-Büchern am besten und da hab ich 7 stück. [Only registered and activated users can see links. Click Here To Register...]
01/26/2012 12:21 Tyrar#4
man kanns auch kurz machen, du schaust dir die d3d9 header an! im IDirect3DDevice9 interface stehen (logischerweise) alle funktionen drin, du zählst von oben nach unten ab und hast die nummer! (bei 0 anfangen zu zählen ;))
01/26/2012 13:40 _______________#5
Vielen dank erstmal!

@HeavyHacker:
Ja, das ist mir schon klar, EndScene ist Nummer 42 ;)

Aber angenommen das IDirect3DDevice9 steht bei Programm X im Speicher an Stelle 0x12345. Wie komme ich jetzt an die Adresse von EndScene?
Code:
// In der Dll
IDirect3DDevice9* dev = (IDirect3DDevice9*)*((void*)0x12345);
DWORD **vPtr= (DWORD**) dev; // EDIT
DWORD *vtable = *vPtr;
DWORD EndSceneAddress = vtable[42];
Passt das so?
Hab es mal ausprobiert und klappt nicht... bevor ich aber gucke ob die Adresse stimmt und das ganze dann noch im Debugger anschaue, würde ich ersteinmal ausschließen, dass der Code fehlerhaft ist...

@P-a-i-n:
Das mit dem Fenster zum Üben werde ich glaube ich wirklich mal weiter verfolgen, ein kleines Fenster ist ja schnell gebastelt ;)
Buch über Dx hab ich schon ;)

Gruß
01/26/2012 14:33 Dr. Coxxy#6
in dem tutorial:
[Only registered and activated users can see links. Click Here To Register...]
wird nebenbei erklärt wie man an die vtable kommt, und noch eine andere methode.

was du da in deinem letzten post versuchst verstehe ich ehrlich gesagt nicht.
01/26/2012 15:07 _______________#7
Danke, das Tutorial kenn ich, aber da wird mit SearchPattern gearbeitet.

Was ich vorhabe:
Angenommen ich weiß, dass das IDirect3DDevice9 im Speicher an 0x12345 steht.
Außerdem weiß ich, dass Endscene die 42. virtuelle Funktion ist.
Wenn ich das nun richtig in erinnerung habe, steht der VTable am anfang vom Device. Deshalb: Vtable + 42(Funktionsnummer) * 4(Adressengröße) = Endscene.
Oder hab ich da etwas verdreht ?
01/26/2012 15:35 Dr. Coxxy#8
verdreht, so geht das nicht.

zumindest afaik, korrigiert mich, wenn ich falsch liege.
01/26/2012 15:40 Tyrar#9
hab grad etwas gegoogelt und das gefunden: [Only registered and activated users can see links. Click Here To Register...]

is auch nur ne abart von der find pattern methode (wenns funktioniert) ;)

dann kannst dadrauf z.b. meine vtable hook funktion anwenden ([Only registered and activated users can see links. Click Here To Register...]) und fertig ;)

edit: der device pointer hat an sich nicht viel mit der vtable zutun ;)
01/26/2012 16:18 Dr. Coxxy#10
mmh mir ist da grad noch was eingefallen, mom ich probier eben mal, rückmeldung ~ 5min

nope geht so nicht.

wie willst du überhaupt an die device rankommen ohne die adresse der vtable und damit der funktionen zu haben?
hookst du createdevice oder was?
01/26/2012 16:19 _______________#11
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?:confused:

BTW: Hab das Forum wiedergefunden, woher ich meine Methode hatte:
[Only registered and activated users can see links. Click Here To Register...]

Gruß
01/26/2012 16:36 Dr. Coxxy#12
wie du dieses muster findest steht auch in dem tut, dass ich eben hier gepostet habe...
[Only registered and activated users can see links. Click Here To Register...]

lies mal aufmerksam.

(ab seite 17 gehts los...)
01/26/2012 19:59 _______________#13
Jaja, wie gesagt, ich kenne das Tutorial, ABER:
Ich kann EndScene in der D3D9.dll nicht finden, da die Funktion nicht exportiert ist...
Ich gehe mal davon aus, dass die Version in dem Tutorial älter ist...oder liegt es doch an mir?
Habe es u.a. mit IDA Pro 6.0 probiert, aber wie gesagt, die Funktion kann nicht gefunden werden...

Gruß
01/26/2012 20:21 Dr. Coxxy#14
nimm die free version von ida, die zeigt die namen an.
01/26/2012 21:01 _______________#15
Die Free Version ist besser als die Pro?
Nice, aber leider klappt auch nicht.
Damit ihr mir glaubt hab ich mal zwei Grafiken aller Funktionen (mit Namen...) eingefügt. Habe die D3D9.dll von System32 sowie SysWOW64 ausprobiert...
IDA Pro/Free mit Debugging Symbols vom Hernn Microsoft sogar ;)
Was ist da los?
BTW: Win7 x64

Gruß

EDIT:
Nochmal größer [Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]