這幾天心血來潮想研究一下在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"參數:
這支程式會將web server接受到http request之後的訊息print出來,如果要做進階應用像是自動產生特殊的http request或者是要做sql injection tool都可以再做擴充的應用。
=================這篇完全是一篇心得備忘(對程式碼有興趣的再點吧)=================
原本想說寫個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都可以再做擴充的應用。
文章標籤
全站熱搜

这位大虾果然豪爽
想請教大大一些觀念的問題,最近想寫一個server和client的程式,但一些觀念還不是很懂,想請教大大,望大大不吝指導小弟 我的程式想做的功能是 由client端連到server端後,經過登入user password後,由server端每一秒鐘送出一串字串給client端,然後client端再根據收到的字串去研判做該做的事情 大概是這樣,想請教該用什麼方式傳送,是以聊天室的方式傳送嗎?還是以FTP把字串存成檔案的方式傳送?SERVER端要如何跟client端一直保持連線? 抱歉,因為沒接觸過網路的程式,所以一直搞不懂網路城市的設計架構,我想用VB來設計可以嗎?還是要用c#比較方便?
網路上很多聊天室的範本多半是用udp的方式傳送,依照你的需求用TCP Socket的方式會比較好,在Server端開一個Listen port,然後Client用Socket方式連接,用VB跟C#都可以,網路上跟現有的書籍裡面應該有很多範例程式可以參考。 不過你的需求是Server主動送指令給Client,跟一般Server/Client架構相反,一般狀況通常是Client送request給Server,然後根據Server的回應做事,如果你的Client不送只等著收資料的話,在Server那邊可能要多做一些工,不過我也沒寫過類似的程式,所以沒辦法給太多意見。 我會考慮在Server Process那邊設個timer,時間到就吐指令,再不然就是參考netcat的寫法建reverse tunnel,但是如果是我要寫像類似你這樣程式的話,方法會跟你有點差異,我會讓Client走HTTP定期向Server拿JOB就好,比較省頻寬隱密性也比較好,目前主流的Botnet Agent都是採取這種方式,給你參考。
謝謝大大您的回應與教導 我有去書局找VB和C#的書,但幾乎都沒有寫到關於您說的那些,不知您能否建議幾本書籍或者是您那邊有沒有類似的範例程式可以給我參考用。抱歉,可否盡量中文的資料,因為小弟英文不是很好@@" 參考大大您的解說,有個構想,就是可以由client送request給server,timer設在client端,server只做回應這樣可以嗎?速度上會不會太慢?另外能兼顧到user的ID與期限控管和同時間只能同一USER在線上,這樣可以嗎?
dylon的構想滿適合定期會向Server報到並且拿指令工作的系統。 不知道dylon會不會寫web ap呢?如果你只是想馬上可以做出堪用的工具的話,我倒是有個偷雞的想法,如果你會寫WEB AP的話,Server由web server+動態網頁程式來做,這樣就可以省下寫Server端的時間,web ap只要作兩件事,(1)登入控管(2)顯示執行指令,而Client的部分就只要定期向網頁用GET傳登入訊息並且取回要執行的指令來執行就好,Client的虛擬碼大概就下面像這樣: while(1){ /*向網站發送登入訊息並取回指令*/ String retData=http_get(http://aa.bb.cc/cmd?user=testpc1); /*如果Server有要給Client執行的指令*/ /*執行Server要Client執行的指令*/ if(retData!='') exec(retData); } /*等待一段時間後再向Server要下一次指令*/ sleep(100000); } Server端那邊就跟一般網頁作登入控制差不多,做個你想要的控管機制就可以了。 但是如果你想要兩邊都自己寫的話,那就需要找看看有沒有合用的程式了,我對VB還有C#都不是很熟,最近陷入加班迴圈,沒什麼時間寫code,如果有空的話我再幫你看看有沒有合用的程式可以參考好了。
這種架構是否就是用socket的方式?
謝謝大大的指導,我的Server端要做的事是user控管與每1-2秒鐘去開啟一個文字檔(裡面只有一行字串),然後把這一行字串讀出來傳給有登入的client端,再由client端去根據收到的字串去做解讀動作,字串內容已經有別支程式去負責產生成文字檔了,而client端也有別支程式去解讀動作,所以其實這2支程式在單機上是剛好構成一個流程動作,只是我想把它拆開做遠端動作,所以就必須自己作一個傳送(Server端-讀文字檔傳送字串)與接收(Client端-收到字串存成文字檔)的程式來完成一整個流程動作,而且這些動作是每1-2秒就必須要作一次 用WEB做不知有沒有辦法去做讀文字檔與每1-2秒鐘就完成一次的工作 還是對於這個文字檔的傳送您有更好的想法指導小弟一下?
用web做的話就表示client每次跟server發request時server就去讀文字檔,不過要做點控制避免發生不同步的現象(可能A client跟server連線時是前一個檔案,但B Client跟Server連線時就變成新檔案了),所以按照你的情況還是不要用web來做會比較好,剛剛http://omusico2.blogspot.com/看到C的Socket Client跟Server程式,不過那隻程式是Sigle Process的,也就是Server一次只能跟一個Client Talk,如果要做成可以同時跟很多Client Talk我猜應該要改成Multi-Process,這一段我也沒寫過(學藝不精XD),只能提供以上意見給您參考
謝謝大大您的指導,那位omusico大大也跟您一樣是很厲害的人物,不知我何時才能像您們一樣@@" 我先試試看能不能先做出one by one的,再來改成可以多人的,要再摸索消化一段時間了,呵呵~~ 再次感謝大大您的指導,謝謝您~~
我不是大大拉...我自己也是嫩到翻,今天問過強者我同事了,他比較推薦用multi-thread而不是multi-process,他說網路上還滿多sample code可以參考的,他推薦的關鍵字是server.cpp,你可以試看看