1P by GN⁺ 3일전 | ★ favorite | 댓글 1개
  • Kindle 앱의 심각한 불안정성 문제로 인해, Amazon에서 구매한 전자책을 다른 리더로 읽으려고 시도함
  • Amazon 웹 DRM 시스템은 여러 보안 레이어와 난수화된 문자 매핑으로 이중 삼중 보호를 적용함
  • 각 요청마다 완전히 다른 폰트 매핑을 사용하는 방식으로 일반적인 해킹 시도를 어렵게 만듦
  • 이미지 기반 해싱과 SSIM 기반 폰트 매칭을 통해 모든 난수화된 글리프를 실제 문자로 복원하는 방법을 개발함
  • 결과적으로, 구매한 책 전체를 Calibre 등 개인 전자책 라이브러리에서 완전하게 복원 및 보관하는 솔루션을 완성함

TL;DR

  • 첫 Amazon 전자책을 구매 후 Kindle Android 앱의 불안정으로 큰 불만을 가짐
  • 단순히 오프라인에서 자유롭게 읽고 싶었으나, 다운로드 및 백업 불가로 인해 불편함을 느낌
  • 아마존 웹 리더의 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 등 개인 라이브러리와 연동 불가, 백업 불가, 심지어 아마존이 언제든 삭제 가능한 형태임
  • 실질적으로 소유권이 없는 임대 형태임을 깨달음

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 기반의 이미지로 제공됨
    • 치환 암호(서브스티튜션 사이퍼) 구조로, 문자와 글리프 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 내에 의미 없는 미세한 무브 명령(m3,1 m1,6 m-4,-7)이 포함됨
    • 브라우저에서 정상 렌더링되지만, Python 등 SVG 라이브러리에서는 잘못된 연결선이 생김
    • 단순 path 단위 분석을 통한 파싱 실패 유도
  • 실제 파싱 시 전체 path를 한 번에 충실하게 렌더링해야 문제 해결 가능

Multiple Font Variants

  • 폰트도 하나가 아닌 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)는 여러 문자를 한 글리프로 처리하므로, 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 구조도 자동 해결
    • 개인 소장 및 데이터 보호⸱연구에 유용함
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 취약점을 꼭 막으라고 압박했고, 그렇지 않으면 콘텐츠를 모두 끊겠다고 했음(내가 Kindle에서 2017-2019년 근무했고, OP가 리버스 엔지니어링했던 코드의 개발팀에 있었음).

    • 내가 아는 누군가는 책을 직접 쓴 사람이라 인터넷 불법유통 시대에 책이 얼마나 안 팔리는지 실감함. 책을 내 마음대로 사용하고 싶은 욕구는 이해하지만, 구매 후 다시 해적판을 받는 것과 작가를 지원하는 일은 별개임. 책을 실제로 구매하여 작가를 도울 수 있음. 책은 제공하는 가치와 오락 시간에 비해 매우 저렴함.

    • 책이야말로 가장 저렴한 오락임. 가격 대비 가치가 엄청나다고 생각함. 저자나 출판사를 지원한다는 의미로 정식 구매 권장임. 형편이 어려우면 도서관도 좋은 선택임. 내가 아는 누군가는 책은 불법 다운로드하면서 스트리밍이나 배틀패스 게임에는 수백 달러 지출함. 이해할 수 없을 정도로 책은 너무 싸다고 느낌. 나는 Brandon Sanderson의 Storm Archives 전권을 이북으로 $10에 샀음(100시간분 오락). 한 시간에 10센트 꼴.

    • 최근 아내에게 이북리더기를 사주려다가 Louis Rossman의 Kindle DRM 관련 영상도 보고, 또 여기서 Kobo 칭찬도 듣게 됨. 결국 나도 Kobo를 사게 될 것 같음.

    • 결국엔 실물 책 스캐너 카메라로 DRM 잠긴 이북을 읽거나 스캔하는 날이 올 지도 모름.

  • 분노한 엔지니어만큼 무서운 존재는 없다는 걸 느낌! 이 글은 정말 대단했고 해킹의 본질을 잘 보여줌. "단 한 권의 책을 읽으려고 했던가? 아니. 내 주장을 증명하려고 했던가? 그건 확실함. SVG 렌더링·지각 해싱·폰트 메트릭스를 배운 건? 아마도 그랬음"

  • 예전에 썼던 apprenticealf의 DeDRM 도구(현재는 nodrm/DeDRM_tools 포크)로 아직 kindle PC 앱 다운로드가 되나 궁금함. PC 앱 구버전에서만 동작할 수도 있고, 최신 버전이 아니어도 레지스트리 해킹으로 kfx 다운로드를 막고 azw3 포맷으로 받을 수 있음(한때 작동했었음). repo의 README 상단 위키 링크에, 더는 메인테인이 안 된다는 단락에 이 내용이 있음. 이렇게 해야지만 원본에 더 가까운 이북을 받을 수 있음(비슷하게 보이는 화면 대신). 이렇게까지 해야 한다는 사실 자체가 어처구니 없음. 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로 wifi를 통해 책을 넣어주는 기능 덕분에 탈옥이 정말 값졌음. 다음 리더기는 hassle 없이 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가 리버스엔지니어링한 코드 작성팀에 있었음).
  • 아마존 이북 DRM 해제 방법이, Amazon의 만화/그래픽 노블에는 잘 통하지 않을 듯함. 그래서 최근에는 Amazon을 안 쓰고 더 쉽게 DRM을 뚫을 수 있는 Kobo로 완전히 갈아탐. 하지만 Amazon이 Comixology를 인수했기 때문에 여전히 가장 방대한 만화 컬렉션 보유하고 있음.

    • 이미지는 아직 완전히 해결 못 했고, 별도의 난독화가 추가로 되어 있음

    • 만화는 페이지 전체 '이미지'가 필요해서 DRM 해제가 쉽지 않음. 네트워크 요청을 분석해 봤는지, 아니면 저자에게 이미지가 어떻게 되는지 궁금함

    • 이미 알고 있을 수도 있지만, hoopla에서 도서관 카드로 만화 콘텐츠를 쉽게 얻은 경험이 있음. 지역 도서관 상황에 따라 다르지만, 내가 원하는 만화를 약 35%는 찾을 수 있었음. 최신 작품은 없지만, 6~12개월 전에 나온 신간은 큰 문제 없이 볼 수 있었음

  • DMCA가 언제든 발목을 잡을 수 있음. 저자가 신원 보호에 신경 썼길 바람, 그렇지 않으면 큰 후폭풍이 올 수도 있음. 관련 사례1, 관련 사례2 참고.

  • 이번 글과 직접적인 관련은 없지만, 논의 내용과 약간 연관 있는 정보 공유함. Amazon에서 책을 다운로드하지 못할 때 우회하는 틈새 방법으로, Overdrive/libby를 지원하는 도서관에서 이북을 받는 방법이 있음. 일부 도서관 앱은 DRM 걸린 파일을 직접 다운로드 가능하고, Adobe+Calibre로 처리 가능함. 도서관 카드 필요와 원하는 책 재고는 변수지만, 나에게 필요한 책의 90%는 이 방식으로 해결함.