$30 off During Our Annual Pro Sale. View Details »

実行ファイルにおけるバイナリ差分 アルゴリズム/cybozulabs-youth10-minoji

実行ファイルにおけるバイナリ差分 アルゴリズム/cybozulabs-youth10-minoji

Cybozu
PRO

March 31, 2021
Tweet

More Decks by Cybozu

Other Decks in Technology

Transcript

  1. 実行ファイルにおけるバイナリ差分
    アルゴリズム
    サイボウズラボユース成果報告会
    10期 美濃地 正貴 (hiromi_mi)
    2021年3月30日

    View Slide

  2. 自己紹介
    ● 美濃地 正貴 (みのじ まさたか)
    – Twitter: @_hiromi_mi
    – https://hiromi-mi.github.io/

    2020年8月から活動
    – メンター: 光成さん
    – 今後も継続予定です。現状報告をし
    ます

    View Slide

  3. テーマ
    ● 各種バイナリ差分アルゴリズムの調査や実装
    – Levenshtein 距離 にもとづく動的計画法
    – bsdiff
    – Chromium Courgette
    ● 現状:
    – Levenshtein距離とBsdiff アルゴリズムを再実装
    – Courgette の実装解読および再実装をしている

    View Slide

  4. 動機
    ● ソフトウエア更新におけるデータ通信量削減
    – 無尽蔵にデータが使えない環境がまだまだある
    – 日本でナローバンド回線は 企業13% 家庭7% [1]
    – 4G などの従量課金通信
    ● 多くのパッケージマネージャはソフトウエア更
    新時に更新版のバイナリファイルを全て転送し
    ている
    – 旧版と新版の差分を転送すると小さくならないか?

    View Slide

  5. パッチファイルの基本構造
    ● 以下の操作の繰り返しでパッチファイルを構成

    ADD n [文字列] : 各文字ごとに new = old + [文字]

    INSERT n [文字列] : 新ファイルのnバイト目に [文
    字列] を加える

    DELETE n m : 新ファイルのnバイト目以降 m 文
    字を削除
    旧: ABCDEF GHIJKLFUGA
    新: XBCDEF GXXXKL
    ADD 1 [アスキーコード23];INSERT 8 XXX;DELETE 13 4;

    View Slide

  6. bsdiff
    ● バイナリ差分の特性: ソースコードの変更部分と無関係な部分も変化
    – 1命令付け加わるとそのあとの命令で指すアドレスは変化
    ● 各操作の適用領域を工夫して容量を削減
    – 操作の個数は減らせるとよい. 0の連続はbzip2 により圧縮される
    – (一致したバイト数)^2 - (全体のバイト数) を最大化
    ● 再実装
    – https://github.com/hiromi-mi/deltaup-prototype
    旧: HhogefugahogeE
    新: XhogefugahogeX
    ADD 1 [‘X’-’H’, 0, …,0, ‘X’-’E’] → ほとんど0

    View Slide

  7. Courgette
    ● 高効率のバイナリ差分を生成するアルゴリズムとその実

    – 実行ファイルや命令の構造に依存

    Windows, Linux 向けの Google Chrome の更新に利用

    Chromium に密結合。一般のプログラムには使いにくい
    – 使いやすくしたい

    Developer Channel 190.1 → 190.4 の更新の差分ファイ
    ルのバイト数 [2]:

    View Slide

  8. Courgette によるパッチ生成

    1. 旧バイナリと新バイナリを逆アセンブル
    – バイナリ中の命令の call, jmp, mov, je などの命令のアドレス情報
    を取り出す
    – 元々のアドレス情報はプレースホルダーで置換

    2. 旧新バイナリ間でのアドレス情報の対応付けを構成
    – 旧と新の間でアドレス参照先のパターンが似ているものを Shingle
    を用いて検出

    3. 出力
    – プレースホルダーで置き換えられた新旧をbsdiff して出力
    – 対応関係を出力

    View Slide

  9. まとめと今後について
    ● 実行バイナリファイルの差分アルゴリズムを理解しつ
    つ再実装
    ● 今後の課題
    – Courgette の再実装
    – Courgette のアルゴリズムを使いやすくしたい
    ● 光成さんやサイボウズラボの方々に感謝します

    View Slide

  10. References

    [1] 総務省 2019年度 通信利用動向調査
    – https://www.soumu.go.jp/menu_news/s-news/
    01tsushin02_02000148.html

    [2] Software Updates: Courgette
    – http://dev.chromium.org/developers/design-
    documents/software-updates-courgette

    View Slide