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

别再只当SIM卡用了!用Python脚本和APDU命令,带你亲手“解剖”手机卡里的文件系统

用Python和APDU命令探索USIM卡文件系统的实战指南当你把手机卡插入设备时它不仅仅是一个身份标识——实际上这是一套完整的微型操作系统。本文将带你用Python脚本和APDU命令像安全研究员一样亲手探索USIM卡内的文件系统结构。1. 准备工作搭建USIM卡探索环境要开始探索USIM卡你需要准备以下硬件和软件支持APDU命令的读卡器推荐使用ACR122U或类似型号价格约200-500元一张可读写的USIM卡运营商提供的普通USIM卡即可Python开发环境建议3.8版本必要的Python库pip install pyscard python-apdu注意操作USIM卡有一定风险建议在测试卡或备份重要数据后进行实验连接读卡器后用以下代码检测是否识别到卡片from smartcard.System import readers # 获取可用读卡器列表 reader_list readers() if not reader_list: raise Exception(未检测到读卡器) # 连接第一个读卡器 connection reader_list[0].createConnection() connection.connect() print(f已连接: {reader_list[0]}) print(fATR: {connection.getATR()})2. APDU命令基础与USIM卡对话的语言APDU(Application Protocol Data Unit)是与智能卡通信的基本单位。一个完整的APDU命令包含以下部分字段长度描述CLA1字节指令类别INS1字节指令代码P11字节参数1P21字节参数2Lc0-3字节数据域长度Data变长命令数据Le0-3字节期望响应长度用Python发送APDU命令的通用函数def send_apdu(connection, cla, ins, p1, p2, dataNone, le0): apdu [cla, ins, p1, p2] if data: apdu.append(len(data)) apdu.extend(data) if le 0: apdu.append(le) response, sw1, sw2 connection.transmit(apdu) return response, (sw1 8) | sw2 # 示例选择MF(主文件) response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x3F, 0x00]) print(f响应: {response}, 状态: {hex(status)})3. 探索文件系统从MF到EF的完整遍历USIM卡的文件系统采用树状结构主要包含三种文件类型MF (Master File)根目录固定ID为3F00DF (Dedicated File)专用目录相当于文件夹EF (Elementary File)基础文件存储实际数据3.1 选择并解析MF# 选择MF response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x3F, 0x00]) if status ! 0x9000: raise Exception(选择MF失败) # 获取MF的FCP(文件控制参数) response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x3F, 0x00], 0x10) print(fMF FCP: {bytes(response).hex()})3.2 遍历DF和EF以下函数可以递归遍历USIM卡的文件系统def explore_filesystem(connection, current_path, depth0): indent * depth print(f{indent}探索路径: {/.join(f{b:02X} for b in current_path)}) # 选择当前路径 if current_path: response, status send_apdu(connection, 0x00, 0xA4, 0x08, 0x00, current_path) if status ! 0x9000: print(f{indent}选择失败: {hex(status)}) return # 获取当前目录下的文件列表 (假设有EFDIR) response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x2F, 0x00]) # 尝试选择EFDIR if status 0x9000: # 读取EFDIR内容 response, status send_apdu(connection, 0x00, 0xB0, 0x00, 0x00, le0xFF) print(f{indent}EFDIR内容: {bytes(response).hex()}) # 尝试选择常见DF common_dfs [ ([0x7F, 0x10], DFTELECOM), ([0x7F, 0x20], DFGSM), ([0x7F, 0x21], DFDCS1800), ([0x7F, 0xFF], 当前ADF) ] for df_id, df_name in common_dfs: new_path current_path df_id response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, df_id) if status 0x9000: print(f{indent}发现DF: {df_name} ({bytes(df_id).hex()})) explore_filesystem(connection, new_path, depth1) # 从MF开始探索 explore_filesystem(connection, [])4. 解析关键文件IMSI、ICCID等USIM卡中存储着许多重要信息以下是常见EF文件及其ID文件名称FID描述EF_ICCID2FE2卡唯一标识EF_IMSI6F07用户标识EF_LP6F05语言偏好EF_AD6FAD管理数据4.1 读取IMSI示例def read_imsi(connection): # 选择DFTELECOM response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x7F, 0x10]) if status ! 0x9000: raise Exception(选择DFTELECOM失败) # 选择EF_IMSI response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x6F, 0x07]) if status ! 0x9000: raise Exception(选择EF_IMSI失败) # 读取IMSI (前9字节) response, status send_apdu(connection, 0x00, 0xB0, 0x00, 0x00, le9) if status ! 0x9000: raise Exception(读取IMSI失败) # IMSI格式解析 imsi_bytes bytes(response) imsi_digits [] for b in imsi_bytes: imsi_digits.append(f{(b 4) 0x0F}) imsi_digits.append(f{b 0x0F}) # 第一个字节的高4位是长度 imsi_length int(imsi_digits[0]) imsi .join(imsi_digits[1:imsi_length1]) return imsi print(fIMSI: {read_imsi(connection)})4.2 读取ICCID示例def read_iccid(connection): # 选择MF response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x3F, 0x00]) if status ! 0x9000: raise Exception(选择MF失败) # 选择EF_ICCID response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x2F, 0xE2]) if status ! 0x9000: raise Exception(选择EF_ICCID失败) # 读取ICCID (10字节) response, status send_apdu(connection, 0x00, 0xB0, 0x00, 0x00, le10) if status ! 0x9000: raise Exception(读取ICCID失败) # ICCID格式解析 iccid_bytes bytes(response) iccid_digits [] for b in iccid_bytes: iccid_digits.append(f{(b 4) 0x0F}) iccid_digits.append(f{b 0x0F}) # 去除可能的填充F iccid .join(iccid_digits).rstrip(F) return iccid print(fICCID: {read_iccid(connection)})5. 高级技巧处理TLV格式数据USIM卡中许多数据采用TLV(Tag-Length-Value)格式存储。以下是一个TLV解析工具函数def parse_tlv(data): result {} index 0 while index len(data): tag data[index] index 1 # 处理多字节tag (简化版) if (tag 0x1F) 0x1F: while (data[index] 0x80) 0x80: tag (tag 8) | data[index] index 1 tag (tag 8) | data[index] index 1 # 获取长度 length data[index] index 1 if length 0x81: length data[index] index 1 elif length 0x82: length (data[index] 8) | data[index1] index 2 # 获取值 value data[index:indexlength] index length result[hex(tag)] bytes(value).hex() return result # 示例解析SELECT响应 response, status send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x6F, 0x07]) # 选择EF_IMSI if status 0x9000: tlv_data parse_tlv(response) print(TLV解析结果:) for tag, value in tlv_data.items(): print(f {tag}: {value})6. 安全注意事项与最佳实践在探索USIM卡文件系统时需要注意以下安全事项避免频繁写入USIM卡有有限的擦写次数(通常约10万次)备份重要数据操作前备份EF_IMSI等关键文件谨慎处理鉴权相关文件如EF_Kc、EF_OPc等遵守法律法规仅对自己的USIM卡进行实验以下是一些有用的调试技巧# 启用APDU日志 def logged_send_apdu(connection, cla, ins, p1, p2, dataNone, le0): cmd fCLA: {cla:02X}, INS: {ins:02X}, P1: {p1:02X}, P2: {p2:02X} if data: cmd f, Data: {bytes(data).hex()} if le: cmd f, Le: {le:02X} print(f发送: {cmd}) response, status send_apdu(connection, cla, ins, p1, p2, data, le) print(f响应: {bytes(response).hex() if response else }, 状态: {status:04X}) return response, status # 示例使用 logged_send_apdu(connection, 0x00, 0xA4, 0x00, 0x00, [0x3F, 0x00])在实际项目中我发现最常遇到的问题是无法正确解析TLV数据。一个实用的技巧是先用SELECT命令获取文件的FCP(文件控制参数)其中包含了文件的结构信息。

