Реферат: Перехват методов COM интерфейсов
static ThunkVtbl vtbl;
};
__declspec(selectany) ThunkVtbl
ItfThunk::vtbl(reinterpret_cast<DWORD_PTR>(ItfThunk::thunk));
__declspec(selectany) TlsStorage<ItfThunk::CallInfo> ItfThunk::storage;
Переменная-член ThunkVtbl* vptr имитирует указатель vptr на таблицу виртуальных функций “обычного” C++-класса, структура CallInfo хранит информацию, необходимую для постобработки вызова. Нам осталось рассмотреть лишь реализацию статического метода void thunk(), выполняющего универсальный перехват. Перед вызовом этого перехватчика в стеке находятся параметры для исходного метода, указатель на this, адрес возврата в клиентский код и n – порядковый номер метода (который положил в стек vthunk):
Рисунок 3. Стек вызова
__declspec(naked) void ItfThunk::thunk() { __asm { push [esp] // кладемвстек n (параметрметода preprocess) push [esp+0Ch] // кладемвстек this длявызова preprocess call preprocess // вызываем ItfThunk::preprocess(n) call store // вызываем ItfThunk::store mov eax, [esp+8] // заменяем this встекенаисходный mov eax, [eax+4] // из переменной ItfThunk::m_p mov [esp+8], eax lea eax, post_thunk // заменяем адрес возврата на post_thunk mov [esp+4], eax mov eax,[esp+8] // получаем vptr из исходного указателя mov eax, [eax] pop ecx // убираем из стека лишний параметр n mov eax, [eax+4*ecx] // полчаем адрес метода из vtbl jmp eax // переходим в исходный метод post_thunk: sub esp, 10h // выделяем в стеке место для CallInfo push esp К-во Просмотров: 671
Бесплатно скачать Реферат: Перехват методов COM интерфейсов
|