1 ポイント 投稿者 GN⁺ 2025-10-17 | 1件のコメント | WhatsAppで共有
  • Kindleアプリの深刻な不安定さ が原因で、Amazonで購入した電子書籍を別のリーダーで読もうと試みた
  • AmazonのウェブDRMシステム は複数のセキュリティ層とランダム化された文字マッピングにより、二重三重の保護を施している
  • 各リクエストごとに 完全に異なるフォントマッピング を使う方式で、一般的なハッキングの試みを困難にしている
  • 画像ベースのハッシュ化と SSIMベースのフォントマッチング によって、すべてのランダム化されたグリフを実際の文字へ復元する方法を開発した
  • 最終的に、購入した本全体をCalibreなどの個人用電子書籍ライブラリで完全に復元・保存するソリューションを完成させた

TL;DR

  • 初めてAmazonの電子書籍を購入した後、Kindle Androidアプリの不安定さ に強い不満を持った
  • 単にオフラインで自由に読みたかっただけだが、ダウンロードもバックアップもできない ため不便を感じた
  • AmazonウェブリーダーのDRMシステムを解析 する中で、複雑なランダム化とアルファベットマッピング構造に直面した
  • 画像ハッシュとフォントマッチング方式 で乱数化を解き、所有する本の復元に成功した
  • このコードの利用にあたっては、購入した本の所有権とバックアップする権利 の重要性を重視する立場である

Amazon Made This Personal

The One Time I Tried To Do Things The Right Way

  • それまでは主に非公式な経路で電子書籍を入手していたが、著者を支援するためAmazonで初めて正式購入を試みた
  • Kindleアプリで本を開くと クラッシュが続発 し、まともに読むことができなかった

I Just Wanted To Read My Book

  • アプリの不安定さのため ウェブリーダーを使おう としたが、オフラインダウンロードも外部リーダー連携もすべて塞がれていることに気づいた
  • Calibreなどの個人ライブラリと 連携不可、バックアップ不可、さらにはAmazonがいつでも削除可能 な形だった
  • 実質的には 所有権のないレンタル形態 であると悟った

It Becomes Personal

  • 返金や非公式ルートを選ぶこともできたが、購入した本の所有権 を証明するため、自らウェブクライアントのリバースエンジニアリングを決意した

  • Kindle Cloud Reader(ウェブ)でネットワークリクエストを分析しているうちに /renderer/render エンドポイントを確認した

  • ダウンロードに必要な条件

    • セッションクッキー (Amazonログイン)
    • レンダリングトークン (startReading APIで取得)
    • ADPセッショントークン (追加認証)
  • ブラウザと同じヘッダーとクッキーでリクエストするとTARファイルが提供される

  • TARファイル内の構成例

    • page_data_0_4.json : (テキスト情報、実際にはテキストではない)
    • glyphs.json : すべての文字のSVG定義
    • toc.json : 目次データ
    • metadata.json : メタ情報
    • location_map.json : 位置マッピング情報

Amazon's Obfuscation Layers of Ebook Hell

  • テキスト抽出時に出てくるデータ例

    {
      "type": "TextRun",
      "glyphs": [24, 25, 74, 123, 91, 18, 19, 30, 4, ...],
      "style": "paragraph"
    }
    
    • 実際の文字ではなく グリフIDの配列 で構成されている
    • 各glyph IDは特定の文字に固定されず、SVGベースの画像 として提供される
    • 換字式暗号(substitution cipher) の構造で、文字とグリフIDのマッピングは一定ではない

The Alphabet Changes Every. Five. Pages.

  • 5ページごとにグリフマッピングがランダムにリセット される
  • 各リクエストごとに異なるmapping tableが適用されるため、電子書籍全体を一度にマッピングしたり解釈したりできない
  • 例として920ページの本では
    • 184回のリクエストが必要
    • 184回のランダムアルファベット解読が必要
    • 合計361個のユニークグリフを特定
    • 合計1,051,745個のグリフを解読する必要がある

Fake Font Hints (They're Getting Sneaky)

  • SVG path内に意味のない 微小なmove命令m3,1 m1,6 m-4,-7)が含まれている
    • ブラウザでは正常にレンダリングされるが、PythonなどのSVGライブラリでは 誤った接続線 が生じる
    • 単純なpath単位の解析によるパース失敗を誘発する
  • 実際のパースでは、path全体を一度に忠実にレンダリングすることで問題を解決できる

Multiple Font Variants

  • フォントも1種類ではなく 4種類(bookerly_normal, italic, bold, bolditalic) が別々に使われている
  • 合字、特殊文字(ffi, fl など) も別個のグリフとして存在し、マッピングの難易度を上げている

OCR Is Mid (My Failed Attempt)

  • レンダリングしたグリフ画像を既存の光学文字認識(OCR)ツールで解釈しようと試みた
    • 認識率は約51%で、残りは失敗
    • 文脈のない単独文字はOCRでは 判別不能(1、l、I、句読点などが混同)

The Solution That Actually Worked

  • 各リクエストごとに glyphs.jsonSVG path情報 が含まれる
  • グリフIDは毎回変わっても、同じ文字であればSVG shape(画像)は同一 である

Why Direct SVG Comparison Failed

  • SVG pathの座標を直接比較すると、微細な差異やpath命令の違いのため失敗した

Pixel-Perfect Matching

  • SVGを画像としてレンダリングした後、ピクセル単位で比較 して同一グリフを識別した
    1. すべてのSVGを512x512解像度の画像に変換(cairosvg使用)
    2. それぞれの画像を 知覚ハッシュ(Perceptual hash) で処理 — 同じ形ならハッシュ値が一致する
    3. 184個のランダムアルファベットマッピングをハッシュ値ベースで統合
    4. 実際の文字と対応付けるため Bookerly TTFフォント の各文字をSSIM(Structural Similarity Index)方式で比較

Why SSIM Is Perfect For This

  • SSIMは画像構造を比較するため、レンダリングの微細な差、アンチエイリアシング、サイズ不一致 を許容できる
  • 未知のグリフごとに、最も高いSSIMスコアを持つTTF文字を対応付けた

Handling The Edge Cases

  • 合字(ff, fi, fl, ffi, ffl)は複数文字を1つのグリフで扱う ため、TTFに直接追加してハッシュ処理した
  • 特殊文字、さまざまなフォントスタイル(太字、イタリック、太字イタリック) もすべて個別ライブラリで管理した

The Moment It All Worked

Final Statistics

=== NORMALIZATION PHASE ===
Total batches processed: 184
Unique glyphs found: 361
Total glyphs in book: 1,051,745

=== MATCHING PHASE ===
Successfully matched 361/361 unique glyphs (100.00%)
Failed to match: 0 glyphs
Average SSIM score: 0.9527

=== DECODED OUTPUT ===
Total characters: 5,623,847
Pages: 920
  • すべての文字が 正確に解読 され、高い完成度で復元が行われた

EPUB Reconstruction With Perfect Formatting

  • JSONデータ内の各 テキストブロックの座標、フォントスタイル、内部リンク 情報を活用し、
    • 段落区切り、配置、太字・イタリック、フォントサイズ、内部リンク まで原本に近い状態を保つEPUBを生成

The Real Conclusion

  • AmazonがウェブDRMにかなりの労力を注いでいることが確認できた
  • 実用のためには過剰な努力だが、知識の習得と技術デモ としては価値がある
  • この内容は 購入者本人の本のバックアップと所有権保護を目的 とするものだと強調している

参考資料(オープンソースコード)

  • PixelMelt/amazon_book_downloader GitHub
    • Amazonウェブリーダーで読む本をバックアップするツール
    • 本文の事例のような複雑なDRM構造も自動で解決
    • 個人保管およびデータ保護・研究に有用

