перхват методов COM объектов

Тема в разделе "WASM.BEGINNERS", создана пользователем sometime, 8 сен 2010.

  1. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    собственно нужно перехватить
    sapi!CSpVoice::Speak
    изначально перехватил ole32!CoCreateInstance дабы получить указатель на обьект - вызываеться эта функа несколько раз когда должен произнестись звук, но ниразу не вижу указателя натот обьект что мне интересен sapi+68b8. Решил спрросить, может я не правильно понимаю смысл перехвата методов... Еще есть опрос по сравнению CLSID- как лучше? Нашел в иде функу которая вызывает sapi!CSpVoice::Speak - смещения теже vtbl+50h, но адресс то не тот получаеться что надо (символы сказали)
    вот кодез как я решил это реализовать (немного поюзаный тестами))
    Код (Text):
    1. HRESULT
    2. WINAPI
    3. CoCreateInstanceProc(
    4.     IN      REFCLSID    rclsid,
    5.     IN      LPUNKNOWN   pUnkOuter,
    6.     IN      DWORD       dwClsContext,
    7.     IN      REFIID      riid,
    8.     IN      LPVOID     *ppv
    9.     )
    10. {
    11.     HRESULT     result;
    12.     CLSID       CLSID_Voice;
    13.     DWORD       OldProt;
    14.     PVOID       tmp;
    15.  
    16.     CLSIDFromProgID( L"SAPI.SpVoice",
    17.                      &CLSID_Voice );
    18.  
    19.     result = OrigCoCreateInstance( rclsid,
    20.                                    pUnkOuter,
    21.                                    dwClsContext,
    22.                                    riid,
    23.                                    ppv );
    24.  
    25.     if (result == S_OK) {
    26.  
    27.         DbgBp();
    28.  
    29.         if (RtlEqualSid( rclsid , &CLSID_Voice )) {
    30.  
    31.             DPRINT( "vtbl: %x\n\n",
    32.                     ((ISpVoice*)*ppv)->lpVtbl );
    33.  
    34.             if (VirtualProtect( ((ISpVoice*)*ppv)->lpVtbl->Speak , 4, PAGE_EXECUTE_READWRITE, &OldProt )) {
    35.  
    36.                 OrigVoiceSpeek = ((ISpVoice*)*ppv)->lpVtbl->Speak;
    37.                 ((ISpVoice*)*ppv)->lpVtbl->Speak = VoiceSpeekMethod;
    38.  
    39.             } else {
    40.  
    41.                 GetLastError();
    42.                 DbgBp();
    43.             }
    44.         }
    45.     }
    46.  
    47.     return result;
    48. }
    это пропатченый ole32!CoCreateInstance. Язык си, поэтому ppv->lpVtbl->Speak, но как правильно с lpVtbl или без него хз, с интерфейсами максимум что делал так это HTMLDocument немного по прримерам копипастил, до конца ихняя работа - пока не изучена))

    хелп.
     
  2. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    1. Хукать нужно функцию ole32!CoCreateInstanceEx (она же и вызывается из ole32!CoCreateInstance).
    2. Я посоветовал почитать статью про CoGetInterceptor - http://www.rsdn.ru/article/com/comintercept.xml и все ссылки из нее.
    3. Всегда можно получить адрес метода созданием объекта и просплайсить (или использовать более изощренные методы хуков) сам метод, не трогая таблицу виртуальных функций у всех создаваемых объектов. Это более рационально, если интерес только один метод.
     
  3. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    Напомню также о существовании такой классной штучки как TreatAs
    Кстати у микрософта я часто видел проверку указателя на функцию из vtbl - не думаю что борьба с подменой, но тем не менее грубая подмена не работает, в отличие от сплайсинга
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    z0mailbox
    У меня всё работало, причём на разных осях, никто не жаловался. Хотя возможно зависит от объектов. Но вообще по возможности лучше применять более простые и надёжные техники.
     
  5. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    0x6b65
    надо посмотреть что там...
    бегло прочитал,) ссылки - может прочту, пасиб!!
    вчера сидел под дебагом и любовался mov edi,edi...но не пришло в голову вызвать самому
    CoCreateInstance и поучить указатель на сам метод))
    z0mailbox
    может и есть, но я вообщето как оказалось не могу найти тот что нужно вызов CoCreateInstance()

    однозначно)

    спасибо всем вам, помогли однозначно!!!!
    думаю что вопросов больше по этому поводу не будет)