2015-01-16 6 views
1

Я пытаюсь использовать инъекцию dll, чтобы перехватить вызов Direct3DCreate8 из моего приложения, чтобы получить дескриптор устройства Direct3d и нарисовать оверлей на экране, который он представляет. Вызов этого API происходит сразу после выполнения приложения, которое, если я правильно понимаю, делает ненужным встраивание dll в запущенный процесс, поскольку вызов API, который был после этого, уже произошел, когда я вставляю dll. Правильно ли это предположение? Если да, то как можно вставить DLL во время выполнения процесса, чтобы поймать требуемый вызов API?DLL-инъекция до выполнения процесса

EDIT: Я знаю общесистемные апи-крючки, но было бы неплохо услышать «локальное» решение этой проблемы.

EDIT 2: Забыл упомянуть, заменив .dll в папке приложения не имеет смысла, поскольку приложение ищет .dll (d3d8.dll в моем случае) в System32/Syswow64 каталогов.

+1

(Не полный ответ, поэтому я отправляю его как комментарий). Посмотрите на API отладчика: http://msdn.microsoft.com/en-us/library/ms809754.aspx - процессы начало отладки будет приостановлено, поэтому вы можете вставить свою DLL, затем отказаться от нее, а затем прекратить ее отладку. (Несмотря на то, что ваша программа на самом деле не отладчик, она может использовать API отладчика) – immibis

ответ

1

Будучи немного опоздавшим на вечеринку, я хотел предложить вам решение с использованием Microsoft Detours (которое бесплатно для некоммерческого использования на платформах x86 и в тоже время стоит огромных денег). У них есть функция DetourCreateProcessWithDllEx, которая может удовлетворить ваши потребности.

Цитирование Detours документации:

Процесс создается в подвешенном состоянии с флагом CREATE_SUSPENDED к CreateProcess. Затем Detours изменяет образ двоичного файла приложения в новом процессе, чтобы включить указанную DLL в качестве первого импорта. Затем выполнение в процессе возобновляется. Когда выполнение возобновится, загрузчик процессов Windows сначала загрузит целевую DLL, а затем любые другие библиотеки DLL в таблицу импорта приложения, прежде чем вызывать точку входа приложения.

+0

Я закончил использование обходных путей, когда я разрабатывал этот проект :) Спасибо – astralmaster