2016-04-09 8 views
0

Also habe ich mit C++ herumgespielt und DLLs injiziert, ziemlich neu, aber ziemlich schnell gelernt. Ich versuche, EndScene zu haken und es funktioniert einfach nicht. Ich habe versucht, einen Muster-Scan zu verwenden, um es zu finden und dann zu haken. Ich habe versucht, ein Dummy-D3D-Gerät zu erstellen und den EndScene über sein VTable zu finden. Jedes Mal, wenn es fehlschlägt, erhalte ich eine Zugriffsverletzung, daher kann ich nur annehmen, dass ich die falsche Adresse für die Funktion habe oder vielleicht etwas völlig vermisse. Ich habe viele verschiedene Möglichkeiten ausprobiert, aber aufgrund begrenzter Kenntnisse brauche ich ein wenig mehr Hilfe.Ich versuche D3D Endscene zu hosten

DWORD dEndScene = 0x10066D50; 
HMODULE hBaseAddress = GetModuleHandle("d3d9.dll"); 

BYTE* pEndFunction = (BYTE*)reinterpret_cast<uintptr_t>(hBaseAddress); 
pEndFunction = pEndFunction + dEndScene; 

fEndScene = (oEndScene)DetourFunction(pEndFunction, (PBYTE)EndScene); 

Antwort

0

Die Vtable ist wahrscheinlich schreibgeschützt. Sie können VirtualProtect verwenden.

Und einige leicht unterschiedliche Ansätze:

Ist es möglich, Direct3DCreate9 (Ex) vor seiner erstellt zu ersetzen? Dann stellst du einfach Proxy-Objekte für die gewünschten Schnittstellen ein, die dann normal delegieren, Dinge vorher/nachher machen oder etwas ganz anderes machen können.

Oder wenn Sie den IDirect3DDevice9 -Instanzzeiger erhalten, indem Sie ihn bearbeiten, dann verweist er auf die virtuelle Tabelle (wiederum VirtualProtect, vermeidet jedoch zu wissen, wo die Funktion im Voraus lebt, was sich in verschiedenen Fällen ändern kann).