viernes, febrero 18, 2011

¡¡¡Marchando otra de pr0n!!!

Hace unos añitos ya, uno de los posts más populares (a la par que útil) fue el de cómo aprovechar todo el conocimiento sobre shellscripting para bajarse porno. Con el tiempo, llegó el porno por streaming y aquello de las descargas se convirtió en un ritual arcano carente de sentido.

Pero yo siempre he dicho ¿Cómo te masturbas si algún día se cae la conexión? Porque reconozcámoslo: la imaginación ya no es una alternativa viable.

Así que por si acaso, yo siempre me guardo el porno, aunque provenga de streaming, por si llega una época de vacas flacas. Con el viejo plugin de Flash era sencillo, entraba en cualquier página guarra, abría los vídeos que parecían más interesantes, les daba al play para que empezasen a cargar, los pausaba y cuando estaban completamente descargados, iba al /tmp/ (sí, soy un linuxero pajero) y ahí se encontraban un montón de archivos cuyo nombre empezaba por FlashXXX y luego un código (que supongo que será un hash). Sólo tenía que copiármelos a mi carpeta de porno, a la postre /mnt/repositorio/films/pron/flash para que perdurasen.

Pero con la última actualización de Adobe Flash (la 10, creo), me sentí un poco idiota cuando al ejecutar la mágica orden mv /tmp/Flash* /mnt/repositorio/films/pron/flash el resultado fue que no se encontraban los archivos. Mi gozo en un pozo. ¿Qué cojones habría pasado?

Seguro que algún directivo de Adobe pajero se dio cuenta de que mientras él se bajaba porno en una máquina compartida, podría llegar cualquier gorrón a mirar en el tmp y masturbarse de gratis. Y eso no se puede consentir, quien quiera porno, que se baje el suyo. Así que cambiaron el comportamiento del plugin para que guardase los archivos de la caché en algún otro sitio.

En un foro encontré que lo habían movido al ~/.mozilla/firefox/profile/Cache (o alguna alternativa similar). Le eché un vistazo y había algunos archivos, ninguno empezaba por Flash. Por si acaso, hice file * | grep -i flash, a ver si sonaba la flauta y simplemente habían cambiado el esquema de nombrado, pero tampoco.

Empezaba a preocuparme. Repetí la operación con todos los archivos de mi home y nada. Ahí no había ni rastro de ningún vídeo flash.

Así que inspirado por las recientes hazañas de los hackers de anonymous (y por mis acuciantes ganas de pajearme), decidí que era hora de que toda la mierda que aprendí en Informática sirviese para algo. Bueno, qué coño, la mierda más útil ni siquiera la aprendí en la carrera, pero para el caso...

Volviendo al Firefox, pude comprobar que los vídeos se podían reproducir, saltar hacia adelante y hacia atrás... Y eran unos cuantos, así que no podían estar únicamente en RAM (bueno, sí que podrían, pero sería un tanto cafre por parte del que diseñase el plugin abusar así de la memoria virtual), debía haber una caché en alguna parte del disco, pero yo no sabía dónde.

Entonces me acordé del /proc, de donde podemos sacar montones de información útil sobre nuestro sistema. Los plugins del firefox se ejecutan como procesos independientes, así que lo primero es averiguar de quién se trataba. Tan sencillo como ejecutar ps x | grep -i flash.

2242 ? Rl 68:29 /usr/lib/nspluginwrapper/i386/linux/npviewer.bin --plugin /usr/lib/flashplugin-installer/libflashplayer.so --connection /org/wrapper/NSPlugins/libflashplayer.so/2147-1
8827 pts/5 S+ 0:00 grep -i flash

Ahí teníamos al truhán. Nos vamos a su entrada en el /proc y le cotilleamos los descriptores de fichero abiertos.

20:47:36.fortran@goro:/proc/2242/fd$ ls -l
total 0
lr-x------ 1 fortran fortran 64 2011-02-18 20:47 0 -> /dev/null
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 1 -> /home/fortran/.xsession-errors
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 11 -> /tmp/FlashXXuUsilx (deleted)
lr-x------ 1 fortran fortran 64 2011-02-18 20:47 12 -> pipe:[64703]
l-wx------ 1 fortran fortran 64 2011-02-18 20:47 13 -> pipe:[64703]
lr-x------ 1 fortran fortran 64 2011-02-18 20:47 14 -> pipe:[64704]
l-wx------ 1 fortran fortran 64 2011-02-18 20:47 15 -> pipe:[64704]
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 16 -> socket:[64708]
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 17 -> /tmp/FlashXXBtk0WU (deleted)
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 18 -> /tmp/FlashXX10pPCn (deleted)
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 19 -> /tmp/FlashXXZyVJTX (deleted)
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 2 -> /home/fortran/.xsession-errors
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 20 -> /tmp/FlashXX3Au4jD (deleted)
lrwx------ 1 fortran fortran 64 2011-02-18 20:25 21 -> /tmp/FlashXXGmFE70 (deleted)
lrwx------ 1 fortran fortran 64 2011-02-18 20:25 22 -> /tmp/FlashXXC97ztx (deleted)
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 3 -> socket:[16683]
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 4 -> socket:[16687]
lr-x------ 1 fortran fortran 64 2011-02-18 20:47 5 -> pipe:[16689]
l-wx------ 1 fortran fortran 64 2011-02-18 20:47 6 -> pipe:[16689]
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 7 -> socket:[16690]
lrwx------ 1 fortran fortran 64 2011-02-18 20:47 8 -> socket:[16691]

¿Qué tenemos? ¡Los muy malandrines han hecho un unlink de los ficheros nada más crearlos! Pero mientras sigan teniendo un descriptor abierto, el sistema no liberará el espacio (eso ocurrirá en cuanto el proceso del plugin muera).

Así que ahora no podemos hacer un simple cp o mv para guardarnos nuestros preciados vídeos, pero existen alternativas. Con la herramienta dd (cuyo nombre me parece que viene de data-dump, por si ayuda para recordarlo) podemos hacer muchas cosas guays como grabar imágenes ISO directamente en los dispositivos, y también recuprar esos bytes que dan forma a esas maravillosas cachondas siendo fornicadas.

Podríamos ir uno por uno, pero eso sería tiempo que le restaríamos al onanismo, así que más nos vale hacer un script que nos sirva para otras veces. Como soy generoso y tampoco quiero que vosotros perdáis vuestro tiempo de cascárosla, ahí os lo pongo. Sólo tenéis que cambiarle la ruta de vuestra carpeta del porno (ah, y cread un /tmp/ al final, que me daba pereza quitar esa parte del nombre de los ficheros).

pushd /proc/`ps x | grep libflashplayer | cut -d" " -f 2| head -n1`/fd
ls -l | grep Flash | awk '{print "dd if=" $8 " of=/mnt/repositorio/films/pron/flash" $10 }' | sh
popd


¡Hale, a disfrutar!

2 comentarios:

Anónimo dijo...

Este es el empujón (nunca mejor dicho) que me faltaba para acabar el libro de bash que estoy leyendo.

Gracias!

General Failure dijo...

Uhm, no hace falta complicarse la vida usando dd, un simple cp del fichero de proc sirve:

cp /proc/$pid/fd/$fd $destino

y a correr :D

Y el selector de PIDs a recorrer en mi caso también es distinto, ahora mismo tengo chrome abierto, y el proceso que gestiona los ficheros FlashXX abiertos es el propio chrome, no se si por su sandbox, o porque creo que lleva incluido el Flash, así que es algo distinto:

lsof -X |grep FlashXX | tr -s " " |cut -d " " -f 2 |sort -u

Con esto seleccionas los pids únicos de procesos que tienen ficheros FlashXX abiertos.

Si usas lsof puedes optimizar algo mas, ya que en la salida ya te dice que nº de fd es, (32 y 41 en este caso), pero esto lo dejo a desarrollar por el usuario :D

chrome 3152 usuario 32u REG 8,1 7470282 2367448 /tmp/FlashXX2v3QDS (deleted)

chrome 3152 usuario 41u REG 8,1 20862748 2367449 /tmp/FlashXXYFhsje (deleted)

Saludos.