DirectX (COM) и шпион вызова методов

Тема в разделе "WASM.RESEARCH", создана пользователем Rustem, 19 июл 2005.

  1. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Приветствую!!!

    Пишу монитор(шпион) для показа вызовов DirectX

    Почти написал, осталось получить адреса таблиц, которые указывают

    на методы интрфейса



    Принцип простой - патчим таблицы методов. Т.е перенаправляем

    на свою заглушку, пишем в лог, а потом уже вызываем сам метод.



    Как можно получить адреса таблиц, которые указывают на методы.

    Для некоторых я получил, но не для всех...

    Например для IDirectSound8, IDirectSoundBuffer получаются так

    вызовом DirectSoundCreate, а вторая через вызов CreateDirectSoundBuffer



    Как можно получить остальные интерфейсы.

    В SDK все время упоминается получение через IUnknown::QueryInterface. Может кто знает как





    P.S. Пока монитор показывает методы IDirectSound8, IDirectSoundBuffer.

    Вся проблема в получении остальных адресов таблиц.

    [​IMG] 2129239039__dsmon.zip
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Дык в MSDN описание QueryInterface посмотри - последний параметр - указатель на VTbl. Вот ещё про COM, но в DX сложные вещи не используются.



    А вместо падча VTbl может проще перехватить ф-ции её возвращающие и отдавать свою?
     
  3. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Мля... я тоже ненавижу COM



    Но как- то ведь вызываются методы directx'a ???

    Как??? Кто-нибудь может показать.

    Можно на чем угодно...
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Так там относительно просто (даже проще, чем api перехватывать).



    Пример:

    STDAPI DirectXFileCreate(LPDIRECTXFILE *lplpDirectXFile);



    Возвращает указатель на IDirectXFile, которая является ни чем иным как VTbl интерфейса IDirectXFile.

    На низком уровне: просто массив указателей на методы:
    Код (Text):
    1.  
    2. struct
    3.  {
    4.   ; методы IUnknown
    5.   .QueryInterface
    6.   .AddRef
    7.   .Release
    8.   ; методы IDirectXFile
    9.   .CreateEnumObject
    10.   .CreateSaveObject
    11.   .RegisterTemplates
    12.  }




    Что нужно сделать?

    0) Вызвать DirectXFileCreate, получить VTbl IDirectXFile, сохранить её.

    1) Перехватить DirectXFileCreate и возвращать указатель на свою VTbl, методы которой указывают на свои функции, которые будут сохранять информацию о вызовах и передавать управление на оригинальную VTbl.

    2) Если вызывается IDirectXFile.QueryInterface, то зовём оригинальный QueryInterface и сохраняеме его результат себе, проге же передаём свой VTbl запрашиваемого интерфейса.



    И так далее.
     
  5. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    IceStudent мыслит верно.



    Методы DirectX и любой метод COM вызываются за нефиг делать :)



    Большинство подобных программ основаны на создании аналога-заглушки библиотеки (например d3d9.dll).

    Библиотеку кидают либо в каталог с нужным экзешником, либо в системную директорию. Или на худой конец внедряют в исследуемый процесс эту dll вместо стандартной.



    При вызове приложением функции Direct3DCreate загружается наша dll и обработав данную функцию можно подсунуть программе указатель на собственную vtable. В дальнейшем практически любой вызов будет происходить через эту vtable содержащую наши собственные обработчики. Таким подходом можно контролировать очень много и делать с приложением что угодно, благо все параметры метода лежат в стеке.



    По поводу других компонент DirectX могу сказать только одно, особо отслеживать вызовы DirectSound или DirectInput не так интересно как Direct3D.
     
  6. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Шпион сделан так, что ему все равно за какими методами шпионить. DirectSound взят только для примера.



    (Раньше написал граббер музыки из демок, и поэтому кое-что знал о нем. Но повторю - за кем следить разницы никакой)



    Я немогу понять - как можно получить vtbl например для

    IDirectSoundFXChorus8 или для любого другого (QueryInterface ???).

    Покажите пожалуйста на примере.
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    DX SDK у меня нет, но общий принцип такой.



    прога зовёт DirectSoundCreate8 для получения указателя на интерфейс IDirectSound8. Потом вызывает IDirectSound8.QueryInterface чтобы получить указатель на любой другой интерфейс, в частности и IDirectSoundFXChorus8:


    Код (Text):
    1.  
    2. IDirectSoundFXChorus8* piDxChorus = 0;
    3. IDirectSound8* piDxSound = 0;
    4. //SDK под рукой нет, точно не знаю, что тут
    5. LPGUID pDevice;
    6. HRESULT hr = DirectSoundCreate8(pDevice,&piDxSound,NULL);
    7. if((hr >= 0) && piDxSound)
    8.  // запрашиваем указатель на интерфейс IDirectSoundFXChorus8
    9.  piDxSound->QueryInterface(IID_IID_IDirectSoundFXChorus8,(void**)&piDxChorus);
    10.