Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/goplus/bpl
Binary Processing Language
https://github.com/goplus/bpl
binary-parser bpl go golang language text-processing
Last synced: 2 months ago
JSON representation
Binary Processing Language
- Host: GitHub
- URL: https://github.com/goplus/bpl
- Owner: goplus
- License: apache-2.0
- Created: 2019-05-10T04:53:00.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2022-06-17T18:51:01.000Z (over 2 years ago)
- Last Synced: 2024-06-18T21:41:14.278Z (7 months ago)
- Topics: binary-parser, bpl, go, golang, language, text-processing
- Language: Go
- Size: 462 KB
- Stars: 150
- Watchers: 15
- Forks: 32
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
BPL - Binary Processing Language
============[![Build Status](https://github.com/goplus/bpl/actions/workflows/go.yml/badge.svg)](https://github.com/goplus/bpl/actions/workflows/go.yml)
[![Go Report Card](https://goreportcard.com/badge/github.com/goplus/bpl)](https://goreportcard.com/report/github.com/goplus/bpl)
[![GitHub release](https://img.shields.io/github/v/tag/goplus/bpl.svg?label=release)](https://github.com/goplus/bpl/releases)
[![Coverage Status](https://codecov.io/gh/goplus/bpl/branch/master/graph/badge.svg)](https://codecov.io/gh/goplus/bpl)
[![GoDoc](https://pkg.go.dev/badge/github.com/goplus/bpl.svg)](https://pkg.go.dev/mod/github.com/goplus/bpl)## 快速入门
了解 BPL 最快的方式是学习 qbpl 和 qbplproxy 两个实用程序:
### qbpl
qbpl 可用来分析任意的文件格式。使用方法如下:
```
qbpl [-p .bpl -o .log]
```多数情况下,你不需要指定 `-p .bpl` 参数,我们根据文件后缀来确定应该使用何种 protocol 来解析这个文件。例如:
```
qbpl 1.gif
```不过为了让 qbpl 能够找到所有的 protocols,我们需要先安装:
```
make install # 这将将所有的bpl文件拷贝到 ~/.qbpl/formats/
```### qbplproxy
qbplproxy 可用来分析服务器和客户端之间的网络包。它通过代理要分析的服务,让客户端请求自己来分析请求包和返回包。使用方式如下:
```
qbplproxy -h -b [-p .bpl -f -o .log]
```其中,`` 是 qbplproxy 自身监听的IP和端口,`` 是原始的服务。`-f ` 是过滤条件,这个条件通过 BPL_FILTER 全局变量传递到 bpl 中。
多数情况下,你不需要指定 `-p .bpl` 参数,qbplproxy 程序可以根据你监听的端口来猜测网络协议。例如:
```
mongod --port 37017
qbplproxy -h localhost:27017 -b localhost:37017
```我们会依据端口 27017 知道你要分析的是 mongodb 的网络协议。
## BPL 文法
请参见 [BPL 文法](README_BPL.md)。
## 网络协议研究
### RTMP 协议
格式描述:
* [rtmp.bpl](formats/rtmp.bpl)
测试:
1) 启动一个 rtmp server,让其监听 1936 端口(而不是默认的 1935 端口)。比如我们可以用 [node-rtsp-rtmp-server](https://github.com/iizukanao/node-rtsp-rtmp-server):
```
git clone [email protected]:iizukanao/node-rtsp-rtmp-server.git
cd node-rtsp-rtmp-server
修改 config.coffee,将:
* rtmpServerPort: 1935 改为 rtmpServerPort: 1936;
* serverPort: 80 改为 serverPort: 8080(这样就不用 sudo 来运行了)
coffee server.coffee
```2) 启动 qbplproxy:
```
qbplproxy -h localhost:1935 -b localhost:1936 -p formats/rtmp.bpl | tee rtmp.log
```3) 推流:
```
ffmpeg -re -i test.m4v -c:v copy -c:a copy -f flv rtmp://localhost/live/123
```4) 播流:
在 Mac 下可以考虑用 VLC Player,打开网址 rtmp://localhost/live/123 进行播放即可。
5) 选择性查看
有时候我们并不希望看到所有的信息,rtmp.bpl 支持以 flashVer 作为过滤条件。如:
```
qbplproxy -f 'flashVer=LNX 9,0,124,2' -h localhost:1935 -b localhost:1936 -p formats/rtmp.bpl | tee .log
```或者我们直接用 reqMode(用来区分是推流publish还是播流play) 来过滤。如:
```
qbplproxy -f 'reqMode=play' -h localhost:1935 -b localhost:1936 -p formats/rtmp.bpl | tee .log
```这样就可以只捕获 VLC Player 的播流过程了。
当然,其实还有一个不用过滤条件的办法:就是让推流直接推到 rtmp server,但是播流请求发到 qbplproxy。
### FLV 协议
格式描述:
* [flv.bpl](formats/flv.bpl)
测试:
1) 启动一个 rtmp/flv server,让其监听 1935/8135 端口。
2) 启动 qbplproxy:
```
qbplproxy -h localhost:8888 -b localhost:8135 -p formats/flv.bpl | tee flv.log
```3) 推流:
```
ffmpeg -re -i test.m4v -c:v copy -c:a copy -f flv rtmp://localhost/live/123
```4) 播流:
在 Mac 下可以考虑用 VLC Player,打开网址 http://localhost:8888/live/123.flv 进行播放即可。
### WebRTC 协议
格式描述:
* [webrtc.bpl](formats/webrtc.bpl)
### MongoDB 协议
格式描述:
* [mongo.bpl](formats/mongo.bpl)
测试:
1) 启动 MongoDB,让其监听 37017 端口(而不是默认的 27017 端口):
```
./mongod --port 37017 --dbpath ~/data/db
```2) 启动 qbplproxy:
```
qbplproxy -h localhost:27017 -b localhost:37017 -p formats/mongo.bpl | tee mongo.log
```3) 使用 MongoDB,比如通过 mongo shell 操作:
```
./mongo
```## 文件格式研究
### MongoDB binlog 格式
TODO
### MySQL binlog 格式
TODO
### HLS TS 格式
格式描述:
* [ts.bpl](formats/ts.bpl)
测试:TODO
### FLV 格式
格式描述:
* [flv.bpl](formats/flv.bpl)
测试:TODO
### MP4 格式
格式描述:
* [mp4.bpl](formats/mp4.bpl)
测试:
```
qbpl -p formats/mp4.bpl .mp4
```### GIF 格式
格式描述:
* [gif.bpl](formats/gif.bpl)
测试:
```
qbpl -p formats/gif.bpl formats/1.gif
```