вторник, 30 ноября 2010 г.

идентификация vtbl OLE интерфейсов

нас тут отдельные несознательные граждане спрашивают - вот например внутри activex дико много всяких vtbl - как узнать какая какому именно интерфейсу соответствует ?
Можно подумать за 11 лет в ole появилось что-то новое
Но тем не менее я заметил тут одну интересную фишку, значительно облегчающую subj для activex, написанных с применением mfc
Возьмем например запущенный случай - AcroPDF.dll от империи зла, которая сроду никому и никогда .pdb от своих [censored] продуктов не дает в отличие от империи добра

Например довольно скоро можно заметить примерно такую табличку (особенно быстро таблица находится если искать IID IDispatch, IViewObjectEx и прочих must implement интерфейсов):

off_1003C540    dd offset IID_IAcroAXDocShim
                dd 78h
                dd 1
                dd offset IID_IDispatch
                dd 78h
                dd 1
                dd offset IID_IViewObjectEx
                dd 0A4h
                dd 1
                dd offset IID_IViewObject2
                dd 0A4h
                dd 1
                dd offset IID_IViewObject
                dd 0A4h
                dd 1
                dd offset IID_IOleInPlaceObject
                dd 84h
                dd 1
                dd offset IID_IOleInPlaceActiveObject
                dd 88h
                dd 1
                dd offset IID_IOleControl
                dd 0A0h
                dd 1
                dd offset IID_IOleObject
                dd 80h
                dd 1
                dd offset IID_IDataObject
                dd 7Ch
                dd 1
                dd offset IID_IOleInPlaceObjectWindowless
                dd 84h
                dd 1
                dd offset IID_IOleWindow
                dd 84h
                dd 1
                dd offset IID_IPersistStreamInit
                dd 94h
                dd 1
                dd offset IID_IPersistMoniker
                dd 9Ch
                dd 1
                dd offset IID_IPersistPropertyBag
                dd 98h
                dd 1
                dd offset IID_ISupportErrorInfo
                dd 0A8h
                dd 1
                dd offset IID_IConnectionPointContainer
                dd 0ACh
                dd 1
                dd offset IID_ISpecifyPropertyPages
                dd 0B0h
                dd 1
                dd offset IID_IQuickActivate
                dd 0B4h
                dd 1
                dd offset IID_IProvideClassInfo
                dd 0B8h
                dd 1
                dd offset IID_IProvideClassInfo2
                dd 0B8h
                dd 1
                dd offset IID_IOleDocument
                dd 8Ch
                dd 1
                dd offset IID_IOleDocumentView

                dd 90h
                dd 1
                dd offset IID_IOleCommandTarget
                dd 0BCh
                dd 1
                dd offset IID_IObjectSafety
                dd 0C8h
                dd 1
                dd offset IID_IPersistFile
                dd 0C4h
                dd 1
                dd offset IID_IPersist
                dd 0C4h
                dd 1
                dd offset IID_IMonikerProp
                dd 0C0h
                dd 1

Ссылки на IID я переименовал по их именам (не вручную есс-но)
Например что можно заметить из этой таблицы ? Вот скажем  IID_IAcroAXDocShim и IID_IDispatch имеют одинаковое значение во втором поле - 0x78, что логично - IAcroAXDocShim унаследован от IDispatch. Аналогично IOleInPlaceObjectWindowless унаследован от IOleInPlaceObject, который унаследован от IOleWindow
А чтобы пазл сошелся - приведу кусочек конструктора, который расставляет vtbl интерейсов по местам:

                mov     dword ptr [eax], offset off_1003C524
                mov     ecx, [ebp+var_4]
                mov     dword ptr [ecx+48h], offset off_1003C510
                mov     edx, [ebp+var_4]
                mov     dword ptr [edx+6Ch], offset off_1003C4EC
                mov     eax, [ebp+var_4]
                mov     dword ptr [eax+78h], offset off_1003C44C ; IAcroAXDocShim vtbl
                mov     ecx, [ebp+var_4]
                mov     dword ptr [ecx+7Ch], offset off_1003C418
                mov     edx, [ebp+var_4]
                mov     dword ptr [edx+80h], offset off_1003C3B4
                mov     eax, [ebp+var_4]
                mov     dword ptr [eax+84h], offset off_1003C380
                mov     ecx, [ebp+var_4]
                mov     dword ptr [ecx+88h], offset off_1003C354 ; IOleInPlaceActiveObject vtbl
                mov     edx, [ebp+var_4]
                mov     dword ptr [edx+8Ch], offset off_1003C338 ; IOleDocument vtbl
                mov     eax, [ebp+var_4]
                mov     dword ptr [eax+90h], offset off_1003C2F4 ; IOleDocumentView vtbl
                mov     ecx, [ebp+var_4]
                mov     dword ptr [ecx+94h], offset off_1003C2CC
                mov     edx, [ebp+var_4]
                mov     dword ptr [edx+98h], offset off_1003C2AC ; IPersistPropertyBag vtbl
                mov     eax, [ebp+var_4]
                mov     dword ptr [eax+9Ch], offset off_1003C284 ; IPersistMoniker vtbl
                mov     ecx, [ebp+var_4]
                mov     dword ptr [ecx+0A0h], offset off_1003C264
                mov     edx, [ebp+var_4]
                mov     dword ptr [edx+0A4h], offset off_1003C224
                mov     eax, [ebp+var_4]
                mov     dword ptr [eax+0A8h], offset off_1003C20C
                mov     ecx, [ebp+var_4]
                mov     dword ptr [ecx+0ACh], offset off_1003C1F4
                mov     edx, [ebp+var_4]
                mov     dword ptr [edx+0B0h], offset off_1003C1E0
                mov     eax, [ebp+var_4]
                mov     dword ptr [eax+0B4h], offset off_1003C1C4
                mov     ecx, [ebp+var_4]
                mov     dword ptr [ecx+0B8h], offset off_1003C1AC
                mov     edx, [ebp+var_4]
                mov     dword ptr [edx+0BCh], offset off_1003C194
                mov     eax, [ebp+var_4]
                mov     dword ptr [eax+0C0h], offset off_1003C180
                mov     ecx, [ebp+var_4]
                mov     dword ptr [ecx+0C4h], offset off_1003C158
                mov     edx, [ebp+var_4]
                mov     dword ptr [edx+0C8h], offset off_1003C140

Все понятно, да ?
Для интересующихся почему это именно так рекомендую покурить afxwin.h из хидеров atlmfc на предмет макросов BEGIN_INTERFACE_PART, INIT_INTERFACE_PART, END_INTERFACE_PART и структуры AFX_INTERFACEMAP_ENTRY

1 комментарий: