挂钩 InternetOpenUrl
Posted
技术标签:
【中文标题】挂钩 InternetOpenUrl【英文标题】:Hooking InternetOpenUrl 【发布时间】:2017-01-09 01:52:05 【问题描述】:我正在编写一个应将InternetOpenUrl
和InternetReadFile
挂接到另一个进程的应用程序。
在InternetOpenUrl
的挂钩版本中,它会检查传递给它的lpszUrl
是否与正则表达式匹配。如果匹配,记录实际InternetOpenUrl
返回的句柄。
然后在InternetReadFile
的挂钩版本中,如果hFile
参数等于记录的句柄,它将从文件中读取而不是调用实际的InternetReadFile
。
我发现Windows在调用InternetOpenUrl
时会立即尝试连接到提供的服务器,如果连接失败,该函数将返回NULL
。
但我希望这种机制即使在没有 Internet 连接的情况下也能工作,所以当正则表达式匹配时,我似乎无法通过在我的钩子中调用实际的 InternetOpenUrl
来获得句柄。
那么我怎样才能让它工作呢?
更新:
现在我打电话给InternetOpen
来获取一个虚拟句柄。 InternetOpen
和 InternetOpenUrl
返回的句柄似乎不相等。
但我不确定是否有保障,正在寻找更好的选择。
【问题讨论】:
InternetOpen
的打开句柄不可能与InternetOpenUrl
的打开句柄具有相同的值,因为它们都被同一个函数 InternetCloseHandle
关闭。
您无法伪造打开的句柄,除非您挂钩所有其他互联网功能以识别伪造的句柄。您不能混合句柄类型,其他函数需要真正的 Internet 句柄。
@Harry 您的评论要么缺少否定词,要么写错了,或者其他什么,因为具有相同的结束函数意味着相似性,而不是相异性——尽管当然不能保证任何形式的交叉兼容性.
@RemyLebeau 我想我只需要挂钩InternetReadFile
和InternetOpenUrl
因为目标应用程序只是使用句柄来下载文件。其实我已经尝试过在WinINet中hook其他函数,看看是否调用了其他函数。
@Stalker 然后我建议让钩子InternetOpenUrl()
从CreateFile()
返回所需文件的句柄,然后你可以钩子HttpQueryInfo()
返回文件长度,钩子InternetReadFile()
到调用ReadFile()
,并挂接InternetCloseHandle()
调用CloseHandle()
。
【参考方案1】:
因此,您正在尝试将 URL 查询重定向到文件...您始终可以托管该文件,那么在任何一种情况下都可以保证您的句柄有效。但是,假设是本地文件,我认为如果您在 URL 中指定 "file://" 协议,它可能会以您想要的方式工作。
【讨论】:
“file://”解决方案看起来很棒。我不知道 InternetOpenUrl 支持它。我试试看。 哦,坏消息...我刚刚发现目标应用程序调用HttpQueryInfo
来获取文件长度。我不认为“file://”可以解决这个问题。
让我们知道结果如何。
该死...我的 Visual Studio 拒绝工作。我必须先修复它,然后才能重新开始。
目标进程可以使用“file://”下载文件!非常感谢你! HttpQueryInfo
暂时不工作,但我可以钩住它让它工作。以上是关于挂钩 InternetOpenUrl的主要内容,如果未能解决你的问题,请参考以下文章