#!/usr/bin/perl -w ########################################################################### ## ## 'geen smalband'-proxy ## ## Uitleg: Deze proxyserver zal bestanden downloaden zonder dat deze ## aangerekend worden op de Telenet Telemeter. Als je op smalband ## zit, zal de download zelfs aan volledige snelheid gebeuren. ## ## Versie : 0.3 ## Datum : 12-16 september 2006 ## Auteur : Andy Goossens < andygoossens at telenet dot be > ## ## Deze proxyserver is gebaseerd op een idee van Kaetemi. Het maakt ## gebruik van een vergetelheid in de Telemeter. Geen Telenet systemen ## werden gehackt en er werd geen kennis op onrechtmatige basis verkregen. ## ## Gebruik: - start dit programma op: perl geensmalbandproxy.pl ## - verander de proxyinstellingen aan naar ## proxy: 127.0.0.1 ## poort: 8000 ## - doe je ding :-) ## ## OPGEPAST: Dit is een hele simpele no-caching proxyserver. Het werd ## ontwikkeld om de Telemeter te omzeilen. Het is geen geval ## geschikt voor dagdagelijks surfen! Moderne websites ## vereisen allerlei snufjes (cookies, ...) die niet kunnen ## ondersteund worden omdat ze anders worden opgemerkt door ## de Telemeter. ## ## Gebruik deze proxy ENKEL als je zaken wil downloaden. Wil je ## gewoon surfen, schakel deze dan zo snel mogelijk uit! ## ## Copyright (C) 2006 Andy Goossens < andygoossens at telenet dot be > ## Gebaseerd op proxy-code van René Nyffenegger - http://www.adp-gmbh.ch/ ## ########################################################################### use strict; use URI; use IO::Socket; use threads; $|++; # uitvoerbuffer flush'en # te gebruiken poort my $proxy_port = 8000; # niet sterven bij een 'Broken pipe' of Ctrl-C $SIG{PIPE} = 'IGNORE'; my $server = IO::Socket::INET->new ( LocalPort => $proxy_port, Type => SOCK_STREAM, Reuse => 1, Listen => 20); if ($server) { print "'geen smalband' proxy gestart. We luisteren op poort $proxy_port\n\n"; } else { print "!!! We kunnen niet luisteren op poort $proxy_port. Reeds in gebruik?\n"; print "!!! Programma wordt afgesloten\n"; exit 1; } binmode $server; while (my $browser_connectie = $server->accept()) { print "--- Nieuwe connectie\n"; binmode $browser_connectie; my $thread = threads->new(\&browser_thread, $browser_connectie); $thread->detach; } sub browser_thread { my $browser = $_[0]; my $method = ""; my $content_length = 0; my $content = 0; my $accu_content_length = 0; my $connection_error = 0; my $host; my $hostAddr; my $httpVer; while (my $browser_line = <$browser>) { unless ($method) { ($method, $hostAddr, $httpVer) = $browser_line =~ /^(\w+) +(\S+) +(\S+)/; if (!defined($hostAddr)) { print "!!! Kon host niet bepalen, thread wordt afgesloten\n"; $connection_error = 1; last; } my $uri = URI->new($hostAddr); $host = IO::Socket::INET->new ( PeerAddr=> $uri->host, PeerPort=> $uri->port ); unless ($host) { print "!!! Kon geen connectie maken met ".$uri->host.":".$uri->port.", thread wordt afgesloten\n"; $connection_error = 1; last; } #print "--- Connectie met ".$uri->host.", poort ".$uri->port."\n"; binmode $host; #print $host "$method ".$uri->path_query." $httpVer\n"; print $host "GET ".$hostAddr."\n"; #print "$method ".$uri->path_query." $httpVer\n"; print "<<< GET ".$hostAddr."\n"; next; } $content_length = $1 if $browser_line=~/Content-length: +(\d+)/i; $accu_content_length+=length $browser_line; #print $browser_line; #print $host $browser_line; last if $browser_line =~ /^\s*$/ and $method ne 'POST'; if ($browser_line =~ /^\s*$/ and $method eq "POST") { $content = 1; last unless $content_length; next; } if ($content) { $accu_content_length+=length $browser_line; last if $accu_content_length >= $content_length; } } return if ($connection_error); print ">>> Antwoord van $hostAddr\n"; while (my $host_line = <$host>) { #print $host_line; print $browser $host_line; } $browser-> close; $host -> close; print "--- Einde thread\n"; }