Анализ чужого приложения - COM

Тема в разделе "WASM.WIN32", создана пользователем atwista001, 18 ноя 2007.

  1. atwista001

    atwista001 New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    1
    Привет всем, может кто-нибудь поможет?
    Внедрил свою DLL в чужой процесс, проанализировав зависимости импортируемых библиотек и функции нашел функцию получения интерфейса главного приложения. в проект включил tlb файл выдранный из той же библиотеки, получил указатель на интерфейс, убедился в правельности полученного результата вызвав пару методов. Но вот проблема не могу получить указатели на другие интерфейсы - решил поставить перехватчики на некоторые методы интерфейса по статье http://rsdn.ru/article/com/comintercept.xml?print#EFC и тоже лажа. Любые идеи.:)
    Вот коды:
    Код (Text):
    1. /////////////////////////////Часть файла TLB нужного интерфеса//////////////
    2. // в начале
    3. MCore;
    4. GUID = {AE0A4503-EB6C-4A5B-BF8E-9D973EB73A04};
    5.  
    6. ...
    7.  
    8. Dispatch MIDApp;
    9. GUID = {613AC42F-72C3-42A1-8184-AC35D5B61C2B};
    10.   function QueryInterface(riid: ^GUID; out ppvObj: ^^VOID); stdcall;
    11.   function AddRef: UI4; stdcall;
    12.   function Release: UI4; stdcall;
    13.   function GetTypeInfoCount(out pctinfo: ^UINT); stdcall;
    14.   function GetTypeInfo(itinfo: UINT; lcid: UI4; out pptinfo: ^^VOID); stdcall;
    15.   function GetIDsOfNames(riid: ^GUID; rgszNames: ^^I1; cNames: UINT; lcid: UI4; out rgdispid: ^I4); stdcall;
    16.   function Invoke(dispidMember: I4; riid: ^GUID; lcid: UI4; wFlags: UI2; pdispparams: ^DISPPARAMS; out pvarResult: ^Variant; out pexcepinfo: ^EXCEPINFO; out puArgErr: ^UINT); stdcall;
    17.   function AttachEvent(pEventName: BSTR; pHandler: IDispatch): ^MIDEventHandler; stdcall;
    18.   function Init(out bszConfigDir: BSTR); stdcall;
    19.   function Shutdown: Bool; stdcall;
    20.   function CreateOwner(bsOwnerName: BSTR; flags: I4): ^MIDOwner; stdcall;
    21.   function GetService(bstrServiceId: BSTR): IUnknown; stdcall;
    22.   function RegisterLastOwner(pOwner: ^MIDOwner); stdcall;
    23.  
    24. Dispatch MIDScriptable;
    25. GUID = {431890FC-B324-4553-9DF5-93458C620587};
    26.   function QueryInterface(riid: ^GUID; out ppvObj: ^^VOID); stdcall;
    27.   function AddRef: UI4; stdcall;
    28.   function Release: UI4; stdcall;
    29.   function GetTypeInfoCount(out pctinfo: ^UINT); stdcall;
    30.   function GetTypeInfo(itinfo: UINT; lcid: UI4; out pptinfo: ^^VOID); stdcall;
    31.   function GetIDsOfNames(riid: ^GUID; rgszNames: ^^I1; cNames: UINT; lcid: UI4; out rgdispid: ^I4); stdcall;
    32.   function Invoke(dispidMember: I4; riid: ^GUID; lcid: UI4; wFlags: UI2; pdispparams: ^DISPPARAMS; out pvarResult: ^Variant; out pexcepinfo: ^EXCEPINFO; out puArgErr: ^UINT); stdcall;
    33.   function AttachEvent(pEventName: BSTR; pHandler: IDispatch): ^MIDEventHandler; stdcall;
    34.  
    35. Dispatch MIDContactList;
    36. GUID = {D7A21EA9-9701-4A3E-997D-4D0F2E4306A1};
    37.   function QueryInterface(riid: ^GUID; out ppvObj: ^^VOID); stdcall;
    38.   function AddRef: UI4; stdcall;
    39.   function Release: UI4; stdcall;
    40.   function GetTypeInfoCount(out pctinfo: ^UINT); stdcall;
    41.   function GetTypeInfo(itinfo: UINT; lcid: UI4; out pptinfo: ^^VOID); stdcall;
    42.   function GetIDsOfNames(riid: ^GUID; rgszNames: ^^I1; cNames: UINT; lcid: UI4; out rgdispid: ^I4); stdcall;
    43.   function Invoke(dispidMember: I4; riid: ^GUID; lcid: UI4; wFlags: UI2; pdispparams: ^DISPPARAMS; out pvarResult: ^Variant; out pexcepinfo: ^EXCEPINFO; out puArgErr: ^UINT); stdcall;
    44.   function AttachEvent(pEventName: BSTR; pHandler: IDispatch): ^MIDEventHandler; stdcall;
    45.   function InsertUser(pUser: ^MIDUser; bsGroupName: BSTR; nFlags: UI4; eUserType: MEUserType; bszInsertionNote: BSTR; pSink: IUnknown): ^MIDRequest; stdcall;
    46.   function RemoveUser(pIUser: ^MIDUser; pSink: IUnknown): ^MIDRequest; stdcall;
    47.   function ReplaceUser(pOldUser: ^MIDUser; pNewUser: ^MIDUser; pSink: IUnknown): ^MIDRequest; stdcall;
    48.   function SendAuthorizationRequest(pUser: ^MIDUser; bszMessage: BSTR); stdcall;
    49.   function PreauthorizeUser(pUser: ^MIDUser); stdcall;
    50.   function FindUser(bszName: BSTR; nFlags: UI4): ^MIDUser; stdcall;
    51.   function FindUsers(bszName: BSTR; nFlags: UI4): IDispatch; stdcall;
    52.   function GetFrequentUsers(out nMax: UI4; out nFlags: UI4): ^MIDCollection; stdcall;
    53.   function FindGroup(bszName: BSTR): ^MIDGroup; stdcall;
    54.   function InsertGroup(bstrName: BSTR; pos: INT; pSink: IUnknown): ^MIDRequest; stdcall;
    55.   function RemoveGroup(bstrName: BSTR; pSink: IUnknown): ^MIDRequest; stdcall;
    56.   function MoveGroup(bstrName: BSTR; pos: INT; pSink: IUnknown): ^MIDRequest; stdcall;
    57.   function MoveUser(pUser: ^MIDUser; bszGroupName: BSTR; pSink: IUnknown): ^MIDRequest; stdcall;
    58.   function SortGroups; stdcall;
    59.  
    60. ...
    61. // в конце
    62. CoClass MCApplication;
    63. GUID = {731A9926-454E-494F-A2AD-D2BC796BEDEA};
    64.  
    65. ...
    66.  
    67. /////////////////////////////Часть файла TLH сгенерированного Microsoft Visual//////////////
    68.  
    69. ...
    70.  
    71. struct __declspec(uuid("613ac42f-72c3-42a1-8184-ac35d5b61c2b"))
    72. MIDApp : MIDScriptable
    73. {
    74.     //
    75.     // Wrapper methods for error-handling
    76.     //
    77.  
    78.     HRESULT Init (
    79.         _bstr_t bszConfigDir );
    80.     VARIANT_BOOL Shutdown ( );
    81.     MIDOwnerPtr CreateOwner (
    82.         _bstr_t bsOwnerName,
    83.         long flags );
    84.     IUnknownPtr GetService (
    85.         _bstr_t bstrServiceId );
    86.     HRESULT RegisterLastOwner (
    87.         struct MIDOwner * pOwner );
    88.  
    89.     //
    90.     // Raw methods provided by interface
    91.     //
    92.  
    93.       virtual HRESULT __stdcall raw_Init (
    94.         /*[in]*/ BSTR bszConfigDir ) = 0;
    95.       virtual HRESULT __stdcall raw_Shutdown (
    96.         /*[out,retval]*/ VARIANT_BOOL * pbCanceled ) = 0;
    97.       virtual HRESULT __stdcall raw_CreateOwner (
    98.         /*[in]*/ BSTR bsOwnerName,
    99.         /*[in]*/ long flags,
    100.         /*[out,retval]*/ struct MIDOwner * * ppIOwner ) = 0;
    101.       virtual HRESULT __stdcall raw_GetService (
    102.         /*[in]*/ BSTR bstrServiceId,
    103.         /*[out,retval]*/ IUnknown * * ppIService ) = 0;
    104.       virtual HRESULT __stdcall raw_RegisterLastOwner (
    105.         /*[in]*/ struct MIDOwner * pOwner ) = 0;
    106. };
    107.  
    108. struct __declspec(uuid("431890fc-b324-4553-9df5-93458c620587"))
    109. MIDScriptable : IDispatch
    110. {
    111.     //
    112.     // Wrapper methods for error-handling
    113.     //
    114.  
    115.     MIDEventHandlerPtr AttachEvent (
    116.         _bstr_t pEventName,
    117.         IDispatch * pHandler );
    118.  
    119.     //
    120.     // Raw methods provided by interface
    121.     //
    122.  
    123.       virtual HRESULT __stdcall raw_AttachEvent (
    124.         /*[in]*/ BSTR pEventName,
    125.         /*[in]*/ IDispatch * pHandler,
    126.         /*[out,retval]*/ struct MIDEventHandler * * ppHandler ) = 0;
    127. };
    128.  
    129. struct __declspec(uuid("d7a21ea9-9701-4a3e-997d-4d0f2e4306a1"))
    130. MIDContactList : MIDScriptable
    131. {
    132.     //
    133.     // Wrapper methods for error-handling
    134.     //
    135.  
    136.     MIDRequestPtr InsertUser (
    137.         struct MIDUser * pUser,
    138.         _bstr_t bsGroupName,
    139.         unsigned long nFlags,
    140.         enum MEUserType eUserType,
    141.         _bstr_t bszInsertionNote,
    142.         IUnknown * pSink );
    143.     MIDRequestPtr RemoveUser (
    144.         struct MIDUser * pIUser,
    145.         IUnknown * pSink );
    146.     MIDRequestPtr ReplaceUser (
    147.         struct MIDUser * pOldUser,
    148.         struct MIDUser * pNewUser,
    149.         IUnknown * pSink );
    150.     HRESULT SendAuthorizationRequest (
    151.         struct MIDUser * pUser,
    152.         _bstr_t bszMessage );
    153.     HRESULT PreauthorizeUser (
    154.         struct MIDUser * pUser );
    155.     MIDUserPtr FindUser (
    156.         _bstr_t bszName,
    157.         unsigned long nFlags );
    158.     IDispatchPtr FindUsers (
    159.         _bstr_t bszName,
    160.         unsigned long nFlags );
    161.     MIDCollectionPtr GetFrequentUsers (
    162.         unsigned long nMax,
    163.         unsigned long nFlags );
    164.     MIDGroupPtr FindGroup (
    165.         _bstr_t bszName );
    166.     MIDRequestPtr InsertGroup (
    167.         _bstr_t bstrName,
    168.         int pos,
    169.         IUnknown * pSink );
    170.     MIDRequestPtr RemoveGroup (
    171.         _bstr_t bstrName,
    172.         IUnknown * pSink );
    173.     MIDRequestPtr MoveGroup (
    174.         _bstr_t bstrName,
    175.         int pos,
    176.         IUnknown * pSink );
    177.     MIDRequestPtr MoveUser (
    178.         struct MIDUser * pUser,
    179.         _bstr_t bszGroupName,
    180.         IUnknown * pSink );
    181.     HRESULT SortGroups ( );
    182.  
    183.     //
    184.     // Raw methods provided by interface
    185.     //
    186.  
    187.       virtual HRESULT __stdcall raw_InsertUser (
    188.         /*[in]*/ struct MIDUser * pUser,
    189.         /*[in]*/ BSTR bsGroupName,
    190.         /*[in]*/ unsigned long nFlags,
    191.         /*[in]*/ enum MEUserType eUserType,
    192.         /*[in]*/ BSTR bszInsertionNote,
    193.         /*[in]*/ IUnknown * pSink,
    194.         /*[out,retval]*/ struct MIDRequest * * ppRequest ) = 0;
    195.       virtual HRESULT __stdcall raw_RemoveUser (
    196.         /*[in]*/ struct MIDUser * pIUser,
    197.         /*[in]*/ IUnknown * pSink,
    198.         /*[out,retval]*/ struct MIDRequest * * ppRequest ) = 0;
    199.       virtual HRESULT __stdcall raw_ReplaceUser (
    200.         /*[in]*/ struct MIDUser * pOldUser,
    201.         /*[in]*/ struct MIDUser * pNewUser,
    202.         /*[in]*/ IUnknown * pSink,
    203.         /*[out,retval]*/ struct MIDRequest * * ppRequest ) = 0;
    204.       virtual HRESULT __stdcall raw_SendAuthorizationRequest (
    205.         /*[in]*/ struct MIDUser * pUser,
    206.         /*[in]*/ BSTR bszMessage ) = 0;
    207.       virtual HRESULT __stdcall raw_PreauthorizeUser (
    208.         /*[in]*/ struct MIDUser * pUser ) = 0;
    209.       virtual HRESULT __stdcall raw_FindUser (
    210.         /*[in]*/ BSTR bszName,
    211.         /*[in]*/ unsigned long nFlags,
    212.         /*[out,retval]*/ struct MIDUser * * ppIUser ) = 0;
    213.       virtual HRESULT __stdcall raw_FindUsers (
    214.         /*[in]*/ BSTR bszName,
    215.         /*[in]*/ unsigned long nFlags,
    216.         /*[out,retval]*/ IDispatch * * ppIUserCollection ) = 0;
    217.       virtual HRESULT __stdcall raw_GetFrequentUsers (
    218.         /*[in]*/ unsigned long nMax,
    219.         /*[in]*/ unsigned long nFlags,
    220.         /*[out,retval]*/ struct MIDCollection * * ppIUserCollection ) = 0;
    221.       virtual HRESULT __stdcall raw_FindGroup (
    222.         /*[in]*/ BSTR bszName,
    223.         /*[out,retval]*/ struct MIDGroup * * ppIGroup ) = 0;
    224.       virtual HRESULT __stdcall raw_InsertGroup (
    225.         /*[in]*/ BSTR bstrName,
    226.         /*[in]*/ int pos,
    227.         /*[in]*/ IUnknown * pSink,
    228.         /*[out,retval]*/ struct MIDRequest * * pRequest ) = 0;
    229.       virtual HRESULT __stdcall raw_RemoveGroup (
    230.         /*[in]*/ BSTR bstrName,
    231.         /*[in]*/ IUnknown * pSink,
    232.         /*[out,retval]*/ struct MIDRequest * * pRequest ) = 0;
    233.       virtual HRESULT __stdcall raw_MoveGroup (
    234.         /*[in]*/ BSTR bstrName,
    235.         /*[in]*/ int pos,
    236.         /*[in]*/ IUnknown * pSink,
    237.         /*[out,retval]*/ struct MIDRequest * * pRequest ) = 0;
    238.       virtual HRESULT __stdcall raw_MoveUser (
    239.         /*[in]*/ struct MIDUser * pUser,
    240.         /*[in]*/ BSTR bszGroupName,
    241.         /*[in]*/ IUnknown * pSink,
    242.         /*[out,retval]*/ struct MIDRequest * * pRequest ) = 0;
    243.       virtual HRESULT __stdcall raw_SortGroups ( ) = 0;
    244. };
    245.  
    246. ...
    247.  
    248. extern "C" const GUID __declspec(selectany) IID_MIDApp =
    249.     {0x613ac42f,0x72c3,0x42a1,{0x81,0x84,0xac,0x35,0xd5,0xb6,0x1c,0x2b}};
    250. extern "C" const GUID __declspec(selectany) IID_MIDScriptable =
    251.     {0x431890fc,0xb324,0x4553,{0x9d,0xf5,0x93,0x45,0x8c,0x62,0x05,0x87}};
    252. extern "C" const GUID __declspec(selectany) IID_MIDContactList =
    253.     {0xd7a21ea9,0x9701,0x4a3e,{0x99,0x7d,0x4d,0x0f,0x2e,0x43,0x06,0xa1}};
    254.  
    255. ...
    256.  
    257. ///////////////////////////////Исходный код в DLL  внедренной в чужой процесс///////////////////////////////
    258. //код получения нужного интерфейса:
    259.  
    260. #import "test.tlb" no_namespace named_guids
    261.  
    262. typedef MIDApp* (__cdecl *LPGETMIDAPP)(void);
    263.  
    264. #define     MCoreDLL        TEXT("MCoreLib.dll")
    265.  
    266. void test1()
    267. {
    268.         CoInitialize(NULL);
    269.  
    270.         HMODULE _hMCore = GetModuleHandle(MCoreDLL);
    271.     LPGETMIDAPP GetMIDAppProc = (LPGETMIDAPP)GetProcAddress(_hMCore,"?GetApp@MNAppUtils@@YAPAUMIDApp@@XZ");
    272.        //?GetApp@MNAppUtils@@YAPAUMIDApp@@XZ - функция в MCoreLib.dll возвращающая нужный интерфейс
    273.  
    274.     CComPtr<MIDApp> pMIDApp = GetMIDAppProc(); // Все ок получил интерфейс
    275.         if(pMIDApp==NULL)
    276.            return;
    277.  
    278.     CComQIPtr<MIDScriptable> pMIDScriptable = pMIDApp;// тоже нормально отрабатывает
    279.  
    280.         CComQIPtr<MIDUser> pMIDUser = pMIDScriptable; // NULL
    281.         CComQIPtr<MIDContactList> pMIDContactList = pMIDScriptable; // NULL
    282.  
    283.         HRESULT Result = pMIDApp->Shutdown();// работает ок
    284.     if( FAILED(Result) )
    285.         return;
    286.  
    287.         CoUninitialize();
    288. }
    функция Shutdown работает отлично, но вот QueryInterface с любым другим GUID из того же TLB возвращает E_NOINTERFACE.
    Возможно что получение интерфейсов происходит через GetService но ведь неизвестно что нужно в нее передавать.
    Решил её перехватить по выше указанной статье из RSDN но в самом начале облом:

    Код (Text):
    1. /////////////////получение ICallInterceptor//////////////////
    2. #include <callobj.h>
    3. CComModule _Module;
    4. void test2()
    5. {
    6.   _Module.Init(0, 0 );
    7.   {
    8.     CComPtr<MIDApp> spFoo;
    9.     HRESULT hr = spFoo.CoCreateInstance(__uuidof(MIDApp)); // возращает что класс не зарегистрирован
    10.  
    11.     CComPtr<ICallInterceptor> spInt;
    12.     hr = CoGetInterceptor(__uuidof(MIDApp), 0, __uuidof(ICallInterceptor), // возвращает что файл не найден
    13.       reinterpret_cast<void**>(&spInt));
    14.   }
    15.   _Module.Term();
    16. }
    Если есть у кого нибудь хоть какие-то идеи пишите... спасибо:)