Reconstituer un flux voix G729 à partir d’une capture Wireshark
Cet article indique la marche à suivre pour reconstituer un fichier audio à partir d’une capture Wireshark réalisée sur un flux encodé via le codec audio G729.
Admettons que vous ayez mis en place un port mirroring afin de capturer des paquets à destination d’un autre utilisateur. Parmi ces paquets, nous retrouvons donc les paquets de signalisation liés au protocole utilisé (SIP, MGCP …) et les paquets de voix pures que sont les paquets RTP. Wireshark possède des options permettant de manipuler ces paquets et d’en extraire toutes les informations souhaitées.
Une fois la capture effectuée, il faut se rendre dans le menu “Statistics -> RTP -> Show All Streams” et choisir le flux qui nous intéresse. A priori, et sauf erreur de ma part, il n’est pas possible de retranscrire les voix des deux interlocuteurs en simultané dans un même fichier voix. Il faut donc sélectionner chacun de ces flux séparémment en fonction des adresses IP utilisées par les terminaux IP (ou gateway). Une fois le flux sélectionner, il faut cliquer sur “Analyze”.
Dans la fenêtre suivante qui contient uniquement les donneés du flux concerné, il faut cliquer sur “Save Payload”, en sélectionnant le mode raw et le channel “Forward” (il est a priori impossible de sélectionner “both” pour des limitations liées visiblement au codec et explicitées ci-dessus). Enfin, il entrer le nom de fichier de sauvegarde et valider. Enfin, il suffit de entrer le nom de fichier de sauvegarde et valider.
Une fois le traitement effectué, il va falloir utiliser un décodeur qui comprenne le G729. Pour cela, un petit tour sur ce site http://www.voiceage.com/openinit_g729.php suffira pour télécharger la version qui va bien avec votre OS.
Une fois l’archive décompressée, il suffit de lancer l’outil va_g729_decoder en ligne de commande, avec comme paramètres le fichier d’entrée et le fichier PCM de sortie.
Pour cela, le script Perl fourni sur le site de Wireshark fonctionne à merveille et prend en arguments le fichier source PCM et le fichier de destination en .au. Voici le contenu de ce script :
# USAGE: perl pcm2au.pl inputFile outputFile
$usage = "Usage: ‘perl $0 <Source PCM File> <Destination AU File>’ ";
$srcFile = shift @ARGV || die $usage;
$dstFile = shift @ARGV || die $usage;
open(SRCFILE, "$srcFile") || die "Unable to open file: $!\n";
binmode SRCFILE;
open(DSTFILE, "> $dstFile") || die "Unable to open file: $!\n";
binmode DSTFILE;
###################################
# Write the AU header
###################################
print DSTFILE ".snd";
$foo = pack("CCCC", 0,0,0,24);
print DSTFILE $foo;
$foo = pack("CCCC", 0xff,0xff,0xff,0xff);
print DSTFILE $foo;
$foo = pack("CCCC", 0,0,0,3);
print DSTFILE $foo;
$foo = pack("CCCC", 0,0,0x1f,0×40);
print DSTFILE $foo;
$foo = pack("CCCC", 0,0,0,1);
print DSTFILE $foo;
#############################
# swap the PCM samples
#############################
while (read(SRCFILE, $inWord, 2) == 2) {
@bytes = unpack(‘CC’, $inWord);
$outWord = pack(‘CC’, $bytes[1], $bytes[0]);
print DSTFILE $outWord;
}
Pour la population Windowsienne non familière avec Perl, une version Windows gratuite existe et s’appele ActivePerl. Une autre solution sans Wireshark que je n’ai pas encore été ammené à tester consiste à utiliser le fameux outils Cain qui permet de sniffer le trafic en temps réel et de l’enregistrer directement dans un fichier audio (il faut bien entendu avoir un port mirroring ou un hub permettant de récupérer le trafic voulu).









Laissez votre réponse !
Vous devez être connecté pour poster un commentaire