close
這幾天心血來潮想研究一下在win32下面如何利用Socket來連線,因為新的程式語言太方便了,所以自從大一之後就沒再用過C語言寫一些底層的東西,很多連線的程式我大多都用JAVA或者是perl跟PHP來撰寫,不過目前常看到的病毒以及木馬很多都用C寫成,以後工作搞不好難免也要分析這些東西,乾脆趁現在比較閒的時候來複習一下C語言好了。
=================這篇完全是一篇心得備忘(對程式碼有興趣的再點吧)=================
原本想說寫個http client好了,上Google找了一下,看到蠻多unix下面的sample code就是沒看到windows的,所以拿了之前的程式來改一改,說到這邊不能不推一下ethereal,Sniffer真是撰寫Socket程式的好幫手阿,廢話不多說,下面是Source Code,使用Dev C++ 4.9.9.2編譯,編譯時需要在"工具->編譯器選項->當呼叫編譯器時加入下面命令"的地方加上一個"-lws2_32"參數:
#include <windows.h> #include <stdio.h> int main (int argc, char *argv[]) { SOCKET sockfd; WSADATA wsaData; #define bufsize 300 struct hostent *host; struct sockaddr_in dest_addr; char *Rec_Buf = (char*) malloc(bufsize+1); char request[1000]; int rec; if(argc!=3){ printf("\nUsage:%s [Server IP/DN] [webpage]\n\n",argv[0]); printf("For example:\n%s 127.0.0.1 index.html\n",argv[0]); exit(1); } if (WSAStartup(0x202,&wsaData) == SOCKET_ERROR) { WSACleanup(); return -1; } if ( (host=gethostbyname(argv[1])) == NULL) { perror("gethostbyname"); exit(1); } memset(&dest_addr,0,sizeof(dest_addr)); memcpy(&(dest_addr.sin_addr),host->h_addr,host->h_length); dest_addr.sin_family= host->h_addrtype; dest_addr.sin_port= htons(80); if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) < 0) { perror("socket"); exit(1); } if (connect(sockfd, (struct sockaddr *)&dest_addr,sizeof(dest_addr)) == -1){ perror("connect"); exit(1); } sprintf(request, "GET /%s HTTP/1.0\n\n", argv[2]); send(sockfd,request,strlen(request),0); do{ rec=recv(sockfd,Rec_Buf,bufsize,0); if(rec > 0){ printf("%s",Rec_Buf); } } while(rec > 0); #ifdef WIN32 closesocket(sockfd); WSACleanup(); #else close(sockfd); #endif } |
這支程式會將web server接受到http request之後的訊息print出來,如果要做進階應用像是自動產生特殊的http request或者是要做sql injection tool都可以再做擴充的應用。
全站熱搜
留言列表