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, 二进制分析, 云安全运维, 十六进制查看器, 文档结构分析, 无后门, 逆向工具