gpt4 book ai didi

c++ - 如何使用多线程正确挂接 WinInet?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:51 29 4
gpt4 key购买 nike

我已经为 Internet Explorer 编写了一个 BHO,它 Hook WinInet 以修改来自 IE 的一些 HTTP 请求,方法是将它们重定向到内部服务器。

当我在 IE 中打开前 3 个选项卡时它工作正常,因为为每个选项卡创建了一个新的 iexplore.exe 进程,每个进程加载 BHO。

当有超过 4 个选项卡时会出现问题:不是创建新的 iexplore.exe 进程,而是在不同线程中重新使用现有进程。我可以多次 Hook 同一个进程(每个线程 1 个),也可以只 Hook 一次。在这两种情况下,崩溃都会在选项卡关闭时发生。

示例:打开选项卡 1(单独的 iepxlore.exe)、2(单独的 iepxlore.exe)、3(单独的 iepxlore.exe)和 4(与选项卡 1 共享 iexplore)。关闭选项卡 1。刷新选项卡 4,IE 在 NDTDLL.DLL 中崩溃。如果我在 Hook 的 WinInet.ddl 中不做任何事情(只需调用旧函数),就会发生崩溃

如果我只在每个 iexplore.exe 进程中 Hook WinInet 一次,我就无法拦截所有选项卡中的请求。

我想知道继续进行的最佳方式是什么。到目前为止,我发现的所有示例都假设每个选项卡有 1 个 iexpolore.exe 进程。

WinInet 钩子(Hook)代码基于 Code Project example , 我只是 hook 了更少的函数。

看起来指向旧 WinInet 函数或我创建的函数的指针不再有效。

最佳答案

假设您从 codeproject.com 获取了大部分示例代码,您有一个严重的清理问题。

这就是发生的事情:

  1. 当您打开标签页时,您的 BHO 会加载。
  2. g_oHook 对象(静态)被初始化。它的初始化在所有模块中设置 Hook (即在当前进程中的所有其他 DLL 中)。
  3. 通过设置 Hook ,我的意思是修改 IAT(导入地址表)中的条目。它们现在指向您在 DLL 中的函数(记住:当您从一个 DLL 调用另一个 DLL 时,您通过 IAT(
  4. 然后您关闭该选项卡。正在卸载您的 DLL。
  5. ntdll.dll 的IAT 中的地址仍然指向您自己的DLL 的旧位置中的内存空间,该位置现在不存在。 IE 第一次尝试调用其中一个函数时出现错误

为了修复,需要在CWininetHook::~CWininetHook的销毁中实现一个清理逻辑。只做构造函数所做的,并返回原始地址。

关于c++ - 如何使用多线程正确挂接 WinInet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13244614/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com