djalex777 писал(а):P.S. "Дерганье" реестра не рассматриваю
_declspec(dllexport) void _stdcall HookCOMTable(PDWORD pIntf, DWORD COMTableThunk, void* pNewFunc, PDWORD pOldMethodAddr)
{
PDWORD pTableThunk = (PDWORD)(*(PDWORD)(*pIntf)+COMTableThunk);
if(pOldMethodAddr!=NULL) *pOldMethodAddr = *pTableThunk;
DWORD op;
VirtualProtect(pTableThunk,4,PAGE_READWRITE,&op);
*pTableThunk = DWORD(pNewFunc);
...
}
...
Public Declare Sub HookCOMTable Lib "iehelper.dll" (ByRef pIntObj As Long, ByVal COMTableThunk As Long, ByVal pNewFunc As Long, pOldMethodAddr As Long)
...
'Вызов
...
tableInc = 24
ptrInvoke = ObjPtr(WB.Application)
HookCOMTable ptrInvoke, tableInc, AddressOf Disp_Invoke, oldInvokeMethod
...
'Функция Disp_Invoke
...
Public Function Disp_Invoke( _
ByVal This As Long, _
ByVal dispIdMember As Long, _
riid As olelib.UUID, _
ByVal lcid As Long, _
ByVal wFlags As Integer, _
pDispParams As olelib.DISPPARAMS, _
ByVal pVarResult As Long, _
pExcepInfo As olelib.EXCEPINFO, _
puArgErr As Long) As Long
Dim lw As Long
On Error Resume Next
lw = wFlags And DISPATCH_PROPERTYGET
If (lw) <> 0& And pVarResult <> 0& Then
Select Case dispIdMember
Case DISPID_AMBIENT_DLCONTROL:
'Вот тут я жду, что мне придет что-то
...
Case Else:
{INVOKE_ORIGINAL}
End Select
Else
{INVOKE_ORIGINAL}
End if
End Function
...
...
Dim iol As olelib.IOleControl
Set iol = WB.Application
iol.OnAmbientPropertyChange DISPID_AMBIENT_DLCONTROL
...
djalex777 писал(а):Перехват
- Код: Выделить всё
_declspec(dllexport) void _stdcall HookCOMTable(PDWORD pIntf, DWORD COMTableThunk, void* pNewFunc, PDWORD pOldMethodAddr)
{
PDWORD pTableThunk = (PDWORD)(*(PDWORD)(*pIntf)+COMTableThunk);
if(pOldMethodAddr!=NULL) *pOldMethodAddr = *pTableThunk;
DWORD op;
VirtualProtect(pTableThunk,4,PAGE_READWRITE,&op);
*pTableThunk = DWORD(pNewFunc);
...
}
_declspec(dllexport) void _stdcall HookCOMTable(LPDWORD &pVTbl, UINT iVTblIndex, DWORD pNewFunc, LPDWORD pOldMethodAddr)
{
DWORD op;
VirtualProtect(&pVTbl[iVTblIndex], sizeof(DWORD), PAGE_READWRITE, &op);
if(pOldMethodAddr != NULL) *pOldMethodAddr = pVTbl[iVTblIndex];
pVTbl[iVTblIndex] = pNewFunc;
...
}
...
Public Declare Sub HookCOMTable Lib "iehelper.dll" (ByVal Obj As IUnknown, ByVal iVTableIndex As Long, ByVal pNewFunc As Long, pOldMethodAddr As Long)
...
...
'Вызов
...
tableInc = 6
HookCOMTable WB.Application, tableInc, AddressOf Disp_Invoke, oldInvokeMethod
...
djalex777 писал(а):Всё нормально переадресуется в мою функцию, но Invoke с DISPID_AMBIENT_DLCONTROL не приходит.
Ещё вопрос - ObjPtr возвращает нам указатель на IUnknown?
Хакер писал(а):Сомнительно, что твой вариант работал, потому что у тебя было 24, а не 6. Соответственно, ты «перехватывал» какую-то чужую VTable.
djalex777 писал(а):6 по счету будет Invoke
djalex777 писал(а):но в таблице каждый адрес занимает 4 байта
djalex777 писал(а):поэтому к началу таблицы прибавляю 24
DWORD *a;
function(PDWORD pIntf, DWORD COMTableThunk)
...
PDWORD pTableThunk = (PDWORD)(*(PDWORD)(*pIntf)+COMTableThunk)
...
djalex777 писал(а):Тогда почему при передаче объекта WB (WebBrowser) в твою и мою функцию, они возвращают одинаковый адрес старой функции?
djalex777 писал(а):Твой вариант не работает с WB.Application - не переадресует в мою функцию.
Public Declare Sub HookCOMTable Lib "iehelper.dll" (ByVal obj As Any, ByVal iVTableIndex As Long, ByVal pNewFunc As Long, pOldMethodAddr As Long)
Сейчас этот форум просматривают: Google-бот и гости: 51