Я хочу объединить EndScene
из произвольного приложения DirectX 9 для создания небольшого наложения. В качестве примера вы можете взять накладку счетчика кадров FRAPS, которая отображается в играх при активации.Захват DirectX EndScene из инъецированной DLL
Я знаю следующие методы, чтобы сделать это:
Создание нового d3d9.dll, который затем копируется в путь игры. Поскольку сначала выполняется поиск текущей папки, перед переходом на system32 и т. Д. Моя модифицированная DLL загружается, выполняя мой дополнительный код.
Даунсайд: Вы должны положить его перед началом игры.
- То же, что и первый метод, но заменяя DLL в системе32 напрямую.
Даунсайд: Вы не можете добавить код конкретной игры. Вы не можете исключать приложения, в которых вы не хотите, чтобы ваша DLL была загружена.
- Получение смещения EndScene непосредственно из библиотеки DLL с использованием таких инструментов, как IDA Pro 4.9 Free. Поскольку DLL загружается как есть, вы можете просто добавить это смещение к стартовому адресу DLL, когда он сопоставляется с игрой, чтобы получить фактическое смещение, а затем подключить его.
Даунсайд: Смещение не является одинаковым для каждой системы.
- Hooking Direct3DCreate9 получить D3D9, а затем закреплять D3D9-> CreateDevice получить указатель устройства, а затем закреплять Device-> EndScene через виртуальную таблицу.
Даунсайд: DLL, не может быть введен, когда процесс уже запущен. Вы должны начать процесс с флага
CREATE_SUSPENDED
, чтобы зацепить начальный Direct3DCreate9.- Создание нового устройства в новом окне, как только DLL будет введена. Затем, получив
EndScene
смещение от этого устройства и подключив его, в результате получается крючок для устройства, которое используется в игре.
Даунсайд: в какой-то информации, которую я прочитал, создание второго устройства может создавать помехи в существующем устройстве, и это может ошибка с оконным против полноэкранного режима и т.д.
- таких же, как третий метод. Тем не менее, вы выполните сканирование паттерна, чтобы получить
EndScene
.
Даунсайд: не выглядит надежно.
Как я могу подключить EndScene
из нагнетаемой DLL, которые могут быть загружены, когда игра уже запущена, без необходимости иметь дело с различными d3d9.dll-й на других системах, а также с помощью метода, который надежна? Как FRAPS, например, выполняют его DirectX-перехватчики? DLL не должна применяться ко всем играм, только к конкретным процессам, где я ввожу их через CreateRemoteThread
.
проверить это для более подробной информации: Windows, Via C/C++, Глава 22 - DLL Injection и API Hooking, парентеральное введение DLL с помощью Windows Крючков – whunmr
Я хочу вставить DLL через 'CreateRemoteThread'. Я не хочу глобальный крючок, только для определенных игр. – Etan
Затем просто отбросьте первый шаг. – Christopher