当前位置: 首页 > news >正文

别再只会插卡开机了!手把手带你用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 读取关键文件实战

获取ICCID

SELECT_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)
  • P2:04表示简单读取模式

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引用数据未找到错误文件ID

5.2 PIN验证流程

VERIFY_PIN = [0x00, 0x20, 0x00, 0x01, 0x08] + list(b"1234") + [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.jsqmd.com/news/844211/

相关文章:

  • 从QT到LVGL:在i.MX6ULL上为嵌入式界面“减负”的实战记录
  • 2026年贵阳百货批发、不锈钢厨具批发、地摊货源怎么选?思洪多元vs云贵川竞品深度对比指南 - 企业名录优选推荐
  • 2026年上饶GEO优化TOP5实力机构大盘点揭秘 - 打我的的
  • Python函数工具实战:functools深度解析
  • 思源插件:思源笔记任务列表 — 自动汇总工作空间所有任务
  • 2026年角钢/热轧花纹板/q355b工字钢/热轧工字钢/q355bH型钢供应商推荐:江苏中矿国际供应链管理有限公司 - 品牌推荐官
  • 04_运算符表达式与类型转换
  • 2026年贵阳地摊创业货源怎么选?从源头百货批发到月入过万的完整指南 - 企业名录优选推荐
  • 探索地图切图新境界:MapCutter 3.8.0 全面解析
  • pyftpdlib错误处理与日志系统:构建稳定可靠的FTP服务终极指南
  • Rust模式匹配实战:深度解析与最佳实践
  • 别再搞混了!APB协议里psel和penable到底谁可以一直拉高?一个例子讲清楚
  • 2026年沃尔玛购物卡回收应用白皮书正规渠道剖析 - 博客万
  • 峰林逐梦・凌空砺心|清远两日突破团建项目 - 佳天下国旅
  • 告别游戏窗口切换困扰:Borderless Gaming让你畅享无缝游戏体验
  • AI Agent Harness Engineering 赋能客户服务:从响应式客服到主动式关怀
  • 深度解析Windows Subsystem for Android:企业级跨平台运行时架构与最佳实践
  • 户外亮化照明工程公司怎么选,苏州市亮化工程公司哪家好? - 博客万
  • 台州黄金回收无套路|实时金价当天结算|椒江实体门店金万家黄金回收让你变现不踩坑 - 润富黄金珠宝行
  • MCP协议详解:让AI Agent连接万物
  • ThinkPad风扇控制新境界:TPFanCtrl2让你的笔记本静如止水
  • 青龙面板签到盒:一站式全平台自动签到解决方案终极指南
  • 用C++模拟堆宝塔游戏:PTA L2-045题解与STL vector实战
  • 3步精通SWF字体替换:JPEXS免费反编译工具终极指南
  • NotebookLM vs 传统BI工具对比实录:同一份财报数据,3种分析路径下的置信度差异高达5.8σ
  • elementui Cascader 级联选择器 每个一级节点下只能选择一个节点
  • 从一次简单的登录绕过看起:HMS v1.0 SQL注入漏洞(CVE-2022-23366)的代码审计入门
  • 05_分支结构与多重选择_if和switch的使用
  • 【亲测免费】 网Conf客户端软件-Windows版:网络管理的得力助手
  • 告别传统绘图:Draw.io Mermaid插件让代码驱动图表生成变得简单