Cách Amazon bị vượt qua DRM web của Kindle
(blog.pixelmelt.dev)- Do vấn đề rất mất ổn định của ứng dụng Kindle, tác giả đã cố đọc ebook mua từ Amazon trên trình đọc khác
- Hệ thống DRM web của Amazon áp dụng bảo vệ nhiều lớp với cơ chế ánh xạ ký tự được ngẫu nhiên hóa
- Việc dùng bảng ánh xạ font hoàn toàn khác nhau ở mỗi yêu cầu khiến các nỗ lực hack thông thường trở nên khó khăn hơn
- Tác giả đã phát triển cách khôi phục mọi glyph ngẫu nhiên về ký tự thật bằng băm dựa trên hình ảnh và đối sánh font dựa trên SSIM
- Kết quả là hoàn thiện được giải pháp khôi phục và lưu trữ trọn vẹn toàn bộ sách đã mua trong thư viện ebook cá nhân như Calibre
TL;DR
- Sau khi mua ebook đầu tiên trên Amazon, tác giả cực kỳ thất vọng vì ứng dụng Kindle trên Android không ổn định
- Tác giả chỉ đơn giản muốn đọc tự do khi ngoại tuyến, nhưng thấy bất tiện vì không thể tải xuống hay sao lưu
- Khi phân tích hệ thống DRM của trình đọc web Amazon, tác giả đối mặt với cấu trúc ngẫu nhiên hóa và ánh xạ bảng chữ cái rất phức tạp
- Bằng cách dùng băm hình ảnh và đối sánh font, tác giả giải quyết được phần ngẫu nhiên và khôi phục thành công cuốn sách mình sở hữu
- Khi dùng đoạn mã này, tác giả nhấn mạnh tầm quan trọng của quyền sở hữu và quyền sao lưu đối với sách đã mua
Amazon khiến chuyện này trở nên cá nhân
Lần duy nhất tôi cố làm đúng cách
- Trước đây tác giả chủ yếu lấy ebook qua các con đường không chính thức, nhưng lần đầu thử mua chính thức trên Amazon để ủng hộ tác giả
- Khi mở sách trong ứng dụng Kindle, ứng dụng liên tục bị crash nên gần như không thể đọc được
Tôi chỉ muốn đọc cuốn sách của mình
- Vì ứng dụng quá thiếu ổn định, tác giả thử dùng trình đọc web, nhưng phát hiện cả tải xuống ngoại tuyến lẫn tích hợp với trình đọc ngoài đều bị chặn
- Không thể tích hợp với thư viện cá nhân như Calibre, không thể sao lưu, thậm chí Amazon có thể xóa bất cứ lúc nào
- Tác giả nhận ra đây thực chất là một hình thức thuê chứ không có quyền sở hữu thực sự
Mọi thứ trở nên cá nhân
-
Tác giả có thể hoàn tiền hoặc chọn con đường không chính thức, nhưng đã quyết định tự reverse engineering web client để chứng minh quyền sở hữu đối với cuốn sách đã mua
-
Khi phân tích các yêu cầu mạng trong Kindle Cloud Reader (web), tác giả xác định được endpoint
/renderer/render -
Các điều kiện cần để tải xuống
- Cookie phiên (đăng nhập Amazon)
- Token render (lấy qua API
startReading) - Token phiên ADP (xác thực bổ sung)
-
Khi gửi yêu cầu với header và cookie giống trình duyệt, máy chủ trả về tệp TAR
-
Ví dụ cấu trúc trong tệp TAR
page_data_0_4.json: (thông tin văn bản, nhưng thực ra không phải văn bản)glyphs.json: định nghĩa SVG của mọi ký tựtoc.json: dữ liệu mục lụcmetadata.json: siêu dữ liệulocation_map.json: thông tin ánh xạ vị trí
Các lớp làm rối DRM ebook địa ngục của Amazon
-
Ví dụ dữ liệu xuất hiện khi trích xuất văn bản
{ "type": "TextRun", "glyphs": [24, 25, 74, 123, 91, 18, 19, 30, 4, ...], "style": "paragraph" }- Không gồm ký tự thật mà là mảng ID glyph
- Mỗi glyph ID không cố định với một ký tự cụ thể mà được cung cấp dưới dạng hình ảnh dựa trên SVG
- Đây là cấu trúc mật mã thay thế (substitution cipher), trong đó ánh xạ giữa ký tự và glyph ID không cố định
Bảng chữ cái thay đổi sau mỗi. năm. trang.
- Cứ 5 trang thì ánh xạ glyph lại bị đặt lại ngẫu nhiên
- Mỗi yêu cầu dùng một bảng ánh xạ khác nhau, nên không thể ánh xạ hoặc giải mã toàn bộ ebook trong một lần
- Ví dụ với một cuốn sách 920 trang
- Cần 184 yêu cầu
- Cần giải 184 bảng chữ cái ngẫu nhiên
- Xác định tổng cộng 361 glyph duy nhất
- Giải mã 1,051,745 glyph
Gợi ý font giả (họ đang chơi khăm tinh vi hơn)
- Trong SVG path có chèn các lệnh dịch chuyển siêu nhỏ vô nghĩa (
m3,1 m1,6 m-4,-7)- Trên trình duyệt vẫn render bình thường, nhưng trong các thư viện SVG của Python v.v. sẽ tạo ra các đường nối sai
- Điều này khiến việc phân tích bằng cách tách từng path đơn lẻ bị thất bại
- Khi parse thực tế, cần render trung thực toàn bộ path trong một lần để xử lý được vấn đề
Nhiều biến thể font
- Không chỉ có một font mà có 4 loại (bookerly_normal, italic, bold, bolditalic) được dùng riêng biệt
- Ligature, ký tự đặc biệt (
ffi,flv.v.) cũng tồn tại dưới dạng glyph riêng, làm tăng độ khó ánh xạ
OCR chỉ ở mức tạm được (nỗ lực thất bại của tôi)
- Tác giả thử dùng các công cụ nhận dạng ký tự quang học (OCR) hiện có để đọc ảnh glyph đã render
- Tỷ lệ nhận đúng khoảng 51%, phần còn lại thất bại
- Các ký tự đơn lẻ không có ngữ cảnh khó phân biệt trong OCR (
1,l,I, dấu câu v.v. dễ lẫn)
Giải pháp thực sự hiệu quả
- Trong mỗi yêu cầu,
glyphs.jsonchứa thông tin SVG path - Dù glyph ID thay đổi mỗi lần, nếu là cùng một ký tự thì hình SVG vẫn giống nhau
Vì sao so sánh SVG trực tiếp thất bại
- Khi so sánh trực tiếp tọa độ SVG path, khác biệt rất nhỏ và sự khác nhau trong lệnh path khiến phương pháp này thất bại
Đối sánh chính xác đến từng pixel
- Sau khi render SVG thành ảnh, tác giả so sánh ở mức pixel để nhận diện glyph giống nhau
- Chuyển mọi SVG thành ảnh độ phân giải 512x512 (dùng
cairosvg) - Xử lý từng ảnh bằng perceptual hash — nếu hình dạng giống nhau thì giá trị hash trùng nhau
- Hợp nhất 184 bảng chữ cái ngẫu nhiên bằng giá trị hash
- Để ghép với ký tự thật, so sánh từng ký tự trong font Bookerly TTF bằng SSIM (Structural Similarity Index)
- Chuyển mọi SVG thành ảnh độ phân giải 512x512 (dùng
Vì sao SSIM hoàn hảo cho việc này
- SSIM so sánh cấu trúc ảnh nên chấp nhận khác biệt nhỏ khi render, anti-aliasing, và sai lệch kích thước
- Với mỗi glyph chưa biết, tác giả ghép nó với ký tự TTF có điểm SSIM cao nhất
Xử lý các trường hợp đặc biệt
- Ligature (
ff,fi,fl,ffi,ffl) gộp nhiều ký tự thành một glyph, nên được thêm trực tiếp vào TTF và xử lý hash - Ký tự đặc biệt, nhiều kiểu font khác nhau (đậm, nghiêng, đậm nghiêng) cũng được quản lý bằng các thư viện riêng
Khoảnh khắc mọi thứ thực sự hoạt động
Thống kê cuối cùng
=== 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
- Mọi ký tự đều được giải mã chính xác, đạt mức khôi phục rất hoàn chỉnh
Tái dựng EPUB với định dạng hoàn hảo
- Dựa vào thông tin tọa độ khối văn bản, kiểu font, liên kết nội bộ trong dữ liệu JSON
- Có thể tạo EPUB giữ được gần như nguyên bản cả phân đoạn, căn chỉnh, đậm·nghiêng, cỡ chữ, liên kết nội bộ
Kết luận thực sự
- Amazon rõ ràng đã đầu tư rất nhiều công sức vào DRM web
- Với mục đích sử dụng thực tế thì nỗ lực này là quá lớn, nhưng xét như quá trình học hỏi kiến thức và demo kỹ thuật thì vẫn có giá trị
- Tác giả nhấn mạnh nội dung này nhằm sao lưu sách của chính người mua và bảo vệ quyền sở hữu
Tài liệu tham khảo (mã nguồn mở)
- PixelMelt/amazon_book_downloader GitHub
- Công cụ sao lưu sách đang đọc trên trình đọc web Amazon
- Tự động xử lý cả cấu trúc DRM phức tạp như ví dụ trong bài
- Hữu ích cho lưu trữ cá nhân, bảo vệ dữ liệu và nghiên cứu
1 bình luận
Ý kiến Hacker News
Chia sẻ một điều thú vị. Ở Mỹ, trường hợp này là một trong những kiểu phát ngôn mà phía công tố có thể cho là có thể bị xử lý <i>hình sự</i> (hy vọng chuyện đó sẽ không xảy ra, và nếu tòa án tôn trọng Tu chính án thứ nhất thì có lẽ sẽ bác bỏ). Đây không phải vấn đề dân sự như phỉ báng hay gian lận, mà là chuyện cảnh sát có thể trực tiếp tới bắt người. Nếu bạn thắc mắc vì sao DRM lại bị giới kỹ sư ghét đến vậy, thì không chỉ vì đó là thứ phiền toái khi làm việc, mà còn vì khi tự mình gặp nó trên chính máy tính của mình, bạn sẽ thấy nó cực kỳ bực bội. Tệ hơn nữa là, nếu bạn chỉ cho ai đó thấy nó ngu ngốc, bất tiện và dễ bị vượt qua đến mức nào, thì ngay cả việc đó cũng có thể bị cấm về mặt pháp lý. Xem thêm bài viết của EFF.
Tôi không thích DMCA, nhưng tôi nghi ngờ việc nói bài viết này tự nó vi phạm 17 USC § 1201. Việc tự mình vượt DRM hay cung cấp mã liên quan thì dĩ nhiên có thể là vi phạm, nhưng tôi muốn biết có tiền lệ nào chỉ vì "mô tả bằng câu chữ" mà bị xử phạt hay không. Tôi tò mò về án lệ xem đã từng có vụ truy tố nào chỉ dựa trên kiểu này chưa. Luật nói đại ý là “không ai được vượt DRM”, và chỉ cấm phát tán “công nghệ, sản phẩm, dịch vụ”. Nó được viết khá cẩn thận để không áp dụng lên báo chí truyền thống hay các bài đăng kiểu này. Xem toàn văn luật.
Tôi nghĩ luật hiện hành nhất định phải thay đổi. Tôi cho rằng nếu một tác phẩm được phát hành kèm DRM thì tác phẩm đó phải vĩnh viễn bị loại khỏi phạm vi bảo hộ bản quyền. Vì DRM trên thực tế có tác dụng đẩy tác phẩm ra khỏi phạm vi công cộng mãi mãi. Thậm chí tôi còn nghĩ rằng nếu lỡ phát hành cả bản demo hay preview với DRM thì bản quyền cũng nên vô hiệu.
Với những cuốn chỉ có thể mua trên Amazon, trước đây tôi thường mua sách, tải bằng ứng dụng desktop, đưa vào Calibre rồi chuyển sang epub và gỡ luôn DRM để đọc trên Kobo. Nhưng gần đây Amazon siết DRM mạnh hơn nên cách này không còn dùng được nữa. Vì vậy giờ tôi đơn giản là kiếm bản lậu của những cuốn đó để đọc.
Amazon cũng có lỗi, nhưng một phần trách nhiệm thuộc về các nhà xuất bản lớn. Có một nhà xuất bản lớn đã gây áp lực buộc Amazon phải vá lỗ hổng DRM này, nếu không họ sẽ rút toàn bộ nội dung (tôi làm ở Kindle từ 2017-2019, và từng ở đội phát triển đoạn mã mà OP đã reverse engineer).
Tôi biết một người trực tiếp viết sách, nên hiểu rõ sách bán chậm thế nào trong thời đại phát tán lậu trên Internet. Tôi hiểu mong muốn được dùng cuốn sách theo ý mình, nhưng chuyện tải lại bản lậu sau khi mua và chuyện hỗ trợ tác giả là hai việc khác nhau. Bạn vẫn có thể mua sách thật để giúp tác giả. So với giá trị nó mang lại và số giờ giải trí, sách cực kỳ rẻ.
Sách có lẽ là hình thức giải trí rẻ nhất. Tôi nghĩ giá trị trên giá tiền của nó là cực kỳ cao. Tôi khuyến khích mua chính thức để ủng hộ tác giả hay nhà xuất bản. Nếu khó khăn tài chính thì thư viện cũng là một lựa chọn tốt. Tôi biết có người tải lậu sách nhưng lại chi hàng trăm đô cho streaming hay game battle pass. Tôi thấy khó hiểu vì sách thực sự quá rẻ. Tôi đã mua toàn bộ Storm Archives của Brandon Sanderson bản ebook với giá $10 (100 giờ giải trí). Tính ra 10 xu một giờ.
Gần đây tôi định mua cho vợ một máy đọc ebook, xem thêm video của Louis Rossman về DRM Kindle và cũng nghe nhiều lời khen về Kobo ở đây. Có vẻ cuối cùng tôi cũng sẽ mua Kobo.
Có lẽ rồi sẽ đến ngày người ta đọc hoặc quét ebook bị khóa DRM bằng camera scanner cho sách giấy.
Không gì đáng sợ bằng một kỹ sư đang nổi giận! Bài này thực sự xuất sắc và thể hiện rất rõ tinh thần hacking. "Tôi có làm vậy chỉ để đọc một cuốn sách không? Không. Tôi có làm vậy để chứng minh quan điểm của mình không? Chắc chắn là có. Tôi có học về SVG rendering, perceptual hashing và font metrics không? Có lẽ là vậy"
Tôi tò mò không biết công cụ DeDRM của apprenticealf mà tôi từng dùng trước đây (giờ là fork nodrm/DeDRM_tools) còn tải được qua ứng dụng Kindle PC không. Có thể nó chỉ hoạt động với bản cũ của ứng dụng PC, và kể cả không dùng bản mới nhất thì vẫn có thể chặn tải KFX bằng cách chỉnh registry để nhận định dạng azw3 (trước đây từng hoạt động). Trong wiki được link ở đầu README của repo, ngay phần nói rằng dự án không còn được duy trì nữa, có nhắc đến chuyện này. Chỉ bằng cách đó mới lấy được ebook gần với bản gốc hơn (thay vì chỉ là giao diện trông tương tự). Việc phải làm đến mức này tự nó đã quá vô lý. Tôi rất kính trọng những người vẫn kiên trì vật lộn để phá DRM của Amazon.
Cách hack DRM sau khi tải xuống sụp đổ vì Amazon đã bỏ tính năng "Download & Transfer via USB". Từ đó về sau tôi không mua ebook Amazon nữa. Mua sách rồi tải bản lậu đã gỡ DRM có lẽ là phương án thay thế thực tế nhất.
Tôi đang dùng một công cụ trả phí tên là epubor, nó gỡ gần như mọi loại DRM như kindle, kobo, Adobe rồi chuyển sang epub. Nó tương thích với phiên bản ứng dụng mới nhất, và nếu bị chặn thì bản cập nhật cũng ra khá nhanh. Việc vừa trả tiền sách vừa trả tiền công cụ gỡ DRM nghe thật kỳ quặc, nhưng đó là thực tế.
Bản ứng dụng PC cũ vẫn hỗ trợ tải, nhưng các phiên bản được hỗ trợ sẽ không tải được những sách phát hành sau tháng 4/2025.
Với sách Audible thì tôi khuyên dùng Libation.
Sau khi Amazon bỏ chức năng tải xuống, tôi giải phóng toàn bộ số sách mình có và chuyển hẳn hệ thống sang Kavita+koreader. Từ giờ tôi sẽ không bao giờ mua sách Kindle nữa. Tôi cũng jailbreak cả hai máy Kindle để cài koreader. Giờ Kavita còn đồng bộ được cả tiến độ đọc nên chẳng còn thiếu thốn gì về tính năng.
Sau khi bản jailbreak lớn cuối cùng cho thiết bị Kindle được công bố, tôi cũng cài koreader lên Scribe và đang dùng. Tôi dùng Hardcover (một lựa chọn thay Goodreads) để đồng bộ tiến độ đọc. Tuy vậy, phần gợi ý sách vẫn chưa thật sự hợp gu tôi, nhưng hy vọng khi người dùng tăng lên thì sẽ khá hơn.
Chỉ riêng tính năng Calibre gửi sách sang KOreader qua wifi đã khiến việc jailbreak hoàn toàn xứng đáng. Máy đọc tiếp theo của tôi có lẽ sẽ là Kobo hoặc thiết bị khác chạy KOreader mà không phải mất công lằng nhằng.
Gỡ DRM ebook gần như là một tiêu chuẩn mặc định. Nếu không thì thậm chí còn không đọc được trên Kobo. Tôi cũng không đăng ký thiết bị với Adobe, và cũng không tạo tài khoản Kobo (thậm chí bỏ qua cả bước thiết lập ban đầu).
Tình hình DRM Kindle thực sự là tệ nhất. Trước đây chỉ cần thêm plugin DeDRM vào Calibre là có thể giải mã file KFX từ ứng dụng Kindle for PC khá dễ dàng. Từ đầu năm 2025 thì đã bị chặn, không làm được nữa. Các chuyên gia vẫn phá được, nhưng giờ họ không còn chia sẻ nữa. Ngay cả người bảo trì plugin cũng dừng phát hành chính thức vì lo bị lộ danh tính. Xem liên kết liên quan 1, liên kết liên quan 2. Dạo này Amazon chặn các cách vượt qua rất quyết liệt, nên nếu có cuốn nào cần thì tốt nhất nên gỡ DRM càng sớm càng tốt.
Cách gỡ DRM ebook Amazon có lẽ không hiệu quả lắm với truyện tranh/graphic novel của Amazon. Vì vậy gần đây tôi bỏ hẳn Amazon và chuyển hoàn toàn sang Kobo, nơi DRM dễ vượt qua hơn nhiều. Tuy nhiên, vì Amazon đã mua Comixology nên họ vẫn nắm bộ sưu tập truyện tranh lớn nhất.
Phần hình ảnh vẫn chưa được giải quyết trọn vẹn, và còn có thêm lớp làm rối riêng nữa.
Với truyện tranh thì cần cả trang là một "hình ảnh", nên việc gỡ DRM không dễ. Không biết bạn đã phân tích các request mạng chưa, hoặc tôi tò mò tác giả xử lý phần hình ảnh ra sao.
Có thể bạn đã biết rồi, nhưng tôi từng có trải nghiệm khá tốt khi lấy truyện tranh qua hoopla bằng thẻ thư viện. Tùy tình hình thư viện địa phương, nhưng tôi tìm được khoảng 35% số truyện mình muốn. Không có tác phẩm mới nhất, nhưng những đầu sách ra trong khoảng 6~12 tháng trước thì xem được khá ổn.
DMCA có thể bất ngờ quay lại cắn bất cứ lúc nào. Mong là tác giả đã cẩn thận bảo vệ danh tính của mình, nếu không có thể sẽ có hậu quả rất lớn. Xem trường hợp liên quan 1, trường hợp liên quan 2.
Không liên quan trực tiếp đến bài này, nhưng tôi muốn chia sẻ một thông tin có phần liên quan đến cuộc thảo luận. Khi không tải được sách từ Amazon, có một cách lách hẹp là lấy ebook từ thư viện hỗ trợ Overdrive/libby. Một số ứng dụng thư viện cho phép tải trực tiếp file có DRM, rồi có thể xử lý bằng Adobe+Calibre. Cần có thẻ thư viện và việc có sẵn đúng cuốn muốn đọc còn tùy tình hình, nhưng với tôi thì 90% số sách cần đều giải quyết được theo cách này.