マイコン工作実験日記

Microcontroller を用いての工作、実験記録

SIMカードからIMSIやMSISDNを読み出す

2015-10-14 20:59:37 | Weblog
なんのことはない、PIN番号入力無しでSIMカード内のデータが読み出せることがわかったので、いくつか読み出してみることにしました。SIMカード内のデータは階層的なファイル構造を持って保存されており、下図のようにGSMとTelecomという2つの主要なDF(Dedicated Fike)というサブディレクトリを持っており、その中に各グループに属するEF(Elementary File)というファイル内にデータが記録されています。下図では、今回読み出してみたEFを示しています。EFICCIDはSIMカード固有の番号ですが、この情報はMF(Master File)の直下に配置されています。

それぞれのファイルの内容を読み出すには、ISO7816-4のコマンドを送ってアクセスします。SELECTコマンドを使ってEFを選択したのちに、そのファイルの構造に応じてREAD BINARYあるいはREAD RECORDコマンドを使ってファイルのデータを読み出します。ファイルの長さが不明の場合には、SELECTの後でGET RESPONSEを使って長さを調べておきます。実際の読み出し結果は次のとおり。(一部の番号はデタラメに編集してあります)

  • ICCIDはSIMカードに割り当てられた固有の番号です。ここではデタラメな値に編集してあります。
  • SST(SIM Service Table)は、そのSIMカードがサポートしている機能やサービスを示しています。
  • SPN (Service Provider Name)は事業者名で NTT DOCOMOになっています。
  • IMSI (International Mobile Subscriber Identity)は携帯の契約者に割り当てられた番号です。
  • PLMNselにはローミング可能な事業者番号が登録されているみたいです。
  • MISIDNは電話番号です。この例の表示は080-8869-7210に相当します。(適当な番号です)
  • SDN (Service DIaling Number)は、サービス番号です。この例では5件登録されていますが、最後の1件は空ですので、実際には4件入っています。

しばらくSDNの値を眺めていたら、UTF-16でコーディングされていることがわかりました。各レコードの2バイト目からレコードの説明がUTF-16で入っており、22バイト目が番号の長さ。サービス番号文字列が24バイト目から入っています。例えば、最初のレコードでは
  • 説明: 0x30C9, 0x30B3, 0x30E2, 0x6545, 0x969C, 0x554F, 0x5408, 0x305B (ドコモ故障問合せ)
  • 長さ: 3
  • 番号: 113
となっているのです。同様にして、
  • ドコモ総合案内・受付 -- 151
  • 海外紛失・盗難等 -- +81368326600
  • 海外故障 -- +81367181414
が登録されていることがわかりました。

サービス番号はAndroid端末では連絡帳のメニューから設定を開くと読み出すことができます。DoCoMoの携帯で開いてみると、同じ文面が表示されたのでした。



Android端末もSIMから番号を読み出して表示しているわけですね。