ultimos posts

DL_DMH_File - Recuperar o revisar archivo de agenda de motorola

#! /bin/bash
# Primer post completamente ejecutable
# Bien, esta vez me pidiero verificar el archivo de la agenda de un motorola v235.
# El celular no encendia y lo estaba por "flashear" (formatear o reinstalar)
# Se rescataron todos los archivos y me entregaron el DL_DMH_File para ver si lo podia abrir
# No encontre mucho en internet. Solo un pograma Flash & Book (solo win) que supuestamente lo leia.
# Ese programa no me funciono asi que empece este script para leerlo (tambien tengo una version EXE para usuarios de windows, me la pides por aqui por comentario o por email).
# No es un simple archivo de texto
# No he descubierto el significado de todo el archivo pero si lo suficiente para que el usuario tenga su agenda aunque sea en papel si el "flasheo" no funciona


clear
echo "Script desarrollado por gnusiervos - http://gnusiervos.blogspot.com"
echo


echo "Abriendo archivo de agenda motorola - DL_DMH_File"}
echo
# paso un archivo hexadecimal a texto solo con los caracteres HEX como texto. Hexdump ha resultado de mucha ayuda
# En este caso creo un array con cada byte en modo texto

declare -a listaHex=$(hexdump -v -e '1/1 "%02X "' DL_DMH_File)

#el archivo de agenda de motorola usa el separador FE (valor HEX que representa 254 en dec) para los registros
#dentro de cada registro separa los campos con el FF (255)
#los campos que he identificado son: (probando un archivo de un motorola V235)
# 1- Nombre del contacto
# 2- Telefono o email (no tengo otra forma de saber que es un email mas que saber que mucho es largo)
# Si el campo 2 termina con F se debe tomar como un separador FF
# Estan escritos como decimales con los digitos invetidos y 4 digitos de un prefijo que indica si numeros que tiene caracteristica (lada) de pais o ciudad o ambas
# mas graficamente: el numero que vemos puede ser algo como 06815334354787 de donde cada par de numeros debe ser invertido
# 06 81 53 34 35 47 87 -> 60 18 35 43 53 74 78
# -> (6018) es un indicador. Puede ser tambien 7018, 7019 y supongo que algunos mas.
# le sirve al marcador del celular para cuando se llame a alguien saber si hay que adicionar alguna caracteristica adelante o no
# La otra parte ya es el telefono 3543 537478 (caracteristica o lada + telefono)

# Hay otros campos en los registros como la direccion postal y el ID de registro que no me interesa en este caso

#Los campos no mencionados me aparecen como no usados en el archivo que probe (no tenia datos)

echo "Definiendo array de registros"

let encontrados=0
for myhexval in $listaHex
do

if [ "$myhexval" = "FE" ];
then #salto de registro
estoy="nombre" #los valores que lea van al campo nombre
varNombre="" #esta variabl va acumulando todo el valor deseado
fi

if [ "$myhexval" = "FF" ];
then #salto de campo

if [ "$estoy" = "tel" ];
then
#termino de leer el telefono

# ver que el nombre tenga 2 caracters al menos, de otra forma lo ignoro
largo=${#varNombre}
if [ "$largo" -gt 1 ]; then #t quier decir "mayor que"
Prefix=${varTel:2:4} #pensaba que era 1:4 pero hay un cero adelane que no entiendo
RealNumber=${varTel:6} #al no poner el ultimo parametro va hasta el final

printf "$encontrados NOMBRE: $varNombre - TEL: $RealNumber ($pureTel)\n" #pureTel podria ser el email, esta desactivado mas abajo

let encontrados++
fi

#limpiar el numero
estoy="nada" #los valores que lea a continuacion los ignoro (estan mas alla del objtivo de este script)
varTel="" #esta variable va acumulando todo el valor deseado
pureTel="" #variable que graba el codigo de telefono como texto. En algunos casos no es un numero, es un email. Aqui tomare que cuando sea muy largo lo intrpretare como email

fi

if [ "$estoy" = "nombre" ];
then
#termino de leer el nombre !
estoy="tel" #los valores que lea a continuacion son parte del telefono.
fi
fi

if [ "$myhexval" != "FF" ] && [ "$myhexval" != "FE" ]; then #son casi siempre datos dentro de un campo
if [ "$estoy" = "nombre" ]; then
varNombre="$varNombre"$(echo $myhexval | xxd -r -p) #no fue facil de encontrar pero "xxd" permite pasar de HEX a ASCII
fi

if [ "$estoy" = "tel" ]; then

P1=${myhexval:0:1} #primero el segundo hex y luego el primero
P2=${myhexval:1:1}

varTel="$varTel$P2$P1"
#activar la siguiente linea para tratar de detectar emails
#pureTel="$pureTel"$(echo $myhexval | xxd -r -p)
fi
fi

done

echo
echo "*************** fin archivo ************************"
echo "Se encontaron $encontrados registros"
exit 0

4 comentarios:

Anónimo dijo...

Hola, excelente trabajo; tengo un V3i que murió la pantalla y aunque accedo al fichero DL_DMH_File con el p2ktool AT soy incapaz de leerlo (en hexadecimal se "vislumbra" alguna entrada); no tengo linux y como ofreces une exe para windows, te agradecería me lo enviaras por correo (jabromembo(XXXXarrobaXXXX)hotmail.com.
Gracias

rr dijo...

Ya te lo envie
Avisa si funciona ok y si no mandame el archivo DL_DMH para que lo revise aqui y mejore el script

David R dijo...

Puedes enviarme el exe para windows. gigispain arroba hotmail.com

el payaso bohemio dijo...

te lo envie
saludos

Publicar un comentario

comentarios para gnusiervos