собственно нужно перехватить sapi!CSpVoice::Speak изначально перехватил ole32!CoCreateInstance дабы получить указатель на обьект - вызываеться эта функа несколько раз когда должен произнестись звук, но ниразу не вижу указателя натот обьект что мне интересен sapi+68b8. Решил спрросить, может я не правильно понимаю смысл перехвата методов... Еще есть опрос по сравнению CLSID- как лучше? Нашел в иде функу которая вызывает sapi!CSpVoice::Speak - смещения теже vtbl+50h, но адресс то не тот получаеться что надо (символы сказали) вот кодез как я решил это реализовать (немного поюзаный тестами)) Код (Text): HRESULT WINAPI CoCreateInstanceProc( IN REFCLSID rclsid, IN LPUNKNOWN pUnkOuter, IN DWORD dwClsContext, IN REFIID riid, IN LPVOID *ppv ) { HRESULT result; CLSID CLSID_Voice; DWORD OldProt; PVOID tmp; CLSIDFromProgID( L"SAPI.SpVoice", &CLSID_Voice ); result = OrigCoCreateInstance( rclsid, pUnkOuter, dwClsContext, riid, ppv ); if (result == S_OK) { DbgBp(); if (RtlEqualSid( rclsid , &CLSID_Voice )) { DPRINT( "vtbl: %x\n\n", ((ISpVoice*)*ppv)->lpVtbl ); if (VirtualProtect( ((ISpVoice*)*ppv)->lpVtbl->Speak , 4, PAGE_EXECUTE_READWRITE, &OldProt )) { OrigVoiceSpeek = ((ISpVoice*)*ppv)->lpVtbl->Speak; ((ISpVoice*)*ppv)->lpVtbl->Speak = VoiceSpeekMethod; } else { GetLastError(); DbgBp(); } } } return result; } это пропатченый ole32!CoCreateInstance. Язык си, поэтому ppv->lpVtbl->Speak, но как правильно с lpVtbl или без него хз, с интерфейсами максимум что делал так это HTMLDocument немного по прримерам копипастил, до конца ихняя работа - пока не изучена)) хелп.
1. Хукать нужно функцию ole32!CoCreateInstanceEx (она же и вызывается из ole32!CoCreateInstance). 2. Я посоветовал почитать статью про CoGetInterceptor - http://www.rsdn.ru/article/com/comintercept.xml и все ссылки из нее. 3. Всегда можно получить адрес метода созданием объекта и просплайсить (или использовать более изощренные методы хуков) сам метод, не трогая таблицу виртуальных функций у всех создаваемых объектов. Это более рационально, если интерес только один метод.
Напомню также о существовании такой классной штучки как TreatAs Кстати у микрософта я часто видел проверку указателя на функцию из vtbl - не думаю что борьба с подменой, но тем не менее грубая подмена не работает, в отличие от сплайсинга
z0mailbox У меня всё работало, причём на разных осях, никто не жаловался. Хотя возможно зависит от объектов. Но вообще по возможности лучше применять более простые и надёжные техники.
0x6b65 надо посмотреть что там... бегло прочитал,) ссылки - может прочту, пасиб!! вчера сидел под дебагом и любовался mov edi,edi...но не пришло в голову вызвать самому CoCreateInstance и поучить указатель на сам метод)) z0mailbox может и есть, но я вообщето как оказалось не могу найти тот что нужно вызов CoCreateInstance() однозначно) спасибо всем вам, помогли однозначно!!!! думаю что вопросов больше по этому поводу не будет)