なんのことはない、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を使って長さを調べておきます。実際の読み出し結果は次のとおり。(一部の番号はデタラメに編集してあります)
しばらくSDNの値を眺めていたら、UTF-16でコーディングされていることがわかりました。各レコードの2バイト目からレコードの説明がUTF-16で入っており、22バイト目が番号の長さ。サービス番号文字列が24バイト目から入っています。例えば、最初のレコードでは
サービス番号はAndroid端末では連絡帳のメニューから設定を開くと読み出すことができます。DoCoMoの携帯で開いてみると、同じ文面が表示されたのでした。
Android端末もSIMから番号を読み出して表示しているわけですね。
それぞれのファイルの内容を読み出すには、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から番号を読み出して表示しているわけですね。