RSS

Como obtener el IMSI de la tarjeta SIM

02 Jun

Con este truquito aprenderemos a obtener el IMSI de la tarjeta SIM de un dispositivo con Windows Mobile.

El IMSI (International Mobile Subscriber Identity) es un código de identificación único para cada dispositivo de telefonía móvil, que se encuentra almacenado en la tarjeta SIM y que permite la identificación del dispositivo a través de las redes GSM y UMTS.

Está formado por 3 campos:
MCC (Mobile Country Code): código del país (3 dígitos).
MNC (Mobile Network Code): código de la red móvil (2 ó 3 dígitos, depende del país).
MSIN (Mobile Suscriber Identification Number): número que contiene la identificación de la estación móvil (10 dígitos como máximo).

El IMSI está almacenado en uno de los registros de la SIM (0x6F07). La espeficicación GSM 11.11 explica cual es la estructura de archivos de la SIM y cómo está codificado este registro:
http://www.ttfn.net/techno/smartcards/gsm11-11.pdf.

Para acceder a la información almacenada en la tarjeta SIM recurrimos a la API SimManager, que proporciona las funciones necesarias para comunicarnos con la SIM y extraer los datos que más nos interesen. Podemos encontrar más información sobre esta API en el siguiente link:
http://msdn.microsoft.com/en-us/library/aa458492.aspx

El código que nos permite obtener el IMSI es el siguiente:

//Prototipos P/Invoke

[DllImport(“cellcore.dll”)]
static extern int SimReadRecord
(
       int hSim,
       uint dwAddress,
       uint dwRecordType,
       uint dwIndex,
       byte[] lpData,
       uint dwBufferSize,
       ref int dwSize
);

[DllImport(“cellcore.dll”)]
static extern int SimInitialize
(
      uint dwFlags,
      int lpfnCallBack,
      uint dwParam,
      ref int lphSim
);

[DllImport(“cellcore.dll”)]
static extern int SimDeinitialize (int hSim);

// Función que accede a un registro de la SIM para leer el IMSI y

// lo devuelve en un string

  public string LeerIMSI()
  {
        int resul;

        const int EF_IMSI = 0x00006F07;
        const int SIM_RECORDTYPE_TRANSPARENT = 0x1;

        int hSim = 0;
        byte[] imsi = new byte[10];
        int zero = 0;

// Inicialización de la SIM
        resul = SimInitialize(0, 0, 0, ref hSim);
// Acceso al registro que contiene el IMSI –> 0x6F07
        resul = SimReadRecord (hSim, EF_IMSI,

                   SIM_RECORDTYPE_TRANSPARENT, 0,

                   imsi, (uint)imsi.Length, ref zero);
        resul = SimDeinitialize(hSim);

// Se decodifica el número IMSI y se devuelve como una

        // cadena
        StringBuilder cadena = new StringBuilder();
        cadena.Append(imsi[1] >> 4);
        for (int i = 2; i <= imsi[0]; i++)
        {
             cadena.Append(imsi[i] & 15);
             cadena.Append((imsi[i] >> 4) & 15);                
        }
        return cadena.ToString();           
  }
      

Podemos comprobar que el número IMSI leído es correcto enviando con el hyperterminal el comando:  AT + CIMI.

Anuncios
 
Deja un comentario

Publicado por en 2 junio, 2008 en Artículo, Desarrollo

 

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

 
A %d blogueros les gusta esto: