4. Plataforma
- Soporta reuniones de varias personas.
- Comparte video, audio, archivos, pizarras ...
- Incorpora sistema de mensajería online (chat).
- Permite al creador de la reunión guardar el
contenido para posteriormente compartirla.
- Permite reproducir las sesiones en streaming a
través de un reproductor propio.
5. Reproductor
- Se encarga de reproducir las sesiones en modo
streaming.
- Puede realizar la reproducción sin necesidad
de recibir un flujo “streameado“.
- Se ejecuta mediante un plug-in en el
navegador si se recibe en modo streaming.
8. Recuperación de archivos
- Asumo que en algún momento se han tenido
que generar archivos para alimentar de datos
al reproductor.
- Deberían localizarse en el directorio de
temporales de internet.
- Usamos alguna herramienta forense para
recuperar los datos.
- http://www.digital-forensic.org/
10. Recuperación de archivos
- Durante el proceso de recuperación, encontré
unos sectores que contenían información muy
parecida a la alojada en los archivo
recuperados.
- Gracias a “Radare2” pude analizar un volcado
(“raw dump”) de mi disco duro.
- Realizando búsquedas binarias pude recuperar
la mayor parte del contenido de este archivo
desconocido.
12. Análisis en bruto
- Asumimos que no podemos confiar en los datos recuperados,
por lo menos no a partir de la mitad del flujo de datos.
- Verificamos que existe la estructura de un archivo “wav” entre
los datos recuperados.
- Observamos algo parecido a una cabecera en el inicio de los
datos recuperados.
- En los archivos recuperados no tenemos nada parecido a esta
cabecera
15. Análisis en bruto
Se ha recuperado sobre los 5.001.891 bytes (4C52A3 Hex)
Mostrando un volcado en modo 32bits localizamos este valor en el offset 8
16. Análisis en bruto
Visualizando en 32bits se puede ver de forma mas clara los valores.
E incluso distinguir lo que podrían ser: Identificadores, offsets ….
.... y tamaños:
17. Análisis en bruto
Desplazandonos a uno de estos posibles offsets (0x378) vemos su
contenido:
Este contenido se puede relacionar con alguno de los archivos
recuperados.
Repitiendo el proceso podremos obtener la estructura de lo que sin
duda es la cabecera cuya función es describir el tipo de medios,
alojados en este contenedor desconocido.
20. Recopilación de datos obtenidos
struct UNKNOW_HEADER {
public UInt32 e_magic;
public UInt32 e_unknow;
public UInt32 e_filesize;
public UInt32 e_reserved0;
public UInt32 e_nsections;
public UInt32 e_reserved1;
}
Cabecera en C#
21. Recopilación de datos obtenidos
ARRAY[0 to Numero Secciones]
18-1b = ID Tipo Bloque DWORD 4-bytes
1c-1f = Indice Bloque * DWORD 4-Bytes
20-23 = Tamaño Bloque DWORD 4-bytes
24-27 = NULL DWORD 4-bytes
28-2b = Offset Bloque en el archivo DWORD 4-bytes
2c-2f = null DWORD 4-bytes
30-33 = null DWORD 4-bytes
34-37 = null DWORD 4-bytes
* El indice de bloque se usa cuando hay mas de un bloque del mismo
tipo, en ese caso se incrementa en 1 por cada bloque.
Secciones (Items)
22. Recopilación de datos obtenidos
struct UNKNOW_ITEMS {
public UInt32 e_id;
public UInt32 e_indice;
public UInt32 e_len;
public UInt32 e_reserved0;
public UInt32 e_offset;
public UInt32 e_reserved1;
public UInt32 e_reserved2;
public UInt32 e_reserved3;
}
Secciones (Items)en C#
23. Recopilación de datos obtenidos
Id Secciones (Items)
IDS Tipo Archivo/Extension
70100 chat "_1_.std"
70103 file "_10_.std"
70112 conf ".conf"
7010c video "_4_.dat"
7010d video idx "_4_.idx"
70105 sonido "_5_.wav"
70114 finV "_6_.dat"
70115 quick/desc "_6_.idx"
7010A "_6_.cad"
7010B "_6_.cai"
70110 backup "_21_.dat"
70111 base64 "_21_.idx"
26. Reconstrucción
- Después de haber obtenido toda la información, podemos
“juntar” todos los archivos en un contenedor.
- Con la las estructuras obtenidas, generamos cada una de las
secciones (items) de la cabecera y hacemos que apunte al
contenido correspondiente dentro del archivo contenedor.
- Todo el proceso es sencillo de implementar por lo tanto, lo
mejor sera crear una utilidad que se encargue de hacer todo
el trabajo.
27. Reconstrucción
1) Ordenamos los archivos obtenidos. (El orden es el mismo
que el de enum tipoSegmento)
2) Obtenemos el tamaño de cada archivo.
3) Creamos un buffer de memoria.
4) Añadimos la estructura struct UNKNOW_HEADER.
5) Inicializamos el campo public UInt32 e_magic a
0x00020001.
6) Inicializamos el campo public UInt32 e_nsections
con el numero de archivos obtenidos multiplicado por 2.
(Estas secciones de más serán inicializadas a 0)
28. Reconstrucción
7) Añadimos una entrada de la estructura UNKNOW_ITEMS por
cada archivo y rellenamos los campos:
public UInt32 e_id;
public UInt32 e_indice;
public UInt32 e_len;
• e_id Contendrá el tipo de sección que podemos relacionar
mediante la extensión del archivo y enum tipoSegmento.
• e_indice Siempre vale 0 salvo si existe mas de una sección
del mismo tipo en este caso se va incrementado su valor.
• e_len Lo inicializamos al tamaño del archivo/sección.
29. Reconstrucción
8) Alineamos a 4 bytes e insertamos el contenido del primer
archivo.
9) Actualizamos el campo e_offset correspondiente, indicando
la dirección donde hemos insertado este primer bloque de
datos.
10) Repetimos los pasos 8 y 9 con cada archivo.
11) Calculamos el tamaño total de todos los archivos insertados
+ alineaciones + la cabecera y actualizamos el campo
e_filesize de la struct UNKNOW_HEADER, con el tamaño
calculado.
12) Guardamos el buffer.
31. Prueba de concepto
- Usamos los archivos obtenidos.
- Usamos la utilidad indicándole dónde se
encuentran los archivos recuperados.
- Ejecutamos el reproductor con nuestro archivo
generado.
- Cruzamos los dedos