别再只会插卡开机了!手把手带你用APDU命令探索手机SIM卡里的文件迷宫
解码SIM卡文件系统用APDU命令探索移动通信的微观世界当你把SIM卡插入手机时它就像一把打开移动网络大门的钥匙。但鲜为人知的是这张小小的芯片内部运行着一个完整的文件系统其复杂程度堪比微型操作系统。本文将带你用APDU命令直接与SIM卡对话揭开这个隐藏世界的面纱。1. 准备工作搭建你的SIM卡实验室要开始这次探索之旅你需要准备以下工具智能卡读卡器推荐使用ACR122U或PC/SC兼容设备开发环境Python pyscard库或Java javax.smartcardio测试用SIM卡建议使用预付费卡或开发测试卡安装Python环境后用以下命令安装必要依赖pip install pyscard连接读卡器后可以通过这段代码检测卡片from smartcard.System import readers r readers() print(可用读卡器:, r)注意操作商用SIM卡可能违反运营商条款建议使用专门测试卡2. SIM卡文件系统架构解析SIM卡采用分层文件系统结构主要包含三类关键元素文件类型标识符范围典型示例访问方式主文件(MF)3F00根目录自动选择专用文件(DF)7FXXDFTELECOM(7F10)SELECT by FID基本文件(EF)6FXX/4FXXEFICCID(2FE2)READ BINARY重要系统文件分布EF_DIR(2F00)应用目录索引EF_ICCID(2FE2)卡唯一标识EF_PL(2F05)首选语言设置3. APDU命令实战从基础查询到数据提取3.1 选择主文件每个会话都从选择MF开始这是进入文件系统的起点SELECT_MF [0x00, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00] response, sw1, sw2 connection.transmit(SELECT_MF) print(f状态码: {sw1:02X}{sw2:02X})典型响应分析90 00成功6A 82文件未找到6A 86参数错误3.2 遍历应用目录读取EF_DIR获取所有应用列表SELECT_EF_DIR [0x00, 0xA4, 0x00, 0x00, 0x02, 0x2F, 0x00] READ_EF_DIR [0x00, 0xB0, 0x00, 0x00, 0x0F]响应数据采用TLV格式解析示例Tag 61 - Application Template - Tag 4F - AID (USIM应用通常以A000000087开头) - Tag 50 - 应用标签(可读名称)3.3 读取关键文件实战获取ICCIDSELECT_EF_ICCID [0x00, 0xA4, 0x00, 0x00, 0x02, 0x2F, 0xE2] READ_ICCID [0x00, 0xB0, 0x00, 0x00, 0x0A]ICCID采用BCD编码需要转换iccid_hex .join([f{x:02X} for x in response_data]) iccid .join([iccid_hex[i] for i in range(0, len(iccid_hex)) if i%2 ! 0])4. 高级技巧处理复杂文件结构4.1 线性定长记录文件如EF_SMS(6F3C)采用线性定长结构读取方法SELECT_EF_SMS [0x00, 0xA4, 0x00, 0x00, 0x02, 0x6F, 0x3C] READ_RECORD_1 [0x00, 0xB2, 0x01, 0x04, 0x00] # 读取第1条记录关键参数P1记录号(01~FE)P204表示简单读取模式4.2 循环文件处理如EF_LOCI(6F7E)存储位置信息采用循环更新机制SELECT_EF_LOCI [0x00, 0xA4, 0x00, 0x00, 0x02, 0x6F, 0x7E] READ_LAST_RECORD [0x00, 0xB2, 0x00, 0x02, 0x00] # 读取最新记录5. 安全机制与错误处理5.1 常见错误代码解析状态码含义可能原因6982安全条件不满足未通过PIN验证6A81功能不支持卡片类型不符6A86参数错误P1/P2设置无效6A88引用数据未找到错误文件ID5.2 PIN验证流程VERIFY_PIN [0x00, 0x20, 0x00, 0x01, 0x08] list(b1234) [0x08]重要连续三次错误将导致卡片锁定6. 实战案例构建SIM卡信息提取工具完整工作流程示例def get_sim_info(connection): # 选择MF transmit(connection, SELECT_MF) # 读取ICCID iccid read_ef(connection, 0x2FE2, 10) # 读取运营商信息 select_df_telecom(connection) imsi read_ef(connection, 0x6F07, 9) return { ICCID: decode_bcd(iccid), IMSI: decode_bcd(imsi[1:]) # 跳过首字节长度 }在最近一次物联网设备调试中我发现某运营商SIM卡的EF_IMSI实际存储在DF_GSM(7F20)而非标准的DF_TELECOM下。这种特殊情况提醒我们实际开发中需要灵活应对不同厂商的实现差异。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2624652.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!