Hallo, ich habe mir ein Programm in C mit der pcap-Library geschrieben, welches anhand einer Wireshark/tcpdump Aufzeichnung einen Download rekonstruiert. Anlass: Manche Sites (z.b. youtube) verbieten das Abspeichern und entsprechende Firefox Addons funktionieren nicht immer. Bei manchen videos funktionert mein Programm, bei anderen nicht. D.h. ich kann das rekonstrierte Flash-Video manchmal abspielen. Um das genauer zu untersuchen, habe ich anhand der Seq-Nr festgestellt, dass manche Bereiche im Stream fehlen, obwohl das Video während der Aufzeichnung fehlerfrei spielt. Dann habe ich normale grosse Downloads gemacht mit einer schnellen Verbindung, und das siehe da, die abgespeicherte Datei und rekonstrierte unterscheiden sich in ein paar Bereichen, wo manche Packete offensichtlich fehlten. Der gleiche Download von einer langsamen Verbindung (Server in der Türkei) passt dann wieder, d.h. lässt sich 100% mit den aufzeichneten PCAP-Daten rekonstrieren. Frage: wie kann ich erreichen, dass eine tcpdump-Aufzeichnung mir alle Packete hergibt? PS: in bin interessiert das Programm selbst zu schreiben, da ich anderen Tools nicht traue. D.h. sie könnten weitergeben, dass jemand mit der und der IP etwas abgespeichert hat. (z.B. www.2video.de)
Also zumindestens für Youtube reichen ein paar Zeilen irgendeiner Skriptsprache wenn man wget auf dem Rechner hat. > da ich anderen > Tools nicht traue. Da haben wir was gemeinsam.
>Also zumindestens für Youtube reichen ein paar Zeilen irgendeiner >Skriptsprache wenn man wget auf dem Rechner hat. Hat bei mir nicht funktioniert ("Bad Request"). Die Haupt-Seite selbst ist voll mit JavaScript, den konnte ich nicht interpretieren. Aber ich habe mit Firebug die URL trotzdem herausgefunden und mit wget versucht zu holen. Vergeblich. Die Anbieter versuchen ständig, die Löcher zu stopfen.
Jürgen G. schrieb: >>Also zumindestens für Youtube reichen ein paar Zeilen irgendeiner >>Skriptsprache wenn man wget auf dem Rechner hat. > > Hat bei mir nicht funktioniert ("Bad Request"). > Die Haupt-Seite selbst ist voll mit JavaScript, den konnte ich nicht > interpretieren. > Aber ich habe mit Firebug die URL trotzdem herausgefunden und mit wget > versucht zu holen. Vergeblich. Nene, das geht schon. Mit wget die normale Url (youtube.com/watch?v=....) runterladen, COOKIES SPEICHERN, aus den flashvars (mittlerweile per Javascript eingefügt aber weiterhin verfügbar, das JS muss dazu nicht ausgeführt werden) die passende Url rauspopeln, mit wget runterladen (Cookies angeben!). Funktioniert bei mir wunderbar.
Hier noch die Tabelle mit den itags, spart eine Menge reverse engineering.
1 | itag quality description format width height acodec vcodec vpro arate abr vbr |
2 | #5 1 low FLV 400 240 MP3 SVQ 22050 64000 250000 |
3 | #18 4 high MP4 480 360 AAC H.264 Baseline@L3.0 44100 96000 500000 |
4 | #22 7 highdef MP4 1280 720 AAC H.264 High@L3.1 44100 152000 2000000 |
5 | #34 3 lowdef FLV 640 360 AAC H.264 Main@L3.0 44100 128000 500000 |
6 | #35 5 stddef FLV 854 480 AAC H.264 Main@L3.0 44100 128000 800000 |
7 | #37 8 fhighdef MP4 1920 1080 AAC H.264 High@L4.0 44100 152000 3500000 |
8 | #38 9 origdef MP4 4096 3072 AAC H.264 |
9 | #43 2 lowdef WebM 640 360 Vorbis VP8 44100 128000 500000 |
10 | #45 6 highdef WebM 1280 720 Vorbis VP8 44100 192000 2000000 |
11 | #44* 4,5** ? WebM 640 480 Vorbis VP8 44100 128000 700000 |
12 | #46*** 9 ? WebM 1920 1080 Vorbis VP8 44100 152000 3500000 |
13 | #nach http://userscripts.org/scripts/review/62634 und weiteren Links der selben Seite |
Blöde Frage: Du hast nicht zufällig ein Notebook, mit WLAN und Kabel angeschlossen, und nur eines der Interface am aufzeichnen? War möglicherweise etwas im Cache? (TCP Seq. Nr? Dann wohl nicht) Was für ein Betriebssystem? Wie gross sind denn die fehlenden Bereiche? ps. ist das Projekt privat oder wirst du das irgendwo veröffentlichen? mfg Andreas
Und noch was, was aber nur bei Youtube funktioniert: http://www.youtube.com/html5 Dann mitmachen, danach funktionieren die üblichen Plugins wieder. Und du brauchst kein Flash. Und der Vollbildmodus unter Linux kommt aufem richtigen Screen;-) mfg Andreas
Dir ist klar das Pakete in einer anderen Reihenfolgen kommen können ? Warum nutzt du keinen Proxy ?
warum nicht einfach einen Proxy verwenden/schreiben. Dann den Datenstrom einfach mit auf den Platte schreiben. Dann braucht man sich nicht um das untersten schichten zu kümmern.
>Dir ist klar das Pakete in einer anderen Reihenfolgen kommen können ? Das ist schon klar. Die SeqNr wird korrekt behandelt. >Warum nutzt du keinen Proxy ? Naja, mir erschien das mit tcpdump einfacher. Einfach ein Prog im hintergrund laufen lassen, welches Downloads rekonstriert und ins /tmp schreibt. Mit Proxy habe ich wenig Erfahrung. Vor einigen hatte ich mal Squid installiert, aber da hatte ich 2 Rechner. Ich wollte aber ohne 2 Rechner auskommen. >ps. ist das Projekt privat oder wirst du das irgendwo veröffentlichen? privat >War möglicherweise etwas im Cache? (TCP Seq. Nr? Dann wohl nicht) Tja, da könnte ich auch mal nachschauen >Was für ein Betriebssystem? Linux Debian Squeeze >Wie gross sind denn die fehlenden Bereiche? 1 - 3mal 1440 Bytes (1-3 x MTU)
Jürgen G. schrieb: > Mit Proxy habe ich wenig Erfahrung. Vor einigen hatte ich mal Squid > installiert, aber da hatte ich 2 Rechner. > Ich wollte aber ohne 2 Rechner auskommen. Wir schreiben das Jahr 2012, und fast alle Rechner heutzutage können Multitasking ......
Und was mir noch einfällt: Kann es sein das deine Kiste überlastet ist wenn das Video spielt ?
tcpdump hat das Problem, dass wenn Pakete schneller kommen als sie verarbeitet werden können (z.b. weil ein Plattenzugriff zu lange dauert, IO-Last zu hoch ist o.ä.) der Buffer wieder überschrieben wird, bevor tcpdump dazu gekommen ist sie abzuholen (ist ein Ringpuffer). Eigentlich gibt tcpdump am Ende des Programmlaufs auch darüber auskunft wieviele Pakete es verloren hat. Kann man mit verschiedenen Tricks / zusatztools optimieren soweit ich mich erinnern kann, Details google fragen (ist ne Weile her)
42 schrieb: >> da ich anderen >> Tools nicht traue. > Da haben wir was gemeinsam. http://rg3.github.com/youtube-dl/download.html ist im Quellcode verfügbar und ein kurzer Blick kostet sicher weniger Aufwand als selber zu implementieren
da werde ich auf die Plattenzugriffe (fseek, fwrite) verzichten und die Payload entsprechender Pakete ins RAM schreiben. Vielleicht erwische ich dann alle Pakete. Das wäre super.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.