1件のコメント

 
GN⁺ 2025-10-17
Hacker Newsのコメント
  • 面白い事実をひとつ共有する。米国では、このケースは検察の立場から見ると<i>刑事</i>処罰の対象になり得る発言の類型のひとつだ(実際にそうならないことを願うし、裁判所が合衆国憲法修正第1条を尊重するなら棄却されるはずだと思う)。名誉毀損や詐欺のような民事問題ではなく、警察が直接来て逮捕し得る話だ。DRMがなぜエンジニアにそこまで嫌われるのか不思議なら、単に仕事として面倒だからというだけでなく、自分のコンピュータで実際に体験するとひどく苛立たしいからだ。さらに深刻なのは、それがどれほど愚かで不便で回避しやすいかを誰かに伝えることすら、法的に禁じられている点だ。詳しくは EFFの記事 を参照。

    • DMCAは好きではないが、この投稿自体が 17 USC § 1201 に違反するという主張には疑問がある。DRM回避そのものや関連コードの提供が違反なのはもちろんとして、「文章で説明した」だけで処罰された例があるのか知りたい。実際にこうした形(技術的説明)で起訴された判例があるのか気になる。条文は「誰もDRMを回避してはならない」としつつ、「技術・製品・サービス」の流通のみを禁じている。従来型の報道や投稿には適用されないよう慎重に書かれている。条文全文 参照。

    • 現行法は必ず変えるべきだと思う。DRM付きで著作物を配布した場合、その作品は永久に著作権保護の対象外にすべきだと考える。DRMが作品を恒久的にパブリックドメインから排除する機能を果たしているからだ。極端に言えば、デモやプレビューを誤ってDRM付きで配布しただけでも、著作権は無効になるべきだと思う。

  • Amazonでしか買えない本は、以前は本を買ってデスクトップアプリでダウンロードし、Calibreに入れて epub に変換しながらDRMも外してKoboで読んでいた。だが最近AmazonがDRMを強化し、この方法は塞がれた。だから今は、その本を海賊版で入手して読むようになった。

    • Amazonにも問題はあるが、責任の一端は大手出版社にもある。ある大手出版社がAmazonに対してこのDRM脆弱性を必ず塞ぐよう圧力をかけ、そうしなければコンテンツをすべて引き上げるとまで言った(私は2017年から2019年までKindleで働いており、OPがリバースエンジニアリングしたコードの開発チームにいた)。

    • 私の知人に実際に本を書いた人がいるので、ネット違法流通の時代に本がどれだけ売れないかを実感している。本を自分の思い通りに使いたい気持ちは理解できるが、購入後に改めて海賊版を手に入れることと、著者を支援することは別の話だ。本を実際に購入して著者を支援することはできる。本は提供する価値や娯楽時間に比べてとても安い。

    • 本こそ最も安価な娯楽だと思う。価格に対する価値が非常に高い。著者や出版社を支援する意味でも正規購入を勧めたい。厳しい事情があるなら図書館も良い選択肢だ。私の知人には、本は違法ダウンロードする一方で、ストリーミングやバトルパスのあるゲームには何百ドルも使う人がいる。理解できないくらい、本は安すぎると感じる。私は Brandon Sanderson の Storm Archives 全巻を電子書籍で $10 で買った(100時間分の娯楽)。1時間あたり10セントだ。

    • 最近、妻に電子書籍リーダーを買ってあげようとしていたところ、Louis Rossman の Kindle DRM 関連動画を見て、さらにここでKoboの評判も聞いた。結局、私もKoboを買うことになりそうだ。

    • いずれは実物の本をスキャンするカメラで、DRMでロックされた電子書籍を読むかスキャンする時代が来るのかもしれない。

  • 怒ったエンジニアほど恐ろしい存在はないと感じる。この投稿は本当に素晴らしく、ハッキングの本質をよく示している。"一冊の本を読むためだけだったのか? いや。自分の主張を証明するためだったのか? それは確かだ。SVGレンダリング、知覚ハッシュ、フォントメトリクスを学んだのは? たぶんそうだろう"

  • 昔使っていた apprenticealf の DeDRM ツール(現在は nodrm/DeDRM_tools フォーク)で、まだ Kindle PC アプリのダウンロードはできるのだろうか。PCアプリの旧バージョンでしか動かないかもしれないし、最新版でなくてもレジストリをいじって kfx のダウンロードを防ぎ、azw3 形式で受け取れるかもしれない(以前は動いていた)。repo の README 冒頭の wiki リンクに、もうメンテされていないという段落があり、そこにこの話が書かれている。こうしなければ、見た目だけ似ている画面ではなく、より原本に近い電子書籍を入手できない。ここまでしなければならないという事実自体がばかげている。Amazon DRM を突破しようと粘り強く頑張っている人たちには敬意を表したい。

    • ダウンロード後にDRMを突破する方式が崩れたのは、Amazonが "USBでダウンロードして転送" 機能をなくしたからだ。その後、Amazonの電子書籍は二度と買っていない。本を買ってからDRM解除済みの本を違法ダウンロードするというやり方が、まだ現実的な代替手段だ。

    • 私は epubor という有料ツールを使っているが、kindle、kobo、Adobe などほぼすべてのDRMを外して epub に変換してくれる。アプリの最新バージョンにも対応していて、塞がれてもアップデートが早い。本の代金も払い、DRM解除ツールの代金も払うというのは妙だが、これが現実だ。

    • 旧バージョンのPCアプリではダウンロードをサポートしているが、対応バージョンでは2025年4月以降に発売された本はダウンロードできない。

    • Audible の本には Libation を勧める。

  • Amazonでダウンロード機能がなくなってから、所有していた本をすべて解放し、Kavita+koreader に完全移行した。今後は kindle 本を絶対に買わないつもりだ。kindle も両方とも脱獄して koreader を入れた。今では Kavita と進捗同期もできるので、機能面で不足はない。

    • Kindle デバイス向けの最後の大規模脱獄が公開されて以来、私も koreader を Scribe に入れて使っている。進捗同期には Hardcover(Goodreads の代替)を使っている。ただし、おすすめ本はまだ自分の好みにあまり合っていないが、今後ユーザーが増えれば改善することを期待している。

    • Calibre が KOreader に Wi-Fi 経由で本を送れる機能のおかげで、脱獄の価値は本当に大きかった。次のリーダーは、手間なく KOreader が動く Kobo か別製品を選ぶつもりだ。

  • 電子書籍のDRM解除は一種の標準だ。そうしなければ Kobo でまったく読めない。Adobe にもリーダーを登録していないし、Kobo アカウントも作っていない(初期設定も回避した)。

  • Kindle DRM の状況は本当に最悪だ。以前は Calibre に DeDRM プラグインを追加すれば、Kindle for PC アプリの KFX ファイルを簡単に復号できた。2025年初頭以降は不可能になるよう塞がれた。専門家たちは今でも破ってはいるが、もう共有しない。プラグインのメンテナですら身元露見を恐れて公式リリースを止めている。関連リンク1, 関連リンク2 参照。最近は Amazon が回避手段を本当に強力に封じているので、必要な本があるなら、できるだけ早くDRMを外しておくのがよい。

    • Amazonにも問題はあるが、一部の大手出版社にも責任がある。ある出版社がAmazonに対し、DRM回避の脆弱性を必ず塞ぐよう圧力をかけ、そうしなければコンテンツをすべて下げるとまで言った(2017年から2019年にKindleチームで勤務し、OPがリバースエンジニアリングしたコードを書いたチームにいた)。
  • Amazonの電子書籍のDRM解除手法は、Amazonの漫画やグラフィックノベルにはあまり通用しない気がする。だから最近はAmazonを使わず、より簡単にDRMを破れるKoboへ完全に乗り換えた。ただし Amazon が Comixology を買収したため、依然として最も膨大な漫画コレクションを持っている。

    • 画像はまだ完全には解決できておらず、追加の難読化も施されている。

    • 漫画はページ全体の「画像」が必要なので、DRM解除は簡単ではない。ネットワークリクエストを解析してみたのか、それとも著者に画像がどうなっているのか尋ねたのか気になる。

    • すでに知っているかもしれないが、hoopla で図書館カードを使って漫画コンテンツを簡単に入手できた経験がある。地域の図書館事情にもよるが、私が欲しい漫画の約35%は見つけられた。最新作はないが、6〜12か月前に出た新刊なら大きな問題なく読めた。

  • DMCA はいつでも足を引っ張り得る。著者が身元保護に気を配っていることを願う。そうでなければ大きな反動を受けるかもしれない。関連事例1, 関連事例2 参照。

  • 今回の投稿と直接関係する話ではないが、議論とやや関連する情報を共有する。Amazonから本をダウンロードできないときの抜け道として、Overdrive/libby に対応した図書館から電子書籍を借りる方法がある。一部の図書館アプリではDRM付きファイルを直接ダウンロードでき、Adobe+Calibre で処理できる。図書館カードが必要で、欲しい本の在庫にも左右されるが、私が必要とする本の90%はこの方法でまかなえている.