Upgrade to Pro — share decks privately, control downloads, hide ads and more …

写真に埋め込まれた音声データを救出せよ

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for R SATO R SATO
March 14, 2026

 写真に埋め込まれた音声データを救出せよ

小江戸らぐ 第284回活動報告会
https://koedolug.connpass.com/event/385833/

Avatar for R SATO

R SATO

March 14, 2026
Tweet

More Decks by R SATO

Other Decks in Programming

Transcript

  1. ソニーのカメラはアプリが入った(過去形) • 「 PlayMemories Camera Apps 」 • 2012 年~2016

    年のカメラが対応 • NEX-6~α6500/α7S II など • RX100 III ~ RX100 Vなど • アプリストアまたはカメラから直 接購入・インストール可能 • 決済はスマホか PCから • 約30のアプリ • タイムラプス、多重露光、フォ トレタッチ、 POBox など • 2025 年8 月31日にサービス終了 2026/3/14 小江戸らぐ 第284 回活動報告会 2
  2. 写真に埋め込まれた音声データを救出せよ • PlayMemories Online は2025 年8月31日にサービス終了 • カメラのアプリは初期化すると消えてしまう • 二度とインストールできない

    • カメラが故障したり、手放したら? • 撮影した音声データが聴けなく なる! 2026/3/14 小江戸らぐ 第284 回活動報告会 5
  3. Document Freedom Day • オープンスタンダードとオープンドキュメント形式の普及・啓 発を目的とした世界的な記念日 • 2026 年は3月25日 •

    文書・スプレッドシートだけでなく 音声・映像など、あらゆる デジタルデータが対象 logo DFD Colored 2026/3/14 小江戸らぐ 第284 回活動報告会 6 https://digitalfreedoms.org/en/ document -freedom -day
  4. JPEGファイルの解析 (1) • とりあえず exiftool で見る • 何か独自データらしい部分が …? $

    exiftool -a –u _DSC2367.JPG ExifTool Version Number : 12.76 File Name : _DSC2367.JPG Directory : . File Size : 20 MB : Sony 0x9407 : 7f e7 b4 7f b7 fc bb b7 f2 45 75 4b fe 6f 3f 26 4d 5e b[...] Sony 0x9408 : 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0[...] Sony 0x9409 : 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0[...] : 2026/3/14 小江戸らぐ 第284 回活動報告会 8
  5. JPEGファイルの解析 (2) • 怪しいタグのデータは 1000 バイトと小さい • MP3のシグネチャである 49 44

    33 03 (ID3) ではない • 他の値も音声データのシグネチャなし $ exiftool -htmlDump _DSC2367.JPG > _DSC2367.JPG.html 2026/3/14 小江戸らぐ 第284 回活動報告会 9
  6. ファイル末尾に怪しいブロック • SD_HEADと SD_FOOTで挟まれたエリアに WAVEファイルぽい データ を確認 • シグネチャは 52

    49 46 46 ?? ?? ?? ?? 57 41 56 45 (RIFF???WAVE) • サイズは約 2MB 2026/3/14 小江戸らぐ 第284 回活動報告会 10
  7. データ抜き出し • JPEGファイルから当該部分のオフセット を取得して dd で出力 • WAVEのRIFFヘッダからサイズ情報 を元にdd で出力

    $ HEAD=$(grep -oba 'SD_HEAD' _DSC2367.JPG | head -1 | cut -d: -f1) $ FOOT=$(grep -oba 'SD_FOOT' _DSC2367.JPG | head -1 | cut -d: -f1) $ dd if=_DSC2367.JPG offset=$HEAD count=$((FOOT-HEAD)) of=sd_area.bin $ RIFF_OFFSET=$(grep -oba 'RIFF' sd_area.bin | head -1 | cut -d: -f1) $ SIZE_HEX=$(dd if=sd_area.bin bs=1 skip=$((RIFF_OFFSET+4)) count=4 2>/dev/null | xxd -p) $ SIZE_DEC=$((0x$SIZE_HEX)) $ RIFF_TOTAL=$((SIZE_DEC + 8)) $ dd if=sd_area.bin bs=1 skip=$RIFF_OFFSET count=$RIFF_TOTAL of=audio.wav $ file audio.wav audio.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 48000 Hz 2026/3/14 小江戸らぐ 第284 回活動報告会 11
  8. データ抜き出し図 • dd のbs=1なのでむっちゃ遅い (別の方法を模索 ) • tail/head で削るほうが速い •

    一連の処理を汎用化して GitHub に公開予定 2026/3/14 小江戸らぐ 第284 回活動報告会 12 JFIF SD_HEAD SD_FOOT HEAD FOOT RIFF (Chunk) (Chunk size) (Payload) RIFF_OFFSET RIFF_OFFSET + RIFF_TOTAL Chunk size + 8