如何 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;
}
...全文
414 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
知道的帮忙解答下哈
内容概要:本文详细介绍了Anaconda的下载、安装与配置方法(2025最新版)。Anaconda是一个开源的Python/R数据科学集成开发平台,预装了1500多个科学计算库,并提供conda包管理和环境管理功能。文章首先列出了系统要求,接着分别讲述了适用于不同操作系统的下载方式,包括官方下载和国内镜像下载。然后,具体讲解了Windows、macOS和Linux三种操作系统的安装步骤,以及环境变量的手动配置方法。此外,还提供了验证安装是否成功的命令和配置国内镜像源的方法,以提高下载速度。最后,列出了一些常用conda命令和常见问题的解决方案。 适合人群:从事数据科学、机器学习领域的研究人员和开发者,特别是需要频繁使用Python科学计算库的用户。 使用场景及目标:①帮助用户快速搭建Python开发环境,尤其是需要多个Python版本共存或隔离环境的情况下;②解决因网络原因导致的下载速度慢的问题;③提供详细的安装指南,确保安装过程顺利进行;④指导用户正确配置环境变量,避免常见的安装后无法使用的错误。 阅读建议:由于Anaconda涉及多平台安装和配置,建议读者根据自己的操作系统选择相应的章节重点阅读,并严格按照步骤操作。对于初次使用者,建议先从简单的安装入手,再逐步学习环境管理和包管理的相关命令。

65,186

社区成员

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

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