相关文章:

别再只当SIM卡用了!用Python脚本和APDU命令,带你亲手“解剖”手机卡里的文件系统

用Python和APDU命令探索USIM卡文件系统的实战指南 当你把手机卡插入设备时,它不仅仅是一个身份标识——实际上,这是一套完整的微型操作系统。本文将带你用Python脚本和APDU命令,像安全研究员一样亲手探索USIM卡内的文件系统结构。 1. 准备工作…...

ARM TLB失效指令原理与应用实践

1. ARM TLB失效指令深度解析在ARM架构中,TLB(Translation Lookaside Buffer)作为内存管理单元(MMU)的关键组件,负责缓存虚拟地址到物理地址的转换结果。当操作系统修改页表或进行上下文切换时,必…...

从SQL搬数据到智能分析:5级模型带你掌握数据分析AI Agent,收藏这份进阶指南!

本文介绍了数据分析AI Agent的概念及其与传统BI和ChatGPT的区别,提出了一个包含5个级别的成熟度模型来定位团队所处的阶段。文章重点解析了数据分析Agent的三层架构演进:Function Calling、ReAct模式和多Agent协作,并以电商实战案例展示了如何…...

告别Excel!用JimuReport的SQL数据源,5分钟搞定学生信息报表(附完整SQL语句)

