fedemengo/ssdp

GitHub: fedemengo/ssdp

一款用于比较和分析二进制 dump 文件的 Python CLI 工具,尤其适合 RFID(MIFARE Classic)dump 的单元级差异分析。

Stars: 0 | Forks: 0

# SSDP - Simple Stupid Dump Parser 一个用于比较和分析二进制 dump 文件的 Python CLI 工具,支持基于单元(unit)的分析。支持 MIFARE Classic dump 和其他二进制格式,提供多字节单元比较(2、4、8 字节单元)以及多种数据表示形式。 ## 安装 ### 从源码安装 ``` pip install -e . ``` ### 开发环境安装 ``` pip install -e ".[dev]" ``` ## 用法 SSDP 提供三个主要命令: ### `ssdp diff` - 比较 dump 文件 比较多个 dump 文件并显示单元级别的差异: ``` # 使用默认 2,4,8 字节单位进行基本 diff ssdp diff dump1.bin dump2.bin # 带有 sector/block 标签的 MIFARE 1K 格式 ssdp diff dump1.bin dump2.bin --format mf1k # 自定义 unit 大小和表示 ssdp diff dump1.bin dump2.bin --units 4,8 --show RAW,INT_LE,NOT_LE # 保存 diff context 供以后查看 ssdp diff dump1.bin dump2.bin --save-ctx diff.ctx # 导出 xxd 风格的报告 ssdp diff dump1.bin dump2.bin --xxd-diff report.xxd ``` ### `ssdp view` - 分析单个文件 通过基于单元的分解来查看和分析二进制文件: ``` # 使用 unit 分析查看(默认行为) ssdp view dump.bin # 查看特定范围 ssdp view dump.bin --range 0x60:0x70 # 使用 diff context 高亮已更改的 unit ssdp view new_dump.bin --ctx diff.ctx # 传统的 xxd hex dump ssdp view dump.bin --xxd # 自定义分析 ssdp view dump.bin --units 4 --show RAW,INT_LE,BIN --format mf1k ``` ### `ssdp conv` - 在不同表示形式之间转换 在不同数据表示形式之间转换数值: ``` # 将值转换为所有表示 ssdp conv 0x1234ABCD 4 # 从特定格式转换 ssdp conv "11110000" 1 --from BIN --to RAW,INT_LE # 输出到文件 ssdp conv 12345 4 -o conversions.txt ``` ## 数据表示形式 SSDP 支持多种数据表示形式以进行全面分析: - **RAW**: 十六进制字节(例如:`61 9A 79 2D`) - **INT_LE**: 小端序(Little-endian)有符号整数(例如:`762944097`) - **INT_BE**: 大端序(Big-endian)有符号整数(例如:`1637513517`) - **NOT_LE**: 小端序按位非(例如:`3532023198`) - **NOT_BE**: 大端序按位非(例如:`2657453778`) - **BIN**: 二进制表示形式(例如:`00101101011110011001101001100001`) - **BIN_NOT**: 二进制按位非(例如:`11010010100001100110010110011110`) - **NOT_RAW**: 十六进制按位非(例如:`9E 65 86 D2`) ## 示例:MIFARE Classic 积分分析 让我们分析两个 MIFARE Classic dump,这两个 dump 之间增加了 2 个积分: ``` ssdp diff dump1.bin dump2.bin --format mf1k --units 4 --show RAW,INT_LE,NOT_LE ``` 输出: ``` Inputs: data01: dump1.bin data02: dump2.bin Diff blocks: [BLOCK] ID=6 S=1 B=2 [BLOCK] ID=8 S=2 B=0 [BLOCK] ID=9 S=2 B=1 [BLOCK] ID=8 S=2 B=0 [units=4] data01: FULL=96 00 00 00 | 69 FF FF FF | 96 00 00 00 | 09 F6 09 F6 data02: FULL=5E 01 00 00 | A1 FE FF FF | 5E 01 00 00 | 09 F6 09 F6 +00 data01: RAW=96 00 00 00 | INT_LE= 150 | NOT_LE=4294967145 data02: RAW=5E 01 00 00 | INT_LE= 350 | NOT_LE=4294966945 ``` 从该输出中,我们可以看出: - Block 8 包含当前积分:150 分(1.50) → 350 分(3.50) - 积分存储在三个位置:+00、+04(按位非)、+08(副本) - NOT_LE 表示形式展示了用于保证数据完整性的按位补码 ### 写入新的积分值 要将 69.42 积分(6942 分)写入卡片: ``` ssdp conv 6942 4 --show RAW,INT_LE,NOT_LE ``` 输出: ``` RAW : 1E 1B 00 00 INT_LE : 6942 NOT_LE : 4294960354 ``` 使用这些值为 Proxmark3 构建 block 数据: ``` [usb] pm3 --> hf mf wrbl --blk 8 -d 1e1b0000e1e4ffff1e1b000009f609f6 -k FFFFFFFFFFFF ``` ## Diff Context 工作流 保存分析上下文并将其应用到新文件: ``` # 生成 diff context ssdp diff original.bin modified.bin --save-ctx changes.ctx # 应用 context 分析新文件 ssdp view new_file.bin --ctx changes.ctx ``` 这只会显示在原始比较中出现过差异的单元,从而方便地专注于相关更改。 ## 命令选项 ### 通用选项 - `--units 2,4,8`: 用于分析的单元大小(默认:2,4,8) - `--show RAW,INT_LE,NOT_LE`: 要显示的列(默认:所有) - `--colorize RAW,INT_LE`: 要进行着色的列(默认:RAW) - `--format mf1k|mf4k`: 用于扇区/Block 标注的 MIFARE 格式 - `--block-size N`: 以字节为单位的 Block 大小(默认:16) - `--no-color`: 禁用彩色输出 ### Diff 特定选项 - `--show-same none|units|bytes|both`: 高亮显示相同的数据 - `--xxd-diff FILE`: 导出 xxd 风格的 diff 报告 - `--xxd-full-dir DIR`: 导出完整的 xxd dump - `--save-ctx FILE`: 为 view 命令保存 diff context ### View 特定选项 - `--range 0x100:0x200`: 查看特定的字节范围 - `--xxd`: 使用传统的 xxd 十六进制 dump 格式 - `--ctx FILE`: 使用 diff context 仅显示已更改的单元 - `--json`: 以 JSON 格式输出(仅限 xxd 模式)
标签:MIFARE Classic, Python, RFID, 二进制分析, 云安全运维, 十六进制查看器, 文档结构分析, 无后门, 逆向工具