COM ATL IDispatch Invoke 钩子

对于 HOOK IDispatch.Invoke方法相比IDispatchEx要简单很多,查找函数地址也容易一些,毕竟IDispatchEx是IDispatch的扩展,关于IDispatchEx.InvokeEx钩子及代码参看

http://blog.csdn.net/zhoujianhei/archive/2008/01/16/2046320.aspx

现对其代码进行修改以完成对IDispatch.Invoke函数挂钩,修改方法如下:

 

第一步:

struct DispStr

{

LPDWORD lpVtbl;

};

 

第二步:

PROC* GetOrgAddr(IDispatch* pDisp)

{

DispStr* pStr = (DispStr*)pDisp;

LPDWORD lpVtabl = pStr->lpVtbl;

PROC* ppfn = (PROC* )(lpVtabl + 6); return ppfn;

}

 

第三步:

HRESULT __CALLTYPE Hook_Invoke(IDispatch *This, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)

{

if(m_hook.m_pDisp != This)

{

TRACE("Warning:m_pDisp != this !!!/n"); // __cdecl

HRESULT hr = ((pfnInvoke )m_hook.m_pfnOrg)(This, dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);

return hr;

}

// ......

HRESULT hr = ((pfnInvoke )m_hook.m_pfnOrg)(This, dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);

return hr;

}

 

注意:

WriteProcessMemory如果失败,使用VirtualProtect将目标地址修改为可读写,如下:

DWORD old = 0;

VirtualProtect(ppfn, sizeof(PROC), PAGE_READWRITE, &old);

WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew, sizeof(PROC), NULL);

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值