Cómo cambiar IMEI, IMSI, número de serie de la tarjeta SIM en el emulador de Android
(i) Modificación del número de tarjeta SIM:
El número de tarjeta SIM es una cadena de números impresos en la tarjeta SIM.
El comando AT para leer el número de la tarjeta SIM es AT CRSM=176, 12258, 0, 0, 10
Por lo tanto, busque este comando AT en la simulación de Android de su fuente código - En sim_card.c:
const char*
asimcard_io(ASimCard sim, const char* cmd)
{
int nn;
#if ENABLE_DYNAMIC_RECORDS
int comando, id, p1, p2.p3;
#endif
estructura estática constante { const char* cmd; const char* respuesta; } respuestas[] =
{
{" CRSM=192, 28436, 0, 0, 15", "CRSM: 144, 0,000000146F1404001AA0AA01020000 "},
{" CRSM = 176,28436,0,0,20 "," CRSM: 144,0,416E64726f69644fffffffffffffffffffffffffffffffffffffffffffffffff. "CRSM=192,28433,0,0,15","CRSM:144,0,000000016f11040011a0aa01020000"},
{"CRSM=176,28433,0,0,1","CRSM : 144, 0, 55" },
{" CRSM=192, 12258, 0, 0, 15", " CRSM: 144, 0, 0000000a2fe204000fa0aa01020000" },
{ " CRSM=176, 12258, 0, 0, 10", " CRSM: 144, 0.98101430121181157002" },
...
...
Abrir emulator-arm.exe o emulator-x86.exe en el binario UE, busque la cadena "98101430121181157002" y cámbiela al número de tarjeta SIM deseado.
Por ejemplo:
00209a00h: 31 30 00 00 2b 43 52 53 4d 3a 20 31 34 34 2c 30... CRSM: 144, 0
00209a10h: 2C 39 38 31 30 31 34 33 30 31 32 31 31 38 31 31; , 981014301211811
00209a20h: 35 37 30 32 00 2b 43 52 5 3 4d 3d 31 39 32 2c; CRSM=192,
(2), IMEI, modificación del número IMSI:
Obtenga el código Java del número IMEI del teléfono móvil y el número de enrutamiento ISMI:
Administrador de TelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
String imei = manager.getDeviceId()
String imsi = manager.getSubscriberId(); String imsi = manager.getSubscriberId();
String imsi = manager.getSubscriberId()getSubscriberId();
Busque la implementación de la clase TelephonyManager en el árbol de código fuente de Android: p>
Función miembro getDeviceId:
/**
* Devuelve el ID único del dispositivo, por ejemplo, IMEI y MEID de GSM
* Devuelve el ID de dispositivo único, por ejemplo, el IMEI y MEID de GSM
* o el ESN de un teléfono CDMA. Si el ID del dispositivo no está disponible, se devuelve nulo.
*
* lt;pgt;Permiso requerido:
* {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
*/
cadena pública getDeviceId() {
intenta {
return getSubscriberInfo().getDeviceId();
} catch ( RemoteException ex) {
return null;
} catch (NullPointerException ex) {
return null;
}
}
Función miembro getSubscriberId:
/**
* Devuelve un ID de usuario único, como el IMSI de un teléfono GSM.
* Devuelve nulo si no está disponible.
* lt;pgt;
* Permisos necesarios:
* {@link android.Manifest.permission# READ_PHONE_STATE READ_PHONE_STATE}
*/
cadena pública getSubscriberId() {
intenta {
return getSubscriberInfo().getSubscriberId();
} catch ( RemoteException ex) {
return null;
} catch (NullPointerException ex) {
// Esto puede suceder antes de que el teléfono se reinicie debido a una congelación p>
} p>
return null;
}
}
Las dos funciones miembro anteriores finalmente llaman a la misma función miembro privada getSubscriberInfo () :
private IPhoneSubInfo getSubscriberInfo() {
// Consíguelo cada vez porque el proceso a menudo falla
return IPhoneSubInfo.asInterface(ServiceManager.getService( " iphonesubinfo"));
}
Los números IMSI e IMEI del teléfono móvil obtenidos a través de la función privada getSubscriberInfo antes mencionada están codificados en el archivo android_modem.c:
/* La pila GSM de Android comprueba si el nombre del operador ha cambiado cuando el roaming está activado
*. Si no, no actualizará el estado de roaming. Si no, no actualizará el ícono de estado de roaming.
*
* Esto significa que necesitamos simular dos operadores diferentes:
* - El primero es el estado de registro "local", y también debe ser el estado de registro "local".
Corresponde al IMEI del usuario suplantado
*
* - el segundo es el estado de registro "roaming" y debe tener
* un nombre y MCC diferente /MNC
*/
#define OPERATOR_HOME_INDEX 0
#define OPERATOR_HOME_MCC 310
#define OPERATOR_HOME_MNC260
#define OPERATOR_HOME_NAME " Android"
#define OPERATOR_HOME_MCCMNC STRINGIFY(OPERATOR_HOME_MCC) (
STRINGIFY(OPERATOR_HOME_MNC)MNC)
#define OPERATOR_ROAMING_INDEX 1
#define OPERATOR_ROAMING_MCC 310
#define OPERATOR_ROAMING_MNC 295
#define OPERATOR_ROAMING_NAME"TelKila"
#define OPERATOR_ROAMING_MCCMNC STRINGIFY(OPERATOR_ROAMING_MCC)
STRINGIFY(OPERATOR_ ROAMING_MNC)
/* Funciones utilizadas para manejar solicitudes no triviales*/
typedef const char* (*ResponseHandler)(const char* cmd, AModem modem
);static const struct {
const char* cmd; /* El comando proviene de libreference-ril.
Entonces, si el primer carácter
es '! entonces el resto es sólo el prefijo */
const char* respuesta; /* Respuesta predeterminada, NULL si se requiere un manejo específico o
si OK es lo suficientemente bueno */ p >
Controlador ResponseHandler; /* Controlador específico, ignorado si 'respuesta' no es NULL,
NULL si OK es lo suficientemente bueno */
} sDefaultResponses[ ] =
{
/* Ver onRadioPowerOn() */
{ "CPHS=1", NULL, NULL },
{ "CTZV =1", NULL, NULL },
...
{ "! VTS=", NULL, handleSetDialTone },
{ "CIMI", OPERATOR_HOME_MCCMNC "000000000" , NULL }, /* Solicitar un número de identificación de usuario internacional*/
{ " CGSN", "000000000000000", NULL }, /* Solicitar una versión de modelo*/
{ " CUSD=2", NULL, NULL }, /* Cancelar USSD */
...
/* Finalizar lista */
{NULL , NULL, NULL}
};
Por lo tanto, abra emulator-arm.exe o emulator-x86.exe en el archivo binario UE, busque la cadena "CGSN" y reemplácelo Cambie al número IMEI deseado; busque la cadena "CIMI" y cámbiela al número IMSI deseado. Cabe señalar que los primeros seis dígitos del número IMSI "310260" no se pueden cambiar, de lo contrario el emulador no podrá conectarse a la red.
Por ejemplo:
001fc700h: 33 00 41 00 48 00 21 2b 56 54 53 3d 00 2b 43 49; VTS=. /p>