如何 hook com IFileOpenDialog 接口的GetResults函数,请帮忙解答下,急

lck2015 2015-07-01 10:33:55
为什么我的程序 hook com的 IFileOpenDialog 接口的GetResults函数呢,是不是我的变更虚函数表HookVtbl参数不正确啊,请帮忙解答下,急

int HookVtbl(void* pObject, unsigned int classIdx, unsigned int methodIdx,unsigned int newMethod);
typedef HRESULT (__stdcall* PGetResults)(IFileOpenDialog*, IShellItemArray**);
static PGetResults GetResults_old = NULL;
#define HOOK(a, b) b##_old = (P##b)HookVtbl(a, 2, 23, (unsigned int)b##_new) //----是不是这块参数不正确啊

HRESULT __stdcall GetResults_new(IFileOpenDialog *pThis,
IShellItemArray **ppenum)
{
OutputDebugStringA("调用了 GetResults_new ");
HRESULT hr = GetResults_old(pThis, ppenum);
return hr;
}


BOOL WINAPI StartHook()
{
PVOID pInterface = NULL;
CoInitialize(NULL);
//CLSCTX_ALL
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_SERVER, IID_IFileOpenDialog, &pInterface);
if(FAILED(hr))
{
OutputDebugStringA("CoCreateInstance 失败");
return FALSE;
}
HOOK(pInterface, GetResults);
return TRUE;
}


int HookVtbl(void* pObject, unsigned int classIdx, unsigned int methodIdx,unsigned int newMethod)
{
int** vtbl = (int**)pObject;
DWORD oldProtect = 0;
int oldMethod = vtbl[classIdx][methodIdx];
VirtualProtect(vtbl[classIdx] + sizeof(int*) * methodIdx, sizeof(int*), PAGE_READWRITE, &oldProtect);
vtbl[classIdx][methodIdx] = newMethod;
VirtualProtect(vtbl[classIdx] + sizeof(int*) * methodIdx, sizeof(int*), oldProtect, &oldProtect);
return oldMethod;
}
...全文
354 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-07-06
  • 打赏
  • 举报
回复
lck2015 2015-07-04
  • 打赏
  • 举报
回复
引用 6 楼 fly_dragon_fly 的回复:
[quote=引用 5 楼 lck2015 的回复:] [quote=引用 4 楼 fly_dragon_fly 的回复:] [quote=引用 3 楼 lck2015 的回复:] [quote=引用 2 楼 fly_dragon_fly 的回复:] 看了一下, 32位下是这样的 mov eax,dword ptr [ecx+50h] call eax
To fly_dragon_fly: 我没看懂你说的,能不能详细说下我的程序该怎么改啊,麻烦你了[/quote] HookVtbl(a, 0,20[/quote] 试了一下,还是不行啊[/quote] 这种只能修改当前创建的interface的vptr, 可能你需要的是修改所有接口的vptr,那么你只能通过搜索特殊的标识来找到这个地址改,或者仅针对某一特定版本,用反编译工具找出来[/quote] 说下我的需求吧:我的需求是拦截webmail,检测附件是否安全,所以用户在网页版的邮箱中选择附件后,我需要拦截住,并且获取到附件地址,检测安全后再放行,如果检测不安全,则拦截。
fly_dragon_fly 2015-07-03
  • 打赏
  • 举报
回复
引用 3 楼 lck2015 的回复:
[quote=引用 2 楼 fly_dragon_fly 的回复:] 看了一下, 32位下是这样的 mov eax,dword ptr [ecx+50h] call eax
To fly_dragon_fly: 我没看懂你说的,能不能详细说下我的程序该怎么改啊,麻烦你了[/quote] HookVtbl(a, 0,20
fly_dragon_fly 2015-07-03
  • 打赏
  • 举报
回复
引用 5 楼 lck2015 的回复:
[quote=引用 4 楼 fly_dragon_fly 的回复:] [quote=引用 3 楼 lck2015 的回复:] [quote=引用 2 楼 fly_dragon_fly 的回复:] 看了一下, 32位下是这样的 mov eax,dword ptr [ecx+50h] call eax
To fly_dragon_fly: 我没看懂你说的,能不能详细说下我的程序该怎么改啊,麻烦你了[/quote] HookVtbl(a, 0,20[/quote] 试了一下,还是不行啊[/quote] 这种只能修改当前创建的interface的vptr, 可能你需要的是修改所有接口的vptr,那么你只能通过搜索特殊的标识来找到这个地址改,或者仅针对某一特定版本,用反编译工具找出来
lck2015 2015-07-03
  • 打赏
  • 举报
回复
引用 4 楼 fly_dragon_fly 的回复:
[quote=引用 3 楼 lck2015 的回复:] [quote=引用 2 楼 fly_dragon_fly 的回复:] 看了一下, 32位下是这样的 mov eax,dword ptr [ecx+50h] call eax
To fly_dragon_fly: 我没看懂你说的,能不能详细说下我的程序该怎么改啊,麻烦你了[/quote] HookVtbl(a, 0,20[/quote] 试了一下,还是不行啊
lck2015 2015-07-02
  • 打赏
  • 举报
回复
引用 2 楼 fly_dragon_fly 的回复:
看了一下, 32位下是这样的 mov eax,dword ptr [ecx+50h] call eax
To fly_dragon_fly: 我没看懂你说的,能不能详细说下我的程序该怎么改啊,麻烦你了
fly_dragon_fly 2015-07-02
  • 打赏
  • 举报
回复
看了一下, 32位下是这样的 mov eax,dword ptr [ecx+50h] call eax
lck2015 2015-07-02
  • 打赏
  • 举报
回复
知道的帮忙解答下哈

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