获取SIM卡号(IMSI)

又到一周周未时,该写博客了,但想了一下,突然发现这周什么也没干,也不知道写什么,最后突然在桌面上发现了这段代码,获取IMSI用的,也就拿这东东来写写吧,赶快写完得玩会游戏,游戏时间又到了,Dota……

 

IMSI也就是SIM卡号,是用户的唯一标识,IMSI号码结构为:

    MCC------------- MNC------------------ MSIN

 MCC=移动国家号码,由3位数字组成,唯一地识别移动客户所属的国家。我国为460

   MNC=移动网号,由2位数字组成,用于识别移动客户所归属的移动网。邮电部门GSM PLMN网为00,“中国联通公司”GSMPLMN网为0l

   MSIN=移动客户识别码,采用等长11位数字构成。唯一地识别国内GSM移动通信网中移动客户。

获取IMSI可以用ExTAPI中的lineGetGeneralInfo,它会将各种硬件信息返回到它的第二个结构成员中,即LINEGENERALINFO结构中。

这个结构定义如下:

typedef struct linegeneralinfo_tag {

  DWORD dwTotalSize;

  DWORD dwNeededSize;

  DWORD dwUsedSize;

  DWORD dwManufacturerSize;

  DWORD dwManufacturerOffset;

  DWORD dwModelSize;

  DWORD dwModelOffset;

  DWORD dwRevisionSize;

  DWORD dwRevisionOffset;

  DWORD dwSerialNumberSize;

  DWORD dwSerialNumberOffset;

  DWORD dwSubscriberNumberSize;

  DWORD dwSubscriberNumberOffset;

} LINEGENERALINFO, * LPLINEGENERALINFO;

里面的信息都很清晰了,比如说要获得IMSI,则就这个结构的首地址再加上这个dwSubscriberNumberOffset所指示的偏移。即:

LPTSTR   lstr = (TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset);

要使用lineGetGeneralInfo,也要按照使用tapi的顺序对程序进行初始化,做一些必要的操作才能调用lineGetGeneralInfo

要使用tapi,大概的顺序为:

lineInitializeEx

lineNegotiateAPIVersion

lineOpen

这几个函数调用完之后就可以为获得IMSI来做准备了。

要获得类似IMSIIMEI等的信息,要从名称为“Cellular Line”的设备线路来获得,所以开始就要枚举所有的设备线路,然后查找名字为“Cellular Line”的线路,找到之后,用这个设备线路的句柄来作为lineGeneralInfo的第一个参数。

在使用LINEGENERALINFO以前,先把它的dwTotalSize设为它本身的大小,然后调用一次lineGeneralInfo,执行完后,在lineGeneralInfo中的dwNeededSize结构中返回了要存放所有信息所需要的空间,这时候只需根据这个成员来申请一块内存,用一个LINEGENERALINFO的指针指向它,然后再次调用lineGetGeneralInfo,这时候它里面就已经包含了各种有用的信息了,你想要什么就获取什么吧

