Сейчас на форуме: subword, rtsgreg1989, zds, _MBK_ (+6 невидимых) |
![]() |
eXeL@B —› Основной форум —› Исследование чужого приложения - COM |
Посл.ответ | Сообщение |
|
Создано: 18 ноября 2007 17:33 · Личное сообщение · #1 Привет всем, может кто-нибудь поможет? Внедрил свою DLL в чужой процесс, проанализировав зависимости импортируемых библиотек и функции нашел функцию получения интерфейса главного приложения. в проект включил tlb файл выдранный из той же библиотеки, получил указатель на интерфейс, убедился в правельности полученного результата вызвав пару методов. Но вот проблема не могу получить указатели на другие интерфейсы - решил поставить перехватчики на некоторые методы интерфейса по статье rsdn.ru/article/com/comintercept.xml?print#EFC и тоже лажа. Любые идеи. ![]() Вот коды: /////////////////////////////Часть файла TLB нужного интерфеса////////////// // в начале MCore; GUID = {AE0A4503-EB6C-4A5B-BF8E-9D973EB73A04}; ... Dispatch MIDApp; GUID = {613AC42F-72C3-42A1-8184-AC35D5B61C2B}; function QueryInterface(riid: ^GUID; out ppvObj: ^^VOID); stdcall; function AddRef: UI4; stdcall; function Release: UI4; stdcall; function GetTypeInfoCount(out pctinfo: ^UINT); stdcall; function GetTypeInfo(itinfo: UINT; lcid: UI4; out pptinfo: ^^VOID); stdcall; function GetIDsOfNames(riid: ^GUID; rgszNames: ^^I1; cNames: UINT; lcid: UI4; out rgdispid: ^I4); stdcall; function Invoke(dispidMember: I4; riid: ^GUID; lcid: UI4; wFlags: UI2; pdispparams: ^DISPPARAMS; out pvarResult: ^Variant; out pexcepinfo: ^EXCEPINFO; out puArgErr: ^UINT); stdcall; function AttachEvent(pEventName: BSTR; pHandler: IDispatch): ^MIDEventHandler; stdcall; function Init(out bszConfigDir: BSTR); stdcall; function Shutdown: Bool; stdcall; function CreateOwner(bsOwnerName: BSTR; flags: I4): ^MIDOwner; stdcall; function GetService(bstrServiceId: BSTR): IUnknown; stdcall; function RegisterLastOwner(pOwner: ^MIDOwner); stdcall; Dispatch MIDScriptable; GUID = {431890FC-B324-4553-9DF5-93458C620587}; function QueryInterface(riid: ^GUID; out ppvObj: ^^VOID); stdcall; function AddRef: UI4; stdcall; function Release: UI4; stdcall; function GetTypeInfoCount(out pctinfo: ^UINT); stdcall; function GetTypeInfo(itinfo: UINT; lcid: UI4; out pptinfo: ^^VOID); stdcall; function GetIDsOfNames(riid: ^GUID; rgszNames: ^^I1; cNames: UINT; lcid: UI4; out rgdispid: ^I4); stdcall; function Invoke(dispidMember: I4; riid: ^GUID; lcid: UI4; wFlags: UI2; pdispparams: ^DISPPARAMS; out pvarResult: ^Variant; out pexcepinfo: ^EXCEPINFO; out puArgErr: ^UINT); stdcall; function AttachEvent(pEventName: BSTR; pHandler: IDispatch): ^MIDEventHandler; stdcall; Dispatch MIDContactList; GUID = {D7A21EA9-9701-4A3E-997D-4D0F2E4306A1}; function QueryInterface(riid: ^GUID; out ppvObj: ^^VOID); stdcall; function AddRef: UI4; stdcall; function Release: UI4; stdcall; function GetTypeInfoCount(out pctinfo: ^UINT); stdcall; function GetTypeInfo(itinfo: UINT; lcid: UI4; out pptinfo: ^^VOID); stdcall; function GetIDsOfNames(riid: ^GUID; rgszNames: ^^I1; cNames: UINT; lcid: UI4; out rgdispid: ^I4); stdcall; function Invoke(dispidMember: I4; riid: ^GUID; lcid: UI4; wFlags: UI2; pdispparams: ^DISPPARAMS; out pvarResult: ^Variant; out pexcepinfo: ^EXCEPINFO; out puArgErr: ^UINT); stdcall; function AttachEvent(pEventName: BSTR; pHandler: IDispatch): ^MIDEventHandler; stdcall; function InsertUser(pUser: ^MIDUser; bsGroupName: BSTR; nFlags: UI4; eUserType: MEUserType; bszInsertionNote: BSTR; pSink: IUnknown): ^MIDRequest; stdcall; function RemoveUser(pIUser: ^MIDUser; pSink: IUnknown): ^MIDRequest; stdcall; function ReplaceUser(pOldUser: ^MIDUser; pNewUser: ^MIDUser; pSink: IUnknown): ^MIDRequest; stdcall; function SendAuthorizationRequest(pUser: ^MIDUser; bszMessage: BSTR); stdcall; function PreauthorizeUser(pUser: ^MIDUser); stdcall; function FindUser(bszName: BSTR; nFlags: UI4): ^MIDUser; stdcall; function FindUsers(bszName: BSTR; nFlags: UI4): IDispatch; stdcall; function GetFrequentUsers(out nMax: UI4; out nFlags: UI4): ^MIDCollection; stdcall; function FindGroup(bszName: BSTR): ^MIDGroup; stdcall; function InsertGroup(bstrName: BSTR; pos: INT; pSink: IUnknown): ^MIDRequest; stdcall; function RemoveGroup(bstrName: BSTR; pSink: IUnknown): ^MIDRequest; stdcall; function MoveGroup(bstrName: BSTR; pos: INT; pSink: IUnknown): ^MIDRequest; stdcall; function MoveUser(pUser: ^MIDUser; bszGroupName: BSTR; pSink: IUnknown): ^MIDRequest; stdcall; function SortGroups; stdcall; ... // в конце CoClass MCApplication; GUID = {731A9926-454E-494F-A2AD-D2BC796BEDEA}; ... /////////////////////////////Часть файла TLH сгенерированного Microsoft Visual////////////// ... struct __declspec(uuid("613ac42f-72c3-42a1-8184-ac35d5b61c2b")) MIDApp : MIDScriptable { // // Wrapper methods for error-handling // HRESULT Init ( _bstr_t bszConfigDir ); VARIANT_BOOL Shutdown ( ); MIDOwnerPtr CreateOwner ( _bstr_t bsOwnerName, long flags ); IUnknownPtr GetService ( _bstr_t bstrServiceId ); HRESULT RegisterLastOwner ( struct MIDOwner * pOwner ); // // Raw methods provided by interface // virtual HRESULT __stdcall raw_Init ( /*[in]*/ BSTR bszConfigDir ) = 0; virtual HRESULT __stdcall raw_Shutdown ( /*[out,retval]*/ VARIANT_BOOL * pbCanceled ) = 0; virtual HRESULT __stdcall raw_CreateOwner ( /*[in]*/ BSTR bsOwnerName, /*[in]*/ long flags, /*[out,retval]*/ struct MIDOwner * * ppIOwner ) = 0; virtual HRESULT __stdcall raw_GetService ( /*[in]*/ BSTR bstrServiceId, /*[out,retval]*/ IUnknown * * ppIService ) = 0; virtual HRESULT __stdcall raw_RegisterLastOwner ( /*[in]*/ struct MIDOwner * pOwner ) = 0; }; struct __declspec(uuid("431890fc-b324-4553-9df5-93458c620587")) MIDScriptable : IDispatch { // // Wrapper methods for error-handling // MIDEventHandlerPtr AttachEvent ( _bstr_t pEventName, IDispatch * pHandler ); // // Raw methods provided by interface // virtual HRESULT __stdcall raw_AttachEvent ( /*[in]*/ BSTR pEventName, /*[in]*/ IDispatch * pHandler, /*[out,retval]*/ struct MIDEventHandler * * ppHandler ) = 0; }; struct __declspec(uuid("d7a21ea9-9701-4a3e-997d-4d0f2e4306a1")) MIDContactList : MIDScriptable { // // Wrapper methods for error-handling // MIDRequestPtr InsertUser ( struct MIDUser * pUser, _bstr_t bsGroupName, unsigned long nFlags, enum MEUserType eUserType, _bstr_t bszInsertionNote, IUnknown * pSink ); MIDRequestPtr RemoveUser ( struct MIDUser * pIUser, IUnknown * pSink ); MIDRequestPtr ReplaceUser ( struct MIDUser * pOldUser, struct MIDUser * pNewUser, IUnknown * pSink ); HRESULT SendAuthorizationRequest ( struct MIDUser * pUser, _bstr_t bszMessage ); HRESULT PreauthorizeUser ( struct MIDUser * pUser ); MIDUserPtr FindUser ( _bstr_t bszName, unsigned long nFlags ); IDispatchPtr FindUsers ( _bstr_t bszName, unsigned long nFlags ); MIDCollectionPtr GetFrequentUsers ( unsigned long nMax, unsigned long nFlags ); MIDGroupPtr FindGroup ( _bstr_t bszName ); MIDRequestPtr InsertGroup ( _bstr_t bstrName, int pos, IUnknown * pSink ); MIDRequestPtr RemoveGroup ( _bstr_t bstrName, IUnknown * pSink ); MIDRequestPtr MoveGroup ( _bstr_t bstrName, int pos, IUnknown * pSink ); MIDRequestPtr MoveUser ( struct MIDUser * pUser, _bstr_t bszGroupName, IUnknown * pSink ); HRESULT SortGroups ( ); // // Raw methods provided by interface // virtual HRESULT __stdcall raw_InsertUser ( /*[in]*/ struct MIDUser * pUser, /*[in]*/ BSTR bsGroupName, /*[in]*/ unsigned long nFlags, /*[in]*/ enum MEUserType eUserType, /*[in]*/ BSTR bszInsertionNote, /*[in]*/ IUnknown * pSink, /*[out,retval]*/ struct MIDRequest * * ppRequest ) = 0; virtual HRESULT __stdcall raw_RemoveUser ( /*[in]*/ struct MIDUser * pIUser, /*[in]*/ IUnknown * pSink, /*[out,retval]*/ struct MIDRequest * * ppRequest ) = 0; virtual HRESULT __stdcall raw_ReplaceUser ( /*[in]*/ struct MIDUser * pOldUser, /*[in]*/ struct MIDUser * pNewUser, /*[in]*/ IUnknown * pSink, /*[out,retval]*/ struct MIDRequest * * ppRequest ) = 0; virtual HRESULT __stdcall raw_SendAuthorizationRequest ( /*[in]*/ struct MIDUser * pUser, /*[in]*/ BSTR bszMessage ) = 0; virtual HRESULT __stdcall raw_PreauthorizeUser ( /*[in]*/ struct MIDUser * pUser ) = 0; virtual HRESULT __stdcall raw_FindUser ( /*[in]*/ BSTR bszName, /*[in]*/ unsigned long nFlags, /*[out,retval]*/ struct MIDUser * * ppIUser ) = 0; virtual HRESULT __stdcall raw_FindUsers ( /*[in]*/ BSTR bszName, /*[in]*/ unsigned long nFlags, /*[out,retval]*/ IDispatch * * ppIUserCollection ) = 0; virtual HRESULT __stdcall raw_GetFrequentUsers ( /*[in]*/ unsigned long nMax, /*[in]*/ unsigned long nFlags, /*[out,retval]*/ struct MIDCollection * * ppIUserCollection ) = 0; virtual HRESULT __stdcall raw_FindGroup ( /*[in]*/ BSTR bszName, /*[out,retval]*/ struct MIDGroup * * ppIGroup ) = 0; virtual HRESULT __stdcall raw_InsertGroup ( /*[in]*/ BSTR bstrName, /*[in]*/ int pos, /*[in]*/ IUnknown * pSink, /*[out,retval]*/ struct MIDRequest * * pRequest ) = 0; virtual HRESULT __stdcall raw_RemoveGroup ( /*[in]*/ BSTR bstrName, /*[in]*/ IUnknown * pSink, /*[out,retval]*/ struct MIDRequest * * pRequest ) = 0; ![]() |
|
Создано: 18 ноября 2007 17:37 · Личное сообщение · #2 ////// ПРОДОЛЖЕНИЕ НЕ ХВАТИЛО МЕСТА ДЛЯ ПОЛНОГО СООБЩЕНИЯ///////////////// virtual HRESULT __stdcall raw_MoveUser ( /*[in]*/ struct MIDUser * pUser, /*[in]*/ BSTR bszGroupName, /*[in]*/ IUnknown * pSink, /*[out,retval]*/ struct MIDRequest * * pRequest ) = 0; virtual HRESULT __stdcall raw_SortGroups ( ) = 0; }; ... extern "C" const GUID __declspec(selectany) IID_MIDApp = {0x613ac42f,0x72c3,0x42a1,{0x81,0x84,0xac,0x35,0xd5,0xb6,0x1c,0x2b}}; extern "C" const GUID __declspec(selectany) IID_MIDScriptable = {0x431890fc,0xb324,0x4553,{0x9d,0xf5,0x93,0x45,0x8c,0x62,0x05,0x87}}; extern "C" const GUID __declspec(selectany) IID_MIDContactList = {0xd7a21ea9,0x9701,0x4a3e,{0x99,0x7d,0x4d,0x0f,0x2e,0x43,0x06,0xa1}}; ... ///////////////////////////////Исходный код в DLL внедренной в чужой процесс/////////////////////////////// //код получения нужного интерфейса: #import "test.tlb" no_namespace named_guids typedef MIDApp* (__cdecl *LPGETMIDAPP)(void); #define MCoreDLL TEXT("MCoreLib.dll") void test1() { CoInitialize(NULL); HMODULE _hMCore = GetModuleHandle(MCoreDLL); LPGETMIDAPP GetMIDAppProc = (LPGETMIDAPP)GetProcAddress(_hMCore,"?GetApp@MNAppUtils@@YAPAUMIDApp@@ XZ"); //?GetApp@MNAppUtils@@YAPAUMIDApp@@XZ - функция в MCoreLib.dll возвращающая нужный интерфейс CComPtr<MIDApp> pMIDApp = GetMIDAppProc(); // Все ок получил интерфейс if(pMIDApp==NULL) return; CComQIPtr<MIDScriptable> pMIDScriptable = pMIDApp;// тоже нормально отрабатывает CComQIPtr<MIDUser> pMIDUser = pMIDScriptable; // NULL CComQIPtr<MIDContactList> pMIDContactList = pMIDScriptable; // NULL HRESULT Result = pMIDApp->Shutdown();// работает ок if( FAILED(Result) ) return; CoUninitialize(); } функция Shutdown работает отлично, но вот QueryInterface с любым другим GUID из того же TLB возвращает E_NOINTERFACE. Возможно что получение интерфейсов происходит через GetService но ведь неизвестно что нужно в нее передавать. Решил её перехватить по выше указанной статье из RSDN но в самом начале облом: /////////////////получение ICallInterceptor////////////////// #include <callobj.h> CComModule _Module; void test2() { _Module.Init(0, 0 ); { CComPtr<MIDApp> spFoo; HRESULT hr = spFoo.CoCreateInstance(__uuidof(MIDApp)); // возращает что класс не зарегистрирован CComPtr<ICallInterceptor> spInt; hr = CoGetInterceptor(__uuidof(MIDApp), 0, __uuidof(ICallInterceptor), // возвращает что файл не найден reinterpret_cast<void**>(&spInt)); } _Module.Term(); } Если есть у кого нибудь хоть какие-то идеи пишите... спасибо ![]() ![]() |
|
Создано: 26 ноября 2007 03:21 · Личное сообщение · #3 |
![]() |
eXeL@B —› Основной форум —› Исследование чужого приложения - COM |