如何通过编程访问SIM卡?

21

只需要任何一张旧的GSM兼容SIM卡(最好是3G USIM)。

我猜我需要一些硬件?有人能推荐一些适合业余爱好者的廉价设备,以及一些更专业的设备吗?

我想应该会有完整的API文档与硬件一起提供,所以也许这应该被标记为“与编程无关”?如果是这样,对不起。

有什么好的网址或书籍(我熟悉3GPP标准)。

我并没有黑客行为,请不要担心,只是不满意SIM卡秘书、数据医生恢复等软件,所以想自己编写代码,但可能会转向商业化,或者作为副业提供SIM卡编程服务(从损坏的卡中恢复数据等)。


更新:虽然我主要想阅读我的短信进行备份,但如果有人知道一个便宜的SIM卡写入器(这样我就可以备份全部或部分SIM卡并稍后恢复),那将是一个额外的好处。

1
你正在寻找一种使用读卡器读取SIM卡的方法吗? - Bernd
是的,我可以。你有什么推荐吗? - Mawg says reinstate Monica
5个回答

24

您可以使用任何PC/SC智能卡读卡器(以及写卡器,正如其他人所指出的),并使用一个程序来读取和解析数据。

  • 与卡通信是通过APDU命令完成的(在ISO-7816中定义)
  • SIM(2G)和USIM(3G)卡使用的命令集不同,因此您必须记住这一点
  • SIM卡的文件系统的结构和格式在GSM 11.11(用于2G)和ETSI TS 131.102(用于3G)中定义 - 所有这些文档都是公开的,可免费获取
  • 短信存储在名为EF SMS的文件中,其名称为0x6F3C,在GSM 11.11的第10.5.3节中定义了其结构

直接回答您的问题:

  • 这里是购买SIM读卡器的地方,点击“照片”以查看设备图片和软件截图
  • SIM管理器是可以实现你想要的所有功能的程序(包括读取短信、恢复短信,甚至可以尝试恢复已删除的短信-如果它们仍然物理存在于卡上)
  • SIM卡SDK也可用。这是一个DLL文件,您可以加载并在程序中应用。这个东西为您完成所有繁重的工作,您所需要做的就是在其上创建GUI界面。

我是创建SIM管理器和上述SDK团队中的一员。


1
我正在探索ETSI网站。有很多规范和标准。我应该使用哪一个来开始SIM卡和USIM卡编程?您提到的规范现在是否已经过时了?(请提供不同SIM卡的规范)谢谢。 - Jean
1
可能会有这些标准的新版本,但基础已经存在,任何新功能的添加都将扩展这些标准,而不是替换它们。你应该把这个作为起点,之后你会更清楚还需要在哪里寻找。 - ralien
1
GSM,ETSI,3GPP?我必须参考哪一个?还有其他(U)SIM卡规范/标准吗?可以请您将这些规范与它们所针对的概念匹配吗? - Jean
1
你想用这张卡做什么?操作文件内容吗?如果是的话,那么你需要的是:GSM 11.11(2G)和ETSI TS 131.102(3G)。 - ralien
3
我不知道组织架构是什么。至于你的问题——那些标准解释了SIM卡文件系统中每种文件类型的数据结构格式。一旦你熟悉了这些,你就能用标准化的方式操作文件内容,以便手机能够充分解析它们。为了进行实际的读写操作,你需要熟悉ISO7816中定义的APDU命令。 - ralien
显示剩余4条评论

4
你肯定需要一个智能卡读卡器,从我所了解的情况来看,几乎任何一个都可以,因为它们都必须支持标准功能。它们也很便宜。我的是OmniKey(不确定型号,因为我现在没有它)。
假设你正在Windows下开发,Windows API有一些函数可以让你访问智能卡。这里是CodeProject上的一篇文章,详细讨论了这个问题,并提供了几个C#类的示例,让你无需与底层打交道就能访问大量相关内容。我认为这个人的示例应用程序专门针对SIM卡,所以这可能会有所帮助。

