挂钩 InternetOpenUrl

Posted

技术标签:

【中文标题】挂钩 InternetOpenUrl【英文标题】:Hooking InternetOpenUrl 【发布时间】:2017-01-09 01:52:05 【问题描述】:

我正在编写一个应将InternetOpenUrlInternetReadFile 挂接到另一个进程的应用程序。

InternetOpenUrl 的挂钩版本中,它会检查传递给它的lpszUrl 是否与正则表达式匹配。如果匹配,记录实际InternetOpenUrl返回的句柄。

然后在InternetReadFile 的挂钩版本中,如果hFile 参数等于记录的句柄,它将从文件中读取而不是调用实际的InternetReadFile

我发现Windows在调用InternetOpenUrl时会立即尝试连接到提供的服务器,如果连接失败,该函数将返回NULL

但我希望这种机制即使在没有 Internet 连接的情况下也能工作,所以当正则表达式匹配时,我似乎无法通过在我的钩子中调用实际的 InternetOpenUrl 来获得句柄。

那么我怎样才能让它工作呢?

更新:

现在我打电话给InternetOpen 来获取一个虚拟句柄。 InternetOpenInternetOpenUrl 返回的句柄似乎不相等。

但我不确定是否有保障,正在寻找更好的选择。

【问题讨论】:

InternetOpen 的打开句柄不可能与InternetOpenUrl 的打开句柄具有相同的值,因为它们都被同一个函数 InternetCloseHandle 关闭。 您无法伪造打开的句柄,除非您挂钩所有其他互联网功能以识别伪造的句柄。您不能混合句柄类型,其他函数需要真正的 Internet 句柄。 @Harry 您的评论要么缺少否定词,要么写错了,或者其他什么,因为具有相同的结束函数意味着相似性,而不是相异性——尽管当然不能保证任何形式的交叉兼容性. @RemyLebeau 我想我只需要挂钩InternetReadFileInternetOpenUrl 因为目标应用程序只是使用句柄来下载文件。其实我已经尝试过在WinINet中hook其他函数,看看是否调用了其他函数。 @Stalker 然后我建议让钩子InternetOpenUrl()CreateFile() 返回所需文件的句柄,然后你可以钩子HttpQueryInfo() 返回文件长度,钩子InternetReadFile() 到调用ReadFile(),并挂接InternetCloseHandle() 调用CloseHandle() 【参考方案1】:

因此,您正在尝试将 URL 查询重定向到文件...您始终可以托管该文件,那么在任何一种情况下都可以保证您的句柄有效。但是,假设是本地文件,我认为如果您在 URL 中指定 "file://" 协议,它可能会以您想要的方式工作。

【讨论】:

“file://”解决方案看起来很棒。我不知道 InternetOpenUrl 支持它。我试试看。 哦,坏消息...我刚刚发现目标应用程序调用HttpQueryInfo 来获取文件长度。我不认为“file://”可以解决这个问题。 让我们知道结果如何。 该死...我的 Visual Studio 拒绝工作。我必须先修复它,然后才能重新开始。 目标进程可以使用“file://”下载文件!非常感谢你! HttpQueryInfo 暂时不工作,但我可以钩住它让它工作。

以上是关于挂钩 InternetOpenUrl的主要内容,如果未能解决你的问题,请参考以下文章

如何识别上下文是来自身份验证挂钩(某些挂钩)还是其他挂钩?

Git挂钩

使用 useHistory、useLocation 挂钩的挂钩调用无效

调用自定义挂钩时挂钩调用无效

如何防止内存编辑以防止挂钩

如何在reactjs挂钩中创建自定义挂钩?