Просто переписываю статью с некоторыми правками, так как на данный момент она не рабочая, да и там черт ногу сломит.
Сие действие будет проводить на Counter-Strike: Source, выбор игры не важен.
Запускаем x64dbg, открываем файл hl2.exe, для корректного запуска стимовской версии необходимо указать аргументы командной строки:
-steam -game cstrike -console -insecure
Нажимаем F9, после прогрузки модуля d3d9.dll ставим бряки на:
Direct3DCreate9, если игра инициализирует устройство в текущем модуле
Direct3DCreate9Ex, если игра инициализирует устройство во внешнем модуле.
После установки бряка перезапускаем игру, как только срабатывает бряк выходим из функции и видим откуда она вызывалась.
*Немного комментов для лучшего восприятия*
Теперь нам необходимо вызвать функцию CreateDevice по её индексу, для этого модифицируем:
CALL DWORD PTR DS:[EAX+0x8]
на
CALL DWORD PTR DS:[EAX+0x40]
Либо считаем руками.(Нет)
После вызова [EAX+0x40] попадаем в тело функции, ставим на него бряк и перезапускаем игру.
Как только сработает бряк, надо будет расширить количество аргументов до 7 в настройках соглашения о вызовах, так как нам нужен 7-й аргумент в прототипе функции CreateDeviceEx, а именно ppReturnedDeviceInterface:
HRESULT CreateDeviceEx(
UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS *pPresentationParameters,
D3DDISPLAYMODEEX *pFullscreenDisplayMode,
IDirect3DDevice9Ex **ppReturnedDeviceInterface
);
Хоба.
Вот мы и нашли указатель на указатель на устройство с помощью которого можно рисовать внутри игры и которым рисует игра.