下面贴下简单的代码:

  1. int WINAPI WinMain(HINSTANCE hInstance,
  2.                    HINSTANCE hPrevInstance,
  3.                    LPTSTR    lpCmdLine,
  4.                    int       nCmdShow)
  5. {
  6.     LPTSTR  lpszIMSI;
  7.     LINEINITIALIZEEXPARAMS lineExtParams;
  8.     lineExtParams.dwTotalSize = sizeof(lineExtParams);
  9.     lineExtParams.dwOptions = LINEINITIALIZEEXOPTION_USEEVENT;
  10.     DWORD dwAPIVersion = TAPI_CURRENT_VERSION;
  11.     HLINEAPP    hLineApp;
  12.     DWORD   dwNumDevs;
  13.     lineInitializeEx(&hLineApp, NULL, NULL, _T("Mengge"), &dwNumDevs, &dwAPIVersion, &lineExtParams);
  14.     DWORD   dwTSPILineDeviceID = 0;
  15.     for (DWORD dwCurrentDevID = 0; dwCurrentDevID < dwNumDevs; dwCurrentDevID++)
  16.     {
  17.         LINEEXTENSIONID LineExtensionID;
  18.         if (lineNegotiateAPIVersion(hLineApp, dwCurrentDevID, 
  19.             TAPI_API_LOW_VERSION, TAPI_CURRENT_VERSION, 
  20.             &dwAPIVersion, &LineExtensionID) == 0)
  21.         {
  22.             LINEDEVCAPS LineDevCaps;
  23.             LineDevCaps.dwTotalSize = sizeof(LineDevCaps);
  24.             if( ::lineGetDevCaps(hLineApp, dwCurrentDevID, 
  25.                 dwAPIVersion, 0, &LineDevCaps) == 0 ) 
  26.             {
  27.                 BYTE* pLineDevCapsBytes = new BYTE[LineDevCaps.dwNeededSize];
  28.                 if(0 != pLineDevCapsBytes) 
  29.                 {
  30.                     LINEDEVCAPS* pLineDevCaps = (LINEDEVCAPS*)pLineDevCapsBytes;
  31.                     pLineDevCaps->dwTotalSize = LineDevCaps.dwNeededSize;
  32.                     if( ::lineGetDevCaps(hLineApp, dwCurrentDevID, 
  33.                         dwAPIVersion, 0, pLineDevCaps) == 0 ) 
  34.                     {
  35.                         LPTSTR  lstr = (TCHAR*)((BYTE*)pLineDevCaps+pLineDevCaps->dwLineNameOffset);
  36.                         if (!_tcscmp(CELLTSP_LINENAME_STRING, lstr))
  37.                         {
  38.                             dwTSPILineDeviceID = dwCurrentDevID;
  39.                             delete[]  pLineDevCapsBytes;
  40.                             break;
  41.                         }
  42.                     }
  43.                     delete[]  pLineDevCapsBytes;
  44.                 }
  45.             }
  46.         }
  47.     }
  48.     HLINE   hLine = NULL;
  49.     if( ::lineOpen(hLineApp, dwTSPILineDeviceID, 
  50.         &hLine, dwAPIVersion, 0, 0, 
  51.         LINECALLPRIVILEGE_OWNER, LINEMEDIAMODE_DATAMODEM, 0) ) 
  52.     {
  53.         ::lineShutdown(hLineApp);
  54.         return FALSE;
  55.     }
  56.     LINEGENERALINFO lviGeneralInfo;
  57.     lviGeneralInfo.dwTotalSize = sizeof(lviGeneralInfo);
  58.     LONG lRes = ::lineGetGeneralInfo(hLine, &lviGeneralInfo);
  59.     if (lRes != 0 && lRes != LINEERR_STRUCTURETOOSMALL)
  60.     {
  61.         DWORD   dd = GetLastError();
  62.         ::lineClose(hLine);
  63.         ::lineShutdown(hLineApp);
  64.         return FALSE;
  65.     }
  66.     LPLINEGENERALINFO plviGeneralInfo;
  67.     LPTSTR  tsSubscriberNumber;
  68.     LPBYTE pLineGeneralInfoBytes = NULL;
  69.     pLineGeneralInfoBytes = new BYTE[lviGeneralInfo.dwNeededSize];
  70.     plviGeneralInfo = (LPLINEGENERALINFO)pLineGeneralInfoBytes;
  71.     if(pLineGeneralInfoBytes != NULL)
  72.     {
  73.         plviGeneralInfo->dwTotalSize = lviGeneralInfo.dwNeededSize;
  74.         if ( (lRes = ::lineGetGeneralInfo(hLine, plviGeneralInfo)) != 0 )
  75.         {
  76.             ::lineClose(hLine);
  77.             ::lineShutdown(hLineApp);
  78.             return FALSE;
  79.         }
  80.         else
  81.         {
  82.             TCHAR szUnavailable[] = L"Unavailable";
  83.             if(plviGeneralInfo->dwSubscriberNumberSize)
  84.             {
  85.                 tsSubscriberNumber = (WCHAR*)(((BYTE*)plviGeneralInfo)
  86.                     +plviGeneralInfo->dwSubscriberNumberOffset);  //此处就获得了IMSI
  87.             }
  88.             else
  89.             {
  90.                 tsSubscriberNumber = szUnavailable;
  91.             }
  92.         }
  93.     }
  94.     delete [] pLineGeneralInfoBytes;
  95.     return  10;
  96. }

 


注:我用这段程序在有些模拟器上执行不成功,调试了一下发现没有找到名字为“Cellular Line”的设备线路 ,不知道这是为什么……

在SDK里面有个ExAPI的例子,里面有获取IMSI、IMEI、制造商、软件版本等信息的。

Dotaing.....

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值