Voglio deviare EndScene
da un'applicazione DirectX 9 arbitraria per creare un piccolo overlay. Ad esempio, è possibile eseguire la sovrapposizione del frame frame di FRAPS, che viene visualizzato nei giochi quando attivato.Collegamento di DirectX EndScene da una DLL iniettata
so i seguenti metodi per farlo:
Creazione di un nuovo d3d9.dll, che viene poi copiato il percorso giochi. Poiché la cartella corrente viene cercata per prima, prima di andare a system32 ecc., La DLL modificata viene caricata, eseguendo il mio codice aggiuntivo.
Lato negativo: Devi metterlo lì prima di iniziare il gioco.
- Uguale al primo metodo, ma sostituzione diretta della DLL in system32.
Downside: Non è possibile aggiungere codice specifico gioco. Non è possibile escludere applicazioni in cui non si desidera caricare la DLL.
- Ottenere l'offset EndScene direttamente dalla DLL utilizzando strumenti come IDA Pro 4.9 gratuito. Poiché la DLL viene caricata così com'è, è possibile aggiungere questo offset all'indirizzo di origine della DLL, quando viene mappato sul gioco, per ottenere l'offset effettivo e quindi agganciarlo.
Downside: L'offset non è la stessa su tutti i sistemi.
- aggancia Direct3DCreate9 per ottenere il D3D9, quindi agganciando D3D9-> CreateDevice per ottenere il puntatore dispositivo, e quindi agganciando Device-> EndScene attraverso la tabella virtuale.
Unico inconveniente: Il DLL non può essere iniettata, quando il processo è già in esecuzione. È necessario avviare il processo con il flag
CREATE_SUSPENDED
per agganciare l'iniziale Direct3DCreate9.- Creazione di un nuovo dispositivo in una nuova finestra, non appena la DLL viene iniettato. Quindi, ottenere l'offset
EndScene
da questo dispositivo e collegarlo, creando un gancio per il dispositivo utilizzato dal gioco.
Unico inconveniente: come di un'informazione I letto, creando un secondo dispositivo può interferire con il dispositivo esistente, e può insetto con finestra vs. modalità a schermo intero ecc
- Stessi terzo metodo. Tuttavia, esegui una scansione del modello per ottenere
EndScene
.
Lato negativo: non sembra affidabile.
Come posso agganciare EndScene
da un DLL iniettato, che può essere caricato quando il gioco è già in funzione, senza avere a che fare con diversi d3d9.dll 's su altri sistemi, e di un metodo che è affidabile? Come FRAPS ad esempio esegue i suoi hook DirectX? La DLL non dovrebbe essere applicata a tutti i giochi, solo a processi specifici in cui viene iniettata tramite CreateRemoteThread
.
check-out questo per maggiori dettagli: Windows tramite C/C++, Capitolo 22 - DLL Injection e API Hooking, Iniettare una DLL utilizzando Windows Ganci – whunmr
Voglio iniettare la DLL tramite 'CreateRemoteThread'. Non voglio un hook globale, solo per giochi specifici. – Etan
Quindi basta rilasciare il primo passaggio. – Christopher