+1 听起来很棒。我不知道Windows有一个API可以做到这一点。我会去查一下并回复你的。再次感谢。 - Mawg says reinstate Monica
1
没问题。 :) 顺便说一下,智能卡读卡器 == 智能卡写卡器。我曾经使用我的OmniKey“读卡器”将数据写入SLE4442存储智能卡,这与SIM卡有些不同,因为它的操作不像SIM卡那么简单,但原理是相同的。 - dandan78

2
  1. pySim

    In the below example, we are changing the card’s IMSI to 901700000003080 (option -i) and we are specifying a new set of -n NAME (Operator name), -t TYPE (Card type), -c CC (Country code), -x MCC (Mobile Country Code), -y MNC (Mobile Network Code) and -s ID (Integrated Circuit Card ID) values.

    $ ./pySim-prog.py -p 0 -n OpenBSC -t sysmosim-gr1 -i 901700000003080 -c 001 -x 001 -y 02 -s 1791198229180000075
    

我需要填充新的SIM卡元数据,这样它才能像原来一样正常工作吗?使用pyusb。

以下是所有选项的完整列表:

$ ./pySim-prog.py -help
  Usage: pySim-prog.py [options]  Options:   
  -h, --help            show this help message and exit
  -d DEV, --device=DEV  Serial Device for SIM access [default: /dev/ttyUSB0]
  -b BAUD, --baud=BAUD  Baudrate used for SIM access [default: 9600]
  -p PCSC, --pcsc-device=PCSC
                        Which PC/SC reader number for SIM access
  -t TYPE, --type=TYPE  Card type (user -t list to view) [default: auto]
  -a PIN_ADM, --pin-adm=PIN_ADM
                        ADM PIN used for provisioning (overwrites default)
  -e, --erase           Erase beforehand [default: False]   
  -S SOURCE, --source=SOURCE
                        Data Source[default: cmdline]
  -n NAME, --name=NAME  Operator name [default: Magic]
  -c CC, --country=CC   Country code [default: 1]
  -x MCC, --mcc=MCC     Mobile Country Code [default: 901]
  -y MNC, --mnc=MNC     Mobile Network Code [default: 55]
  -m SMSC, --smsc=SMSC  SMSP [default: '00 + country code + 5555']
  -M SMSP, --smsp=SMSP  Raw SMSP content in hex [default: auto from SMSC]
  -s ID, --iccid=ID     Integrated Circuit Card ID
  -i IMSI, --imsi=IMSI  International Mobile Subscriber Identity
  -k KI, --ki=KI        Ki (default is to randomize)
  -o OPC, --opc=OPC     OPC (default is to randomize)
  --op=OP               Set OP to derive OPC from OP and KI
  --acc=ACC             Set ACC bits (Access Control Code). not all card types are supported
  -z STR, --secret=STR  Secret used for ICCID/IMSI autogen
  -j NUM, --num=NUM     Card # used for ICCID/IMSI autogen
  --batch               Enable batch mode [default: False]
  --batch-state=FILE    Optional batch state file
  --read-csv=FILE       Read parameters from CSV file rather than command line
  --write-csv=FILE      Append generated parameters in CSV file
  --write-hlr=FILE      Append generated parameters to OpenBSC HLR sqlite3
  --dry-run             Perform a 'dry run', don't actually program the card

源代码可用。

  1. 此外,SIM卡只是智能卡。您可以使用pyscardpyusb 对其进行操作。我发现这个问答很有帮助。

2

有很多产品和硬件可以读写SIM卡,请查看http://forum.gsmhosting.com/vbb/f500/,在这个论坛上,您将会找到关于SIM卡、手机等方面的大量信息,这是自1999年以来最大的资源之一!对于硬件程序员来说,您可以像JDM或ICprog那样构建自己的设备。请查看kiscan.net获取更多信息。


+1 谢谢,乍一看看起来不错。我会检查一下并回复你的。唉,我只是一个纯软件人员,没有任何硬件知识。 - Mawg says reinstate Monica

1
你可以使用simLAB工具来读取和编辑几乎任何SIM文件。它适用于每个PC/SC智能卡读卡器。该工具还允许您备份SIM文件系统。
请查看https://github.com/kamwar/simLAB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接