文件下载

/*
   Wget V. 0.7 Download File Form Url
   
   by wzt    <[email]wzt@xsec.org[/email]>
   
*/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>


#define    MAXLINE    65535
#define SENDDATA    1000


#define PORT        80


struct hostent *host;


char *data_m="Accept: */*\r\n"
        "Accept-Language: zh-cn\r\n"
        "UA-CPU: x86\r\n"
        "Accept-Encoding: gzip, deflate\r\n"
        "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; TencentTraveler ; .NET CLR 1.1.4322)\r\n";
       
       
char *data_e="Connection: Keep-Alive\r\n\r\n";


typedef struct DWONLOAD_FILE{
   char hosts[100];
   char ports[200];
   char file[200];
   int port;
}DOWN;


void usage(char *pro);
void ver();
DOWN abstract_host(char *src);
void download_file(char *url_t,char *local_file);
int connect_server(int port);


void usage(char *pro)
{
   ver();
   printf("usage : %s <remote file> <local file>\n",pro);
   printf("exp: %s [url]http://tthacker.sitesled.com/backdoor/bindtty.c[/url] bindtty.c\n",pro);
   exit(0);
}


void ver()
{
   printf("\nWget Ver 0.6 by W.Z.T, [email]wzt@xsec.org[/email] 2006/10/27\n");
}


int connect_server(int port)
{
   struct sockaddr_in remote;
   int sock_id;
   
   if((sock_id=socket(AF_INET,SOCK_STREAM,0))<0){
       perror("sock_id");
       exit(0);
   }
   
   remote.sin_family=AF_INET;
   remote.sin_port=htons(port);
   remote.sin_addr=*((struct in_addr *)host->h_addr);
   
   if(connect(sock_id,(struct sockaddr *)&remote,sizeof(struct sockaddr))<0){
       perror("connect");
       return -1;
   }
   
   printf("\n[+] Connect :%s:%d OK!\r\n",inet_ntoa(remote.sin_addr),ntohs(remote.sin_port));
   
   return sock_id;
}


void download_file(char *url_t,char *local_file)
{
   DOWN file_get;
   FILE *fp;
   time_t t_s,t_e;
   char download_url[SENDDATA];
   char recv_data[MAXLINE];
   int sock_fd;
   long get_file_len=0;
   int r_len;
   int http_check;
   char *real_data_pos;
       
   ver();
   file_get=abstract_host(url_t);


   printf("\n[+] Host :%s\n",file_get.hosts);
   printf("[+] Port :%d\n",file_get.port);
   printf("[+] File :%s\n",file_get.file);
   
   
   if((fp=fopen(local_file,"w+"))==NULL){
       printf("\n[-] Create Local File %s Failed.\n",local_file);
       exit(1);
   }
   
   if((host=gethostbyname(file_get.hosts))==NULL){
       herror("gethostbyname");
       exit(0);
   }


// 提交url
   sprintf(download_url,"GET %s HTTP/1.1\r\n%sHost: %s\r\n%s",file_get.file,data_m,file_get.hosts,data_e);
   
//    printf("%s",download_url);
   
   sock_fd=connect_server(file_get.port);
   
   if(sock_fd==-1){
       printf("connect error.\n");
       exit(1);
   }


   time(&t_s);
   printf("\n[+] Starting Download at %s",ctime(&t_s)+4);
       
// 接受并处理第-批数据
   
   write(sock_fd,download_url,strlen(download_url));
   r_len=read(sock_fd,recv_data,MAXLINE);
   
//    printf("%s",recv_data);
   http_check=atoi(recv_data+9);
   
//    printf("%d\n",http_check);
   if(http_check == 200 || http_check == 206){
//        printf("\n[+] Download Begin ...\n");
   }
   else{
       printf("\n[-] Bad request.\n");
       exit(1);
   }


// 获得文件大小
   
   get_file_len=atoi(strstr(recv_data,"Content-Length: ")+16);
   printf("\n[+] File Size: %ld\n",get_file_len);


// 寻找真正的文件开始位置
   
   real_data_pos=strstr(recv_data,"\r\n\r\n")+4;
   fputs(real_data_pos,fp);


// 循环读取数据
   
   memset(recv_data,0,MAXLINE);
   while((r_len=read(sock_fd,recv_data,MAXLINE))>0){    
       fputs(recv_data,fp);
//        printf("%d\n",r_len);
       memset(recv_data,0,MAXLINE);
   }
   
   fclose(fp);
       
   time(&t_e);
   printf("\n[+] Download File OK at %s",ctime(&t_e)+4);    
   
}


DOWN abstract_host(char src[])
{
   DOWN file_download;
   char *http="http://";
   int port;
   int port_flag=0;
   int i,j=0,k,l=0,h;


   i=strlen(http);
   for(;i<strlen(src);i++){
       if(src[i]==':'){
           port_flag=1;
           h=i-1;
           i++;
           for(;src[i]!='/';i++){     /* 提取ports */
               file_download.ports[j++]=src[i];
           }
           file_download.ports[j]='\0';
       }
       if(src[i]=='/'){
           k=i-1;
           break;
       }
   }
   
/    


   for(;i<strlen(src);i++){     /* 提取file */
       file_download.file[l++]=src[i];
   }
   file_download.file[l]='\0';





   i=strlen(http);   /* 提取主机名 */
   j=0;
   k=((port_flag==1)?h:k);
   
   for(;i<=k;i++)
       file_download.hosts[j++]=src[i];
   file_download.hosts[j]='\0';
   



   if(port_flag==0)   /* 提取port */
       file_download.port=PORT;    
   else
       file_download.port=atoi(file_download.ports);
   
   
   
   return file_download;
}


int main(int argc,char **argv)
{
   if(argc<3){
       usage(argv[0]);
   }
   
   download_file(argv[1],argv[2]);
       
   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值