El FBI quiere una aplicación oculta para grabar audio y vídeo de «smartphones»

El FBI trata de conseguir mediante una oferta pública una aplicación para teléfonos inteligentes que permita grabar audio y vídeo de forma encubierta, almacenar los datos localmente, mandar automáticamente los datos a la oficina central del FBI, mandar grabaciones en vivo a otros agentes del FBI y mostrar la ubicación GPS del «usuario».

El apéndice del «Audio Recorder Technical Requirements» (así ha llamado el FBI a la aplicación espía) describe dos escenarios en los que el FBI podría usar la aplicación:

«Para el primer escenario, la aplicación estaría precargada en el teléfono y funcionaría de forma oculta. Cuando la aplicación esté activa, la persona que controle el escenario será capaz de permitir la grabación remotamente. La grabación se almacenará en el teléfono, y simultáneamente el audio en directo será enviado (a través de la red móvil) a un servidor del Gobierno ubicado en Quantico, Virginia. El almacenamiento y la transferencia de datos ocurrirá automáticamente sin ninguna acción por parte del usuario».

Al final del informe, el FBI dice que también quiere que la aplicación sea capaz de hacer grabaciones de vídeo ocultas.

El sistema permitirá a los agentes «enviar el audio, vídeo y/o datos GPS sin almacenarlos en el teléfono o en el servidor». Más importante aún, «mientras esté en el modo de grabación de audio en directo, el teléfono que esté siendo usado como una grabadora oculta deberá tener un medio para ocultar su actividad. El fabricante puede implementar esto como una aplicación falsa o una aplicación oculta que requiera una entrada estándar (como un patrón de toques o arrastres) para hacerla visible, o cualquier otro método a su elección».

Convertir un vídeo a formato GIF

Animación de un gato hecha con
Pygame

Hay muchas formas y programas útiles para hacer esto. Aquí os cuento mi método:

  1. Si no tienes ffmpeg, instálalo (en distribuciones de GNU/Linux basadas en Debian con sudo apt-get install ffmpeg).
  2. Separa el vídeo en fotogramas: mkdir fotogramas && ffmpeg -i tuvideo fotogramas/fotograma%04d.png (los fotogramas se guardarán en la carpeta fotogramas).
  3. Borra los fotogramas que no necesites (paso opcional).
  4. Une los fotogramas extraídos creando un gif con el programa adecuado. Puedes usar animate (animate fotograma*.png anim.gif) para hacerlo rápido, pero si buscas controlar mejor el espacio de tiempo entre fotogramas utiliza convert (convert -delay 0 -loop 0 fotograma*.png anim.gif). -delay num indica el tiempo entre los fotogramas y -loop 0 quiere decir que cuando acabe de reproducir las imagenes empezará de nuevo. Estas herramientas suelen estar ya instaladas en muchas distribuciones de GNU/Linux, forman parte de ImageMagick (http://imagemagick.org/script/index.php).

Resumen de atajos de teclado para la Terminal (Bash)

Este resumen lo he elaborado a partir del manual de referencia de Bash.

C-b
Se mueve atrás un carácter.
C-f
Se mueve adelante un carácter.
SUPR o Retroceso
Borra el carácter a la izquierda del cursor.
C-d
Borra el carácter debajo del cursor.
Caracteres imprimibles
Inserta un carácter en la posición del cursor.
C-_ o C-u
Deshace la última instrucción de edición. Puedes desahacer hasta dejar la línea vacía.
C-a
Se mueve al principio de la línea.
C-e
Se mueve al final de la línea.
M-f
Se mueve una palabra adelante, donde la palabra está compuesta de letras y números.
M-b
Se mueve atrás una palabra
C-l
Limpia la pantalla, volviendo a imprimir la línea actual arriba.
C-k
Mata (matar texto significa borrar texto de la línea, pero guardándolo para su uso posterior) el texto desde la posición actual del cursor hasta el final de la línea.
M-d
Mata desde la posición actual del cursor hasta el final de la línea
M-d
Mata hasta el final de una palabra.
M-SUPR
Mata desde el cursor hasta el final de la palabra actual, o, si entre palabras, hasta el principio de la palabra anterior. Los límites de las palabras son los mismos que usa M-f
M-DEL
Mata desde la posición del cursor hasta el inicio de la palabra actual, o, si entre palabras, hasta el principio de la palabra anterior. Los límites de las palabras son los mismos que los usados por M-b
C-w
Mata desde el cursor hasta el espacio en blanco anterior. Esto es diferente que M-SUPR porque los límites de las palabras difieren.
C-y
Pega el texto recientemente matado de nuevo al buffer del donde se encuentra el cursor.
M-y
Rota el kill-ring, y pega lo que está al tope. Solo puedes hacer esto si la instrucción anterior es C-y o M-y

Subprocesos en Python

Los subprocesos o hilos de ejecución nos permiten realizar tareas concurrentemente. En Python podemos utilizar el módulo threading, aunque hay muchos otros.

Vamos a crear varios subprocesos (threads) sencillos.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time
import random

def sleeper(name, s_time):
    print('{} iniciado a las {}.'.format(
        name, time.strftime('%H:%M:%S', time.gmtime())))

    time.sleep(s_time)

    print('{} finalizado a las {}.'.format(
        name, time.strftime('%H:%M:%S', time.gmtime())))


for i in range(5):
    thread = threading.Thread(target=sleeper, args=(
        'Proceso ' + str(i + 1), random.randint(1, 9)))

    thread.start()

print('Yo he terminado, pero los otros subprocesos no.')

Primero, hemos importado los modulos necesarios: time, random y threading. Para crear threads solo necesitamos el último. time lo hemos utilizado para simular una tarea y obtener su tiempo de inicio y fin; random, para hacer que nuestro proceso tenga una duración aleatoria.

La función sleeper «duerme» (no hace nada) durante el tiempo que le especifiquemos, nos dice cuándo ha empezado a «dormir» y cuando ha terminado de «dormir». Como parámetros le pasamos el nombre que le queremos dar al subproceso y el tiempo que va a «dormir» la función.

Luego, creamos un bucle for que crea 5 subprocesos que ejecutan la función sleeper. En el constructor (threading.Thread), debemos indicar la función a ejecutar (target=sleeper) y los parámetros que queremos pasarle (args=('Proceso ' + str(i + 1), random.randint(1, 9)).

Proceso 1 iniciado a las 21:19:23.
Proceso 2 iniciado a las 21:19:23.
Proceso 3 iniciado a las 21:19:23.
Proceso 4 iniciado a las 21:19:23.
Proceso 5 iniciado a las 21:19:23.
Yo he terminado, pero los otros subprocesos no.
Proceso 1 finalizado a las 21:19:25.
Proceso 5 finalizado a las 21:19:26.
Proceso 4 finalizado a las 21:19:27.
Proceso 2 finalizado a las 21:19:32.
Proceso 3 finalizado a las 21:19:32.

El resultado de la ejecución es aleatorio: no sabemos cuál proceso finalizará primero.

Esteganografía sencilla

¿Alguna vez has querido ocultar un mensaje o un archivo en una imagen? Se puede hacer muy fácilmente en menos de treinta segundos.

Instrucciones para ocultar texto en una imagen (demostración práctica)
Ocultando texto en una imagen

En la imagen de arriba lo veis. Realmente, solo hace falta usar la instrucción echo 'Tu mensaje' >> tu_imagen, lo demás es solo para demostraros que funciona y para enseñaros a después el mensaje. La imagen se puede abrir posteriormente sin problema; tiene la misma apariencia. La única diferencia es que ocupa más espacio. En el ejemplo que os he mostrado, la imagen ocupa 15 bytes más que antes, después de haber escrito el mensaje.

¿No entendéis todo el código que he escrito? Tranquilos, ahora lo explico. file favicon.png, me dice el tipo del archivo. ls -l muestra información detallada de todos los archivos del directorio en el que me encuentro. Como solo hay uno, solo aparece la imagen. El número 2588 que aparece tras ejecutarlo es tamaño en bytes de la imagen. Con ls -lh puedo ver el tamaño en un formato más legible, en kilobytes en vez de en bytes. Como solo me interesa el tamaño, paso ls -lh a cut -d" " -f5 por una tubería para que solo me aparezca la columna 5, cada columna está separada por un espacio (" "). Por último, leo el mensaje oculto con strings, que extrae todos los caracteres alfanuméricos encontrados en la imagen.

Si vuelvo a ejecutar la instrucción file favicon.png, encontraré el mismo formato que antes: PNG.

Podemos aplicar este método no solo a texto, sino también a archivos de distinto tipo.

Screenshot from 2016-07-26 23-49-26