Сейчас на форуме: subword, rtsgreg1989, zds, _MBK_ (+6 невидимых)

 eXeL@B —› Основной форум —› Исследование чужого приложения - COM
Посл.ответ Сообщение

Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 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;




Ранг: 5.0 (гость)
Активность: 0=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();
}

Если есть у кого нибудь хоть какие-то идеи пишите... спасибо




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 26 ноября 2007 03:21
· Личное сообщение · #3

Обычно, получив первый интерфейс ты вызываешь что-то что б получить след. GetService() как раз возвращает IUnknown. То есть, просишь что-то там по строке, получаешь IUnknown и потом делаешь QueryInterface() в то что нужно.

Посмотри что ожидает этот GetService() отлажчиком или IDA.


 eXeL@B —› Основной форум —› Исследование чужого приложения - COM
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати