La odisea del OST (parte I)

El OST es el formato de ficheros que usa Outlook cuando se sincroniza con un servidor compatible MAPI (por ejemplo Exchange y Hotmail). El caso es que tenía yo un OST perdido por ahí y descubrí la existencia de un SDK (http://pstsdk.codeplex.com) donde se describe su estructura. Dije, voy a recorrer el fichero OST y escribo cada mensaje con sus adjunto en un  fichero MSG de Outlook. El problemilla es que el formato de MSG es tan complejo como el del PST, así que deseché la idea. Sí recuperé todos los adjuntos de las extensiones que me han surgido. Sin embargo no me he rendido.

Esto ha sido lo que he hecho para recuperar los contenidos de lo que se suele llamar un OST huérfano y convertirlo en un  PST. En base a la especificación de PST/OST publicada por Microsoft el año pasado, los ficheros OST y PST se diferencian por un número mágico (wMagicClient) almacenado en la cabecera de la capa NDB.

http://msdn.microsoft.com/en-us/library/ff387474(v=office.12).aspx

También hay que cambiar la versión del cliente (wVerClient). Para hacer esto, hay que utilizar un editor hexadecimal como frHed:

http://frhed.sourceforge.net/en/

Como los ficheros PST/OST suelen ser muy grandes (en mi caso es de 7 GB), con el editor anterior se carga sólo la parte inicial del fichero.

El problema tras hacer esto es que las sumas CRC cambian. En la cabecera de los PST hay dos: CRCPartial y dwCRCFull. Es necesario calcular las nuevas sumas. Como se trata de unos polinomios CRC particulares, la mejor manera de hacerlo es cargar el fichero OST (ahora disfrazado de PST) con el SDK y dejar que el SDK calcule los valores:

pst * archivo = new pst(filename);

Al no coincidir los valores de los CRC, se producirán excepciones, por lo que pasaremos a examinar los valores de la suma temporal que se ha generado y lo que hay escrito en el fichero.

CRCPartial y dwCRCFull serán los valores del fichero.

crc_partial y crc_full son los valores correctos calculados.

Simplemente, usando de nuevo el editor hexadecimal, actualizamos los valores en el disco con los valores correctos.

Una vez hecho esto intentamos cargar el fichero con Outlook y en ese momento no nos da ningún error, pero nos pide contraseña (algo muy típico de los OST huérfanos), en realidad no hay contraseña, pero el campo que especifica que el cliente (en este caso Outlook) tiene que pedir contraseña es distinto de cero, suficiente para encontrarnos con este obstáculo. Para resolver esto, fui por la vía fácil y utilicé esta herramienta, que busca dentro del PST el hash de la contraseña y nos ofrece varias que dan la misma suma CRC:

http://www.nirsoft.net/utils/pst_password.html

Ahora tenemos un PST que se abre y que no tiene contraseña, pero el siguiente obstáculo es que no aparecen los correos. Esto se debe a que la carpeta raíz de un OST es diferente a la de un PST, pero Outlook, a todos los efectos, piensa que ha abierto un PST y no encuentra sus mensajes. Ejecutar ScanPST sobre el fichero no resuelve el problema.

Identifiqué la jerarquía de carpetas como:

Root folder (NID: 290) -> Top of personal folders (para el caso de PST)

y como

Root folder (NID:290) –> Root – Mailbox –> IPM_SUBTREE (equivalente a Top of personal folders)

Ésta indirección adicional impide que Outlook cargue correctamente los mensajes de este OST que hemos disfrazado de PST. Una solución que se me ocurre, al estar ya el fichero cargado en Outlook, es usar MAPI para acceder a los ficheros. Pero, ésa, es otra historia…

“Once I thought I’d get over

but it’s too late for me now

I’ve got bases to cover”

(Dream Theater – 6:00)

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s