2013-11-28 2 views
0

Я следую этому руководству: DirectX 9.0 Hooking via Injection via C++. Таким образом, программа создает удаленный поток в процессе в качестве запуска, внедряет мой крючок, вызывает его DllMain и перехватывает функцию Direct3D9Create. Барабанный барабан используется для подключения Direct3DCreate9. Весь интерфейс Direct3D и интерфейс устройства завернуты. Когда игра вызывает Direct3D9Create, она должна вызывать мою подключенную функцию вместо оригинала. Это проблема, потому что игра никогда не вызывает функцию зацепления. Но когда я вызываю Direct3DCreate из dll, вызывается функция hooked. Это DLLMain:Обтекание интерфейсов dx9 и функции подключения

... 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) 
    { 
    DisableThreadLibraryCalls(hModule); 
    HookHandle = hModule; 
    HookAPI(); 
    lpReserved; 
    //LPDIRECT3D9 pD3d9 = Direct3DCreate9(D3D_SDK_VERSION);//if I uncomment this line, hooked function is called 
    } 
    else if (ul_reason_for_call == DLL_PROCESS_DETACH) 
    { 
    UnhookAPI(); 
    lpReserved; 
    OutputDebugString(pszMessage); 
    } 
    return TRUE; 
} 
... 

Это реализация обертка конструктор:

Direct3D9Wrapper::Direct3D9Wrapper(LPDIRECT3D9 pDirect3D) 
{  
    IDirect3DDevice9 * device = (IDirect3DDevice9 *)this; 
    Direct3D9 = pDirect3D; 
} 

Dll впрыскивается в играх выполнения, поэтому Direct3DCreate нельзя назвать после завершения DllMain. Я попытался вызвать функцию CreateDevice из dll вручную, и он также перенаправлен правильно, но сама игра никогда не вызывает вызов. Как можно начать игру без перенаправления вызова функции CreateDevice в мою dll? Я пробовал несколько игр dx9, и все равно. Что мне не хватает?

ответ

1

Я думаю, вы пытаетесь сделать захват экрана для своей игры. Если вы хотите создать стабильный код (а не только для обучения), используйте Direct3DHook вместо того, чтобы иметь дело с API Hooking.

EDIT:

Для более широкого использования EasyHook управления. Direct3DHook использует EasyHook за кулисами, если только вы не играете с API Hooking ...

0

Некоторые догадки.

  • вы не имеет дело с либо подсекать из GetProcAddress() и LoadLibrary() варианты
  • вы просто не перебор модулей, которые загружаются при загрузке и закреплять их.
Смежные вопросы