V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zckevin
V2EX  ›  分享发现

写了个工具将数据分块并加密后储存于 jpg 的空间域中上传至各大社交平台, 最后生成一个类似于 Magnet 的短链接

  •  
  •   zckevin · 110 天前 · 818 次点击
    这是一个创建于 110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/zckevin/jpeg-chan

    jpeg-chan

    Tests

    将任意数据分块并加密后储存于 jpeg 图像的空间域中, 上传至各大社交平台, 最后生成一个类似于 Magnet 的短链接.

    原理

    假定图像通道深度为 8-bit, e.g:

    |high <--> low|

    | 1 2 3 4 5 6 7 8 |

    一个字节按照 [1-8] 从高位到低, [6-8] bits 因各大社交平台普遍对 jpeg 图片进行二次处理, 其值易发生变化, 因此将 payload 数据储存于 [1-5] bits 之间.

    e.g. 上传 128KiB 数据至 Bilibili, used bits 为 [1-5], chunk size 设定为 128KiB(即分块数目为 1):

    node bin/cmd.js test -s bili -b 1-5 128k 128k
    

    将生成两张图片, 一张为 Bootloader, 一张为实际文件内容(具体信息参考下一节: 文件格式):

    bootloader:

    bootloader

    payload:

    payload

    同时支持使用另一个图片作为 mask, 例如使用如下文件作为 mask, 上传 128KiB 数据至 Bilibili, used bits 为 [2-5]:

    mask

    node bin/cmd.js test -s bili -b 2-5 128k 128k
    

    payload:

    payload

    修改 used bits 为: [4-5], 可以看到使用空间域的低位将减少图片的噪点(尽管对于深度学习识别系统而言没什么实际作用):

    node bin/cmd.js test -s bili -b 4-5 128k 128k
    

    payload:

    payload

    文件格式

    目标存储文件根据用户提供的 chunk size 切分为 N 个 chunks, 每个 chunk 上传为一张 JPEG 图片. 每张 jpeg 图片对应着一个 FilePointer, 其中包含这个 chunk 的 meta data, 以及该图片的网络 url.

    • FilePointer
      • chunk size
      • used bits
      • checksum
      • urls

    Chunks pointers 和目标存储文件的其它 meta data 储存在 BootloadFile 中, 它也将上传为一张 JPEG 图片.

    • Bootloader
      • array of chunk pointers
      • file size
      • chunk size
      • file name
      • aes_key
      • aes_iv
      • sha256 checksum

    最后根据 BootloaderFile 上传后得到的 FilePointer, 经由 base64url 编码生成一串如下格式的 URI:

    jpegchan://CNABEgMxLTUaIBpV77TOwCh3hCedDr-n_Szv3_F-gkWeoNNXRkwTK7yIIjMSMQorCikwNDU0YTBkZTZjM2M5Nzc1MjEwZDVkZmE5MzI3ZDQxNTY5MDMwMjY1OBAEGAE?password=6060ba5bee6848c3

    password 存储在 URL 的 query 中, 用户在公开分享该 url 时可以将其隐藏并通过其它信道分享 password.

    Supported platforms

    • Bilibili(tested)
    • Weibo(untested)

    Usage

    npm i --location=global jpeg-chan
    
    jpeg-chan -h
    
    # 在当前目录创建 .env 文件或者使用环境变量
    #
    # for bilibili
    #   BILIBILI_SESSION=cookie.SESSDATA
    #   BILIBILI_CSRF=cookie.bili_jct
    

    具体参数参考 bin/cmd.js

    上传文件

    node bin/cmd.js upload -s bili ./package.json 90
    

    下载文件

    文件将保存于/tmp目录下.

    node bin/cmd.js download \
      "jpegchan://CNABEgMxLTUaIBpV77TOwCh3hCedDr-n_Szv3_F-gkWeoNNXRkwTK7yIIjMSMQorCikwNDU0YTBkZTZjM2M5Nzc1MjEwZDVkZmE5MzI3ZDQxNTY5MDMwMjY1OBAEGAE?password=6060ba5bee6848c3"
    

    Todos

    • 支持更多的平台, 暂时只测试了 Bilibili
    • 支持多平台冗余上传
    • 通过兼容 BitTorrent 支持 FUSEfs

    Dev

    debug log

    Run cmd.js with DEBUG=*

    update protocol/protobuf

    • npm run build:pb

    run tests

    • jest: encoder/decoder tests on Node.js
    • karma: encoder/decoder tests on browser

    inspect decoder perf in chrome

    1. write test in //tests/e2e/
    2. run npm run e2e to start chrome and karma server
    3. open performance tab in Devtools and start recording
    4. run npx karma run -- --grep KEYWORD to run the specific test

    免责声明

    免责声明

    本项目开发仅作为科研学习使用, 请勿将本项目用作以下用途, 如若违反本软件作者概不负责,亦不承担任何法律责任.

    • 软件病毒 payload 下发, 回传 C2 服务器
    • 盗版网站 host 视频数据
    • ...
    7 条回复    2024-01-09 21:41:23 +08:00
    tuwulin365
        1
    tuwulin365  
       110 天前
    图种 v2
    kyuuseiryuu
        2
    kyuuseiryuu  
       110 天前 via iPhone
    啊,我还以为是塞到不同的图片传到不同的平台再生成一个统一的链接
    nicevoice
        3
    nicevoice  
       109 天前
    2017 年有人写了个 python 的版本,支持百度,豆瓣,b 站等。
    nicevoice
        4
    nicevoice  
       109 天前
    zckevin
        5
    zckevin  
    OP
       109 天前
    @nicevoice
    感谢提醒, 我之前在 v 站上也见到过同类工具 BiliDrive
    nicevoice
        6
    nicevoice  
       109 天前
    @zckevin 是的,作者也是他,哈哈哈。
    nicevoice
        7
    nicevoice  
       109 天前   ❤️ 1
    @zckevin 是的,作者也是他 @hobbyliu ,哈哈哈。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5419 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:38 · PVG 15:38 · LAX 00:38 · JFK 03:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.