修改http请求文件为本地文件的一种方法:hook InternetReadFile 和 HttpOpenRequest

上传人:碎****木 文档编号:220863199 上传时间:2021-12-09 格式:DOCX 页数:12 大小:14.43KB
返回 下载 相关 举报
修改http请求文件为本地文件的一种方法:hook InternetReadFile 和 HttpOpenRequest_第1页
第1页 / 共12页
修改http请求文件为本地文件的一种方法:hook InternetReadFile 和 HttpOpenRequest_第2页
第2页 / 共12页
修改http请求文件为本地文件的一种方法:hook InternetReadFile 和 HttpOpenRequest_第3页
第3页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《修改http请求文件为本地文件的一种方法:hook InternetReadFile 和 HttpOpenRequest》由会员分享,可在线阅读,更多相关《修改http请求文件为本地文件的一种方法:hook InternetReadFile 和 HttpOpenRequest(12页珍藏版)》请在金锄头文库上搜索。

1、修改 恳求文件为本地文件的一种方法:hook InternetReadFile 和 OpenRequest今日没事的时候学了一下来 本进程,确实很简洁就能。然后想到这个问题:替换恳求的文件为本地文件。有什么用就不说了,都懂。由于没有用写过 方面的东西,所以先了几个函数,其中InternetReadFile 是用来猎取文件的, 而文件句柄可以来源于和 OpenRequest 等,挨个下一下钩子就知道用的是 OpenRequest。固然,猎取方法是多种多样的, 也可以用等调试工具。确定下来这两 个可以达成目标就可以了:、从 OpenRequest 知道要下载的是哪个文件,过滤需要替换的那个。、 O

2、penRequest 的返回值就是翻开文件句柄了,在InternetReadFile 中识别这个句柄就可以。、在给 InternetReadFile 的自定义例程中,对需要替换的文件进展替换。接下来,让我们考虑一下替换的流程: 调用 InternetReadFile 的时候,先到达我们的自定义例程,然后由我们调用函数 InternetReadFile,于是我们可以在自定义函数中把相应文件句柄的数据恳求吃掉把我们的数据写入缓冲区,而后直接返回不掉用。 对于我们不关心的文件句柄调用。查看 InternetReadFile 的声明:<DllImport(“wininet.dll“, SetLa

3、stError:=True)> Public Shared Function InternetReadFile(ByVal hFileAs IntPtr, ByVal lpBuffer As IntPtr, ByVal dwNumberOfBytesToRead As Integer, ByRef lpdwNumberOfBytesRead As Integer) As BooleanEnd Function可以知道,第一个参数是 OpenRequest 返回的文件句柄,是接收数据的缓冲区, 是期望读取的字节数,即 缓冲区大小, 是实际写入缓冲区的字节数。返回值表示函数调用是否成 功。所

4、以,当 为且函数返回值为时,到达文件结尾函数 调用成功却没有数据写入,说明数据写完了。于是,在我们 的自定义例程中也需要遵守该商定当写入数据时返回实际写入的数据大小,写完数据后再次被调用时返回并进 行清理。首先,来看一下比较简洁的一个:Imports System.Runtime.InteropServices Imports System.TextPublic Class Hook OpenRequest<DllImport(“wininet.dll“)> Public Shared Function OpenRequestW(hConnect As IntPtr, szVerb

5、 As IntPtr, szURI As IntPtr, sz Version As IntPtr, szReferer As IntPtr, accetpType As IntPtr, dwflags As Integer, dwcontext As IntPtr) As IntPtrEnd FunctionPrivate Delegate Function OpenRequestDelegate(hConnect As IntPtr, szVerb As IntPtr, szURI As IntPtr, sz Version As IntPtr, szReferer As IntPtr,

6、accetpType As IntPtr, dwflags As Integer, dwcontext As IntPtr) As IntPtrPrivate Shared hook As EasyHook.LocalHook =NothingFriend Shared Sub Install() Using hookIf EasyHook.NativeAPI.GetModuleHandle(“wininet.dll“) = IntPtr.Zero ThenEasyHook.NativeAPI.LoadLibrary(“wininet.dll“)End If hook =EasyHook.Lo

7、calHook.Create(EasyHook.LocalHook.GetPr ocAddress(“wininet.dll“, “ OpenRequestW“), New OpenRequestDelegate(AddressOf sendProc), Nothing)hook.ThreadACL.SetInclusiveACL(NewInteger() 0)End Using End SubFriend Shared Sub UnInstall() Using hookInteger() 0)If hook IsNot Nothing Then hook.ThreadACL.SetExcl

8、usiveACL(NewEnd IfEnd Using End SubPrivate Shared Function sendProc(hConnect As IntPtr, szVerb As IntPtr, szURI As IntPtr, sz Version As IntPtr, szReferer As IntPtr, accetpType As IntPtr, dwflags As Integer, dwcontext As IntPtr) As IntPtrDim uri As String = Marshal.PtrToStringUni(szURI)Dim result As

9、 IntPtr = OpenRequestW(hConnect, szVerb, szURI, sz Version, szReferer, accetpType, dwflags, dwcontext)Ifuri.Contains(“/56896-20210216102630488-270057596.jpg“) Then ”依据名称区分要替换的图片.HookInternetReadFile.CheatFileHandle = resultEnd IfReturn resultEndFunction End Class用起来确实比较简洁,首先是注入过程, 由于对的加 载是恳求第一个页面时,所

10、以可能导致这个不在进程 空间,那么先加载它。之后的格外易懂函数名我 没有修改,复制粘贴的之前写的,唯一需要留意的是实际的过程调用的是ThreadACL.SetInclusiveACL,类似。在自定义函数中,首先调用,得到句柄,然后依据要替换的 名称来确定是否启动给 InternetReadFile 的自定义例程。而后,看一下对数据的处理过程:Imports System.IOImports System.Runtime.InteropServicesPublic Class HookInternetReadFile <DllImport(“wininet.dll“, SetLastErr

11、or:=True)> Public Shared Function InternetReadFile(ByVal hFileAs IntPtr, ByVal lpBuffer As IntPtr, ByVal dwNumberOfBytesToRead As Integer, ByRef lpdwNumberOfBytesRead As Integer) As BooleanEnd FunctionPrivate Delegate Function InternetReadFileDelegate(ByVal hFile As IntPtr, ByVal lpBuffer As IntP

12、tr, ByVal dwNumberOfBytesToRead As Integer, ByRef lpdwNumberOfBytesRead As Integer) As BooleanPrivate Shared hook As EasyHook.LocalHook = NothingFriend Shared CheatFileHandle As IntPtr = IntPtr.Zero ”要替换的文件的句柄,来源于 OpenRequest 的返回值。Friend Shared CheatFile() As Byte = File.ReadAllBytes(My.Application.

13、Info.DirectoryPath & “abc.jpg“)”用于替换的文件Private Shared curcnt As Integer = 0Friend Shared Sub Install() Using hookIf EasyHook.NativeAPI.GetModuleHandle(“wininet.dll“) = IntPtr.Zero ThenEasyHook.NativeAPI.LoadLibrary(“wininet.dll“)End If hook =EasyHook.LocalHook.Create(EasyHook.LocalHook.GetPr ocA

14、ddress(“wininet.dll“, “InternetReadFile“), New InternetReadFileDelegate(AddressOf sendProc), Nothing)hook.ThreadACL.SetInclusiveACL(NewInteger() 0)End Using End SubFriend Shared Sub UnInstall() Using hookIf hook IsNot Nothing Then hook.ThreadACL.SetExclusiveACL(NewInteger() 0)End IfEnd Using End SubPrivate Shared Function sendProc(ByVal hFile AsIntPtr, ByVal lpBuffer As IntPtr, ByVal dwNumberOfBytesToRead As Integer, ByRef lpdwNumberOfBytesRead As Integer) As BooleanIf hFile = CheatFileHandle ThenIf curcnt = CheatFile.Length Then CheatFileHandle = IntPtr.Zer

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号