#include <config.h>
#include <turbo/turbo.h>
#include <stdlib.h>
#include <string.h>
#define FAKE_ICCID 1
#define EF_IMSI 0x6F07
#define EF_ICCID 0x2FE2
u8 PROGMEM ef_imsi_path[] = { 0x3F, 0x00, 0x7F, 0x20, 0x6F, 0x07 };
#ifdef FAKE_ICCID
u8 PROGMEM ef_iccid_path[] = { 0x3F, 0x00, 0x2F, 0xE2 };
u8 PROGMEM _ef_iccid[] = {
0x00, 0x00, 0x00, 0x0A, 0x2F, 0xE2, 0x04, 0x00,
0x0F, 0x00, 0xAA, 0x01, 0x02, 0x00, 0x00
};
u8 PROGMEM _att_iccid[] = {
'H', 'e', 'l', 'l', 'o', 'S', 't', 'e', 'v', 'e'
};
#endif
u8 PROGMEM _att_imsi[] = {
0x08, 0x39, 0x01, 0x14, 0x10, '0', 'w', 'n', 'd'
};
#define IMSI_SIZE 9
#define IMSI_RESPONSE_SIZE 15
u8 counter;
u8 *imsi;
u8 *imsi_response;
u8 file[2];
/* bugbug ? doesn't seem to work with the high level API, anyway ... */
void low_level_imsi_select() {
file[0] = 0x3F;
file[1] = 0x00;
sim(0xA4, 0x00, 0x00, 0x02, file);
file[0] = 0x7f;
file[1] = 0x20;
sim(0xA4, 0x00, 0x00, 0x02, file);
file[0] = 0x6F;
file[1] = 0x07;
sim(0xA4, 0x00, 0x00, 0x02, file);
}
void handle_sim_file (File_apdu_data * fa)
{
u8 i;
if (fa->ins == ME_CMD_SELECT)
{
u16 ef = (fa->data[0] << | fa->data[1];
if (ef == EF_IMSI || ef == EF_ICCID)
{
fa->data[0] = 0x9F;
fa->data[1] = 0x0F;
}
return;
}
#ifdef FAKE_ICCID
if (fa->ef == EF_ICCID)
{
if (fa->ins == ME_CMD_GET_RESPONSE)
{
memcpy (fa->data, _ef_iccid, sizeof (_ef_iccid));
fa->data[fa->p3] = 0x90;
fa->data[fa->p3 + 1] = 0x00;
}
if (fa->ins == ME_CMD_READ_BINARY)
{
memcpy (fa->data, _att_iccid, sizeof(_att_iccid));
fa->data[fa->p3] = 0x90;
fa->data[fa->p3 + 1] = 0x00;
}
}
#endif
if (fa->ef == EF_IMSI)
{
if (fa->ins == ME_CMD_GET_RESPONSE)
{
if (counter == 0) {
low_level_imsi_select();
sim(0xC0, 0x00, 0x00, 0x0F, imsi_response); /* GET RESPONSE */
}
memcpy (fa->data, imsi_response, IMSI_RESPONSE_SIZE);
fa->data[fa->p3] = 0x90;
fa->data[fa->p3 + 1] = 0x00;
}
if (fa->ins == ME_CMD_READ_BINARY)
{
switch(counter) {
case 0:
/* learn and retransmit */
low_level_imsi_select();
sim(0xB0, 0x00, 0x00, 0x09, imsi); /* READ BINARY */
memcpy(fa->data, imsi, IMSI_SIZE);
fa->data[fa->p3] = 0x90;
fa->data[fa->p3 + 1] = 0x00;
counter++;
break;
case 1:
/* spoof */
memcpy (fa->data, _att_imsi, sizeof(_att_imsi));
fa->data[fa->p3] = 0x90;
fa->data[fa->p3 + 1] = 0x00;
counter++;
break;
case 2:
counter++;
/* no break intended here */
default:
/* play nice */
memcpy(fa->data, imsi, IMSI_SIZE);
fa->data[fa->p3] = 0x90;
fa->data[fa->p3 + 1] = 0x00;
}
}
}
}
void turbo_handler (u8 action, void *data)
{
switch (action)
{
case ACTION_APP_REGISTER:
break;
case ACTION_APP_UNREGISTER:
break;
case ACTION_APP_INIT:
counter = 0;
imsi = malloc(IMSI_SIZE);
imsi_response = malloc(IMSI_RESPONSE_SIZE);
reg_file (ef_imsi_path, 3);
#ifdef FAKE_ICCID
reg_file (ef_iccid_path, 2);
#endif
break;
case ACTION_FILE_APDU:
handle_sim_file (data);
break;
default:
break;
}
}
以上内容是不是写在877卡rom内的程序?
是不是可以修改了用到904里