Как в чужой запущенной программе получить указатель на IDirect3DDevice

Холод
Дата: 22.11.2007 09:46:36
то есть я внедрил длл в уже запущенную программу использующую Direct3D
но поскольку создание интерфейса устройства происходит в начале подопытной программы... то мы не можем ставить хук на него потому как это произошло уже.

вопрос вот в чём: можно ли получить указатель на IDirect3DDevice в уже запущенной программе?
Tellur
Дата: 22.11.2007 10:20:37
Я сам когда то хотел сделать такое, но руки не дошли...
Можно попробовать создать еще один интерфейс и, путем поиска в памяти процесса найти по интерфейсной таблице такой же кусок памяти, это и будет искомый интерфейс
Холод
Дата: 22.11.2007 12:48:49
второй интерфейс я создал
каким образом искать в памяти можно пример или функцию или хотябы что-то
Tellur
Дата: 22.11.2007 13:50:17
GetProcessHeaps, VirtualQuery, CopyMemory/ReadProcessMemory
Warstone
Дата: 22.11.2007 14:02:42
Холод
то есть я внедрил длл в уже запущенную программу использующую Direct3D
но поскольку создание интерфейса устройства происходит в начале подопытной программы... то мы не можем ставить хук на него потому как это произошло уже.

вопрос вот в чём: можно ли получить указатель на IDirect3DDevice в уже запущенной программе?

А что мешает написать лоадер? Почему нельзя запускать игру/приложение самому? Если что-то действительно мешает, то что мешает запуститься ДО игры и, сначала ловить CreateProcess, как только необходимый ехе стартанет - В суспенд его и инъекти свою длл. А в длл уже грамотно LoadLibrary, и перехват создания интерфейса вот тебе и все, что надо.
Холод
Дата: 22.11.2007 14:12:23
но к примеру мне нужно отловить только приложения работающие с Direct3D.
а если перехватывать CreateProcess то длл будет инжектиться во все проги... включая и системные и антивирусы и тд...
Холод
Дата: 22.11.2007 14:13:50
Tellur
GetProcessHeaps, VirtualQuery, CopyMemory/ReadProcessMemory
то есть таким образом да? иначе ни как? а можно ли как нибудь через QueryInterface ?
Tellur
Дата: 22.11.2007 14:21:27
нет. не только... вообще тут может быть много способов, но я знаю только такой
QueryInterface насколько я знаю создает новый объект, но не возвращает уже созданный.
Вообще менее затратным в таком случае будет путь предложенный Warstone, если есть возможность опередить приложение и прежде чем оно создаст интерфейс перехватить функцию, то почему бы не сделать так. А поиск в памяти может длиться долго, и к тому же не гарантирует ничего.
Холод
Дата: 22.11.2007 14:22:56
согласен... то есть всё таки лоадер...
Warstone
Дата: 22.11.2007 14:49:31
Холод
но к примеру мне нужно отловить только приложения работающие с Direct3D.
а если перехватывать CreateProcess то длл будет инжектиться во все проги... включая и системные и антивирусы и тд...
Ну ты exe программы знаешь? и/или контрольную сумму... Да что угодно. В конце-концов по реестру посмотришь. А если знаешь имя да и путь ехе - проверяешь - запускаемый ехе тот, который тебе нужен или нет. Если тот - суешь ему длл. Тем более что и длл-то можно ко всем сувать... То что ты перехватываешь LoadLibrary, это только капля в море... ну перехватишь ты 100, ну 500 вызовов LoadLibrary, ну проверишь там имя вызываемой длл... Ну пусть ты потратишь на проверку 1000 тактов, ну даже 10 000... Умножить на 500 - это всего-лишь 5 000 000 то есть ты отъешь у программы 5 МегаГерц, она эти ерцы или такты кушает... вобщем этого никто не увидет даже на 400 Пнях... Да и на 80486 (66 - 100 Мгц) - тож.