告别Excel!用SQL数据源5分钟生成学生信息报表的实战指南 每次期中考试后,张老师都要面对同样的噩梦:从教务系统导出学生名单,在Excel里手动调整格式、添加班级平均分、按成绩排序,最后打印分发给各科任课教师。上周五&…...

Speechless:三步完成微博备份PDF导出的Chrome扩展终极指南

Speechless:三步完成微博备份PDF导出的Chrome扩展终极指南 【免费下载链接】Speechless 把新浪微博的内容,导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 你是否曾担心自己珍贵的微博内…...

《线性代数思维》:以代码和案例开启线性代数实用学习之旅!

《线性代数思维》介绍《线性代数思维》以代码为先导、以案例为基础,介绍了线性代数中最常用的概念,专为那些想理解并应用这些概念,而非仅抽象学习的读者设计。每一章都围绕一个现实世界的问题展开,如模拟网络流量、仿真鸟群飞行或…...

3分钟掌握:网易云音乐无损FLAC批量下载终极指南

3分钟掌握:网易云音乐无损FLAC批量下载终极指南 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为无法保存高品质音乐而烦恼吗&#x…...

如何通过开源自动化工具优化《明日方舟》基建管理效率

如何通过开源自动化工具优化《明日方舟》基建管理效率 【免费下载链接】arknights-mower 《明日方舟》长草助手 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower 在《明日方舟》的长期游戏过程中,基建管理往往成为玩家需要频繁处理的核心环节。…...

24GB 内存 M4 运行本地模型:虽有局限但乐趣与优势并存!

在配备 24GB 内存的 M4 上运行本地模型 2026 年 5 月 10 日,阅读时长 13 分钟。涉及 Elixir、大语言模型(LLM)、通义千问(Qwen)、LLM Studio。断断续续尝试在本地运行模型一段时间后,终于找到可行方案。虽输…...

如何永久保存微信聊天记录?WeChatExporter一站式解决方案

如何永久保存微信聊天记录?WeChatExporter一站式解决方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 在数字时代,微信聊天记录承载着我们的工…...

USB枚举过程深度解析:主机是如何‘读懂’你的配置描述符的?

USB枚举过程深度解析:主机是如何‘读懂’你的配置描述符的? 当我们将一个USB设备插入电脑时,短短几秒钟内,主机和设备之间已经完成了数十次数据交换。这个过程被称为枚举(Enumeration),是USB协议…...

MySQL 如何正确实现“随机采样”

在开发英语学习或社交应用时,随机展示单词或消息是一个高频需求。然而,看似简单的“随机”逻辑,如果实现方式不当,会随着数据量的增长演变为系统瓶颈 。 1. 性能陷阱:order by rand() 最直观的写法是 select word from…...

英雄联盟智能助手League Akari:重新定义你的游戏体验边界

英雄联盟智能助手League Akari:重新定义你的游戏体验边界 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的竞技世界中&…...

OpenOCD实战:从源码编译到JTAG调试RISC-V平台

1. OpenOCD与RISC-V调试基础 第一次接触OpenOCD调试RISC-V芯片时,我对着开发板上的JTAG接口发了半天呆。作为嵌入式开发者,我们都经历过这种从零搭建调试环境的阵痛期。OpenOCD就像一位硬件调试的瑞士军刀,它能通过JTAG接口与各种处理器架构对…...

B站缓存视频终极转换指南:3分钟将m4s文件无损转为通用MP4格式

B站缓存视频终极转换指南:3分钟将m4s文件无损转为通用MP4格式 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的…...

Windows Cleaner终极指南:彻底告别C盘爆红的免费系统优化神器

Windows Cleaner终极指南:彻底告别C盘爆红的免费系统优化神器 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款专为Windows系统设…...

绝区零自动化助手:5分钟掌握全自动游戏任务管理

绝区零自动化助手:5分钟掌握全自动游戏任务管理 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 绝区零一条龙是…...

终极指南:如何彻底解锁《原神》60帧限制?完整免费解决方案

终极指南:如何彻底解锁《原神》60帧限制?完整免费解决方案 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是一个文章写手,你负责为开源项目写专业易…...

如何用猫抓浏览器扩展轻松捕获在线视频资源?一个实用工具的全方位指南

如何用猫抓浏览器扩展轻松捕获在线视频资源?一个实用工具的全方位指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 当你在浏览器中观…...

我的世界手机版烦人的村民整合包下载基岩国际版2026最新版

在《我的世界》庞大的模组生态中,烦人的村民整合包(Annoying Villagers) 凭借颠覆性的 NPC 设定、硬核战斗机制与深度剧情互动,成为 Java 版最具影响力的高难度生存整合包之一。由 Pugilist_Steve 主导开发,最新 6.0 版…...

夜莺传说服务器联机开服教程

本教程转载莱卡云游戏服务器的莱卡云:夜莺传说开服教程【百度搜索莱卡云开服可搜到】1、购买后登录服务器在你的莱卡云账户左侧栏目中点击产品服务,再点游戏服务器,再选择你的服务器点击操作进入服务器产品详情页面后,先点重置密码…...

Hitboxer终极指南:3分钟解决游戏按键冲突,让你的键盘操作瞬间职业化

Hitboxer终极指南:3分钟解决游戏按键冲突,让你的键盘操作瞬间职业化 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否在激烈的游戏对战中遇到过这样的困扰:明明同时按下…...

别再死记硬背了!用‘知识卡片+思维导图’法搞定离散数学里的命题、谓词与代数系统

知识卡片与思维导图:离散数学的高效学习革命 离散数学常被学生称为"天书"——命题逻辑的符号迷宫、谓词逻辑的量化陷阱、代数系统的抽象森林,每个概念都像一座孤岛。传统线性笔记法让这些知识点在脑海中如散沙般难以聚合,这正是大多…...

用LDAP Browser连接OpenLDAP时,这3个配置细节坑了我一整天

用LDAP Browser连接OpenLDAP时,这3个配置细节坑了我一整天 第一次用LDAP Browser连接OpenLDAP服务器时,我本以为照着教程五分钟就能搞定,结果硬是折腾了一整天。明明服务端已经正常启动,客户端工具也装好了,但就是连不…...

别再死记硬背了!用Python代码动画演示组合数11个核心性质(附完整源码)

用Python动画拆解组合数:11个核心性质的动态演绎 数学公式总是让人望而生畏?当组合数学遇上Python动画,抽象概念瞬间变得鲜活起来。这不是又一篇枯燥的公式推导文章,而是一场用代码演绎数学之美的视觉盛宴。我们将用matplotlib和…...

在飞腾FT-2000/4与麒麟V10上源码编译VLC:从依赖解析到播放验证的完整实践

1. 环境准备与依赖解析 在飞腾FT-2000/4处理器和麒麟V10系统上编译VLC,首先需要搭建合适的开发环境。我实测发现,麒麟V10自带的软件源有时无法满足所有依赖需求,需要手动补充配置。建议先执行以下基础命令更新系统: sudo yum up…...

企业上云选型:四家主流云厂商的硬指标对比

在数字化转型进入深水区的2026年,企业IT部门的任务已不再是简单的“资源扩容”,而是如何在保障业务连续性的前提下,实现安全免运维与成本控制的完美平衡。 针对官网、小程序等互联网业务,各大公有云厂商均有成熟方案。但当涉及到…...

YOLOv5 COCO数据集 实战训练全流程解析 | 【从零到一】

1. 环境准备:从零搭建YOLOv5训练环境 第一次接触YOLOv5时,我最头疼的就是环境配置。记得当时为了一个CUDA版本问题折腾了整整两天,现在回想起来其实只要按步骤来就能避免90%的坑。下面是我总结的最稳环境搭建方案: 首先确保你的机…...

别再硬算公式了!用Excel搞定STM32 NTC测温的ADC查表法(附完整表格)

用Excel玩转STM32 NTC测温:查表法实战指南 嵌入式开发中,温度测量是个永恒的话题。NTC热敏电阻因其成本低廉、响应迅速,成为工程师们的首选传感器。但每次项目都要重新推导温度计算公式,不仅耗时费力,还容易在数学转换…...

从 AI 电影到小说:《凰标》延续《第一大道》的东方梦@凤凰标志

科技为翼,文脉为魂; 大道开路,凰标定局。一、时代之问:当AI沦为流量收割机,谁来守护东方文脉? AI 正以惊人的速度渗透文娱产业,却多数被资本用作「快餐内容」的流水线。 海棠山铁哥反其道而行—…...