Ir al contenido principal

Archivos de audio WhatsApp opus y ogg

Análisis de archivos de audio del aplicativo WhatsApp.

Existen varias formas de extraer los archivos de audio asociados a una conversación entre dos contactos de WhatsApp. La primera de ellas consiste en acceder a la carpeta "WhatsApp Voice Notes" y copiar los archivos directamente desde allí. La segunda consiste en realizar una exportación del total de los registros de las conversaciones seleccionando la opción "incluir archivos". La tercera opción aprovecha la funcionalidad de WhatsApp web y descarga a partir de allí los archivos de audio uno a la vez.

Cuando se realiza la extracción directa desde el dispositivo móvil o bien la exportación de una comunicación específica los archivos de audio poseen la extensión .opus.

Cuando se efectúa la descarga de los archivos de audio uno por vez desde el aplicativo WhatsApp Web, el archivo que se descarga posee extensión .ogg.

Desde el punto de vista del presente análisis forense estructural y de metadatos ambos archivos son equivalentes.

Por el presente se analiza la estructura de un conjunto de 2.175 archivos de audio de extensión .opus que representan la totalidad de archivos .opus obrantes en la carpeta "WhatsApp Voice Notes". Los mismos han sido extraídos de dicha carpeta de manera directa.

Asimismo han sido utilizados para realizar las comparaciones los siguientes aplicativos:

1. Mediainfo

A partir de la confección del archivo mediainfo.bat con el siguiente contenido:

for %%f in (.\opus2\*) do mediainfo --Details=1 --Output=XML "%%f" >> "%%f.xml"
PAUSE

2. ffprobe

A partir de la confección del archivo ffprobe1.bat con el siguiente contenido:

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (*.opus) do (
 set /p val=<%%f
 echo "name: %%~nf"
 ffprobe -v error -show_format -show_streams "%%~nf.opus"> "%%~nf.txt"
)
pause
3. exiftool

A partir de la confección del archivo exiftool1.bat con el siguiente contenido:

exiftool -T -All -r "D:\opus2" > metadatosExiftool.txt
pause

Por otro costado, se ha procedido a aplicar metodologías antiforenses de edición por corte utilizando los siguientes aplicativos de escritorio y web.

A. ffmpeg

A partir de la confección del archivo cortarAudio.bat con el siguiente contenido:

ffmpeg -ss 00:10 -i PTT-20201123-WA0017.opus -t 20 -c copy PTT-20201123-WA0017_ffmpeg.opus
pause

B. https://www.aconvert.com/es/audio/split/ 

C. https://audiotrimmer.com/

D. https://www.ps2pdf.com/audio-cutter

Una vez generados los archivos modificados técnicamente, se procedió a realizar un análisis de estructura y metadatos de estos últimos y a compararlos con los archivos originales. Para cada técnica utilizada, se encontraron diversos campos y elementos donde archivo original y archivo modificado diferían.

1. mediainfo. 

Se procedió a codificar el siguiente script en Python que permite realizar un relevamiento masivo de archivos opus. Dicho script devuelve los archivos que presentan alguna singularidad en cada uno de los elementos analizados.

import os
from collections import Counter

directory = r'D:\opus2'

listadoNombre0Nombre64 = []
listado16000 = []
listadoNombre0Nombre64_bis = []
listadoFFprobe = []
page_segments = []

for filename in os.listdir(directory):
    
    # Mediainfo - archivos xml generados por el script.
    if (filename.endswith('.xml')):
        # print(os.path.join(directory, filename))
        
        with open(os.path.join(directory, filename)) as fp:
            for i, line in enumerate(fp):
                if i == 8 and not r'name="0"' in line and not r'name="64"' in line:
                    listadoNombre0Nombre64.append((filename))
                elif i == 28 and not "16000" in line:
                    listado16000.append((filename))
                elif i == 34 and not r'name="0"' in line and not r'name="64"' in line:
                    listadoNombre0Nombre64_bis.append((filename))
                elif r'name="page_segments">5' in line:
                    page_segments.append((filename))
                    
    # FFprobe - archivos txt generados por el script
    if (filename.endswith('.txt')):
         with open(os.path.join(directory, filename)) as fp:
            for i, line in enumerate(fp):
                if i == 18 and r'start_pts=0' in line: 
                    listadoFFprobe.append((filename))
                    break
                if i == 19 and "start_time=0.000000" in line: 
                    listadoFFprobe.append((filename))
                    break
                if i == 40 and not "[/STREAM]" in line: 
                    listadoFFprobe.append((filename))  
                    break

# módulo experimental
listadoNombre0Nombre64_counter = Counter(listadoNombre0Nombre64)
listado16000_counter = Counter(listado16000)
listadoNombre0Nombre64_bis_counter = Counter(listadoNombre0Nombre64_bis)
page_segments_filename_sorted = sorted(page_segments,key=page_segments.count,reverse=True)
page_segments_filename_counter = Counter(page_segments)


Se debe configurar correctamente la variable directory para que coincida con la carpeta donde se encuentran ubicados los archivos de audio a peritar. Una vez ejecutado el programa se genera de manera automática una serie de listados conteniendo nombres de archivos.

listadoNombre0Nombre64 y listadoNombre0Nombre64_bis_counter 

Se trata de aquellos archivos que poseen una singularidad en su línea número 8, 34 y otras. Donde se encuentra el campo name el cual en condiciones normales posee el valor de 0 y podría también poseer el valor 64. Solo en casos excepcionales (Recorder en lugar de WhatsApp) posee un valor hexadecimal de 8 caracteres. Se utilizan dos campos para la eventualidad de que uno de ellos sea corregido mediante alguna técnica antiforense.

listado16000_counter 

Se trata de aquellos archivos que poseen una singularidad en su línea número 28. Donde se encuentra el campo rate o frecuencia de muestreo, el cual en condiciones normales posee el valor de 16000. Solo en casos excepcionales (Recorder en lugar de WhatsApp) posee un valor de 48000.

page_segments y page_segments_filename_counter 

Se trata de un campo múltiple y experimental. Para los archivos alterados utilizando el aplicativo ffmpeg dicho valor es constante e igual a 50. Para las modificaciones utilizando las otras metodologías se observó que en muchas oportunidades aparecen bloques de entre cincuenta y sesenta elementos. Una vez ejecutado el programa, de existir en el listado page_segments_filename_counter algún archivo que posea un contador superior a la unidad, dicho archivo deberá ser analizado mediante otra de las metodologías publicadas aquí.

2. ffprobe

El comando genera un archivo txt por cada archivo de audio. Los archivos de audio de WhatsApp tienen una particularidad que no dan inicio a partir del momento cero (por defecto) sino que dejan un breve espacio de tiempo. La línea 19 valores encontrados válidos son start_time=0.002167 y la línea 18 start_pts=104, start_time=0.002167 y la línea 18 start_pts=104, start_pts=312, start_time=0.006500. En manipulaciones realizadas sobre los archivos los valores obtenidos para estos campos han sido: start_pts=0, start_time=0.000000.

En todos los archivos modificados por las cuatro opciones analizadas, para la línea 40 aparece un nuevo tag de características similares a la siguiente: TAG:ENCODER=Lavc58.91.100 libopus.

El script de Python propuesto en el punto anterior en el apartado # FFprobe realiza las verificaciones detalladas en el punto anterior.

Una vez ejecutado el programa Python se debe consultar la lista listadoFFprobe donde figurará un detalle con los archivos que no cumplen las condiciones de normalidad definidas.

3. Exiftool

Esta sentencia genera un archivo conteniendo los metadatos separados por tabulador, de la totalidad de los archivos de audio obrantes en la carpeta. 

Se debe utilizar una planilla de cálculo para poder visualizar las columnas y realizar los filtrados y comparaciones necesarias.

3.1. En la quinta columna, columna E figura la fecha de creación. Dado que estos archivos han sido extraídos directamente del celular y no exportados mediante la función de WhatsApp, los mismos preservan su fecha de creación. Se debe ordenar los archivos por esta columna y verificar que se mantienen ordenados por la columna B, nombre del archivo.

3.2. La columna "N" contiene la frecuencia de muestreo. Dicha frecuencia es 16000. Excepcionalmente posee el valor de 48000.

3.3. La columna "P" muestra el fabricante. En el caso de estos archivos se trata de WhatsApp. Excepcionalmente posee el valor Recorder. 

Se observó que para aquellos casos donde la columna "N" posee el valor 48000, la columna "P" posee el valor Recorder.

A. ffmpeg. Preserva la frecuencia de 16000 pero en la columna "P" muestra "Lavf58.29.100".

B, C y D: Modifica la frecuencia a 48000 y la columna "P" muestra los valores Lavf58.45.100, Lavf58.76.100, Lavf58.42.101


4. Otras

Otras opciones para realizar comparaciones son:

opusinfo.exe

https://opus-codec.org/downloads/

opus-tools 0.2, versión para Windows.


ogginfo.exe

 https://github.com/Chocobo1/vorbis-tools_win32-build/releases

Comentarios