Подключение DirectX EndScene из внедренной DLL

Я хочу объехатьEndScene из произвольного приложения DirectX 9 для создания небольшого наложения. В качестве примера вы можете взять наложение счетчика кадров FRAPS, которое отображается в играх при активации.

Я знаю следующие способы сделать это:

Создание новогоd3d9.dll, который затем копируется в путь игры. Так как текущая папка сначала ищется, прежде чем перейти к system32 и т. Д., Моя модифицированная DLL загружается, выполняя мой дополнительный код.

Даунсайд: Вы должны положить его там, прежде чем начать игру.

То же, что и в первом методе, но прямая замена DLL в system32.

Даунсайд: Вы не можете добавить код, специфичный для игры. Вы не можете исключать приложения, в которые вы не хотите загружать вашу DLL.

Получение смещения EndScene непосредственно из DLL с помощью таких инструментов, как IDA Pro 4.9 Free. Так как DLL загружается как есть, вы можете просто добавить это смещение к начальному адресу DLL, когда оно отображается в игре, чтобы получить фактическое смещение, а затем перехватить его.

Даунсайд: Смещение не одинаково в каждой системе.

ЗацеплениеDirect3DCreate9 чтобы получить D3D9, а затем подключитьD3D9-> CreateDevice чтобы получить указатель устройства, а затем перехватDevice-> EndScene через виртуальный стол.

Даунсайд: DLL не может быть введена, когда процесс уже запущен. Вы должны начать процесс сCREATE_SUSPENDED флаг для подключения начальногоDirect3DCreate9.

Создание нового устройства в новом окне, как только DLL будет введена. Затем, получаяEndScene смещение от этого устройства и его зацепка, в результате чего получается зацепка за устройство, которое используется в игре.

Даунсайд: На основании некоторой информации, которую я прочитал, создание второго устройства может помешать существующему устройству и может привести к ошибке в оконном или полноэкранном режиме и т. д.

То же, что и третий способ. Тем не менее, вы будете делать сканирование шаблона, чтобы получитьEndScene.

Даунсайд: не выглядит так надежно.

Как я могу зацепитьEndScene из вставленной DLL, которая может быть загружена, когда игра уже запущена, без необходимости иметь дело с другимиd3d9.dllв других системах и с надежным методом? Как FRAPS, например, выполняет свои хиты DirectX? DLL не должна применяться ко всем играм, а только к конкретным процессам, через которые я ее внедряюCreateRemoteThread.

Ответы на вопрос(3)

Ваш ответ на вопрос