Compare commits

..

30 Commits

Author SHA1 Message Date
Apprentice Harper
2042354788 Update PDF to use Decimal instead of float to handle very precise numbers. Update for changes to ActiveState Python. Fix a few copyright dates. Update version to 6.5.4. Minor changes to obok script for stand-alone use. 2017-06-27 07:05:37 +01:00
Apprentice Harper
9bea20c7ab fix formatting 2017-06-22 07:01:09 +01:00
Apprentice Harper
415df655a1 Add disabling workaround to KFX section. 2017-06-22 06:59:36 +01:00
Apprentice Harper
346b3e312c KFX Decrypter archive in Pascal! 2017-06-20 06:55:25 +01:00
Apprentice Harper
f981a548a3 Merge pull request #300 from concavegit/master
Linux documentation update from concavegit
2017-06-20 06:46:53 +01:00
concavegit
4084a49872 fix step numbers 2017-06-18 21:04:16 -07:00
concavegit
347ad3cc05 Update kindle on linux documentation
- ActivePython for x86 is gone, but using regular python, at least for the kindle decryption, works.
- The new kindle for pc hangs during wine installation, but the one presented by `winetricks kindle` works.
- The decryption keys must be manually obtained.
- vcrun2008 stops any available version of Kindle from being able to install.

I have only tested these steps for kindle for PC on linux, so these changes may step on some toes. However, it does seem the linux documentation needs updating nonetheless.
2017-06-18 21:02:49 -07:00
Apprentice Harper
e4b702e241 Merge pull request #257 from agronauts/multi_decrypt
Add support to command line tool to decrypt all kobo books instead of having to choose books one by one.
2017-04-27 07:51:40 +01:00
Patrick Nicholls
691a3d6955 Added --all flag to sys.args 2017-04-24 21:48:53 +12:00
Apprentice Harper
fa317dc1cf KFX and other updates to the readmes 2017-04-20 08:03:56 +01:00
Patrick Nicholls
6f0c36b67a Implement decrypting of all books 2017-04-16 12:27:34 +12:00
Patrick Nicholls
ceacdbbb1b Refactor decrypt book & add 'all' option to CLI 2017-04-16 12:16:59 +12:00
Apprentice Harper
ff03c68674 Fix for problem starting Mac app due to missing folder 2017-03-23 06:28:24 +00:00
Apprentice Harper
84d4e4e0c8 Fixes for FAQs file concerning Kindle for PC/MAc 2017-03-10 06:59:33 +00:00
Apprentice Harper
a553df50d7 added more info about 1.19 2017-03-08 17:05:51 +00:00
Apprentice Harper
0b244b5781 Merge pull request #198 from dunesmopy/patch-1
Support multiple input Kindle files
2017-03-01 06:50:53 +00:00
dunesmopy
ab4597dfd7 Address review feedback
* Version number updated to 5.5 in the version variable.
  * allow a variable number of input parameters, either files or directories of files.
  * also look for .azw1, .azw3, .azw4, .prc, .mobi, and .pobi files in any specified directories.
2017-02-11 17:35:52 -08:00
Apprentice Harper
82e9927ace Merge pull request #200 from dunesmopy/patch-3
Update FAQs.md
2017-02-09 06:46:23 +00:00
Apprentice Harper
528092c05d Updates FAQs.md
Adjust description of path to ebook files to use current location in Windows 7 and later as default.
2017-02-09 06:43:41 +00:00
Apprentice Harper
faa19cc19b Merge pull request #199 from dunesmopy/patch-2
Update FAQs.md
2017-02-09 06:39:28 +00:00
dunesmopy
e6592841b6 Update FAQs.md
Document included compiled binaries.
2017-02-04 12:34:19 -08:00
dunesmopy
482ac15055 Update FAQs.md 2017-02-04 12:28:42 -08:00
dunesmopy
cb74bd8cef Support multiple input Kindle files
Sample bulk/batch usage:

    @echo off
    setlocal

    SET IN_DIR=%USERPROFILE%\My Documents\My Kindle Content
    SET DEST_DIR=%IN_DIR%_drmfree
    SET KEY_FILE=mykeyfile.k4i


    mkdir "%DEST_DIR%
    k4mobidedrm.py -k %KEY_FILE% "%IN_DIR%" "%DEST_DIR%

    echo done, see %DEST_DIR%
    cd /d "%DEST_DIR%"
    start .

    endlocal
2017-02-04 12:25:12 -08:00
Apprentice Harper
956f3034ad Explicitly warn about KFX files. Bump version number to 6.5.3 2017-01-12 07:24:42 +00:00
Apprentice Harper
fca7eaab8e Update FAQs.md
Added note about Kindle for PC/Mac update and links to version 1.1.7
2017-01-06 06:31:42 +00:00
Apprentice Harper
0df66bcfc0 Improve testing of decrypted text file. (And so decrypt badly formatted ePubs) 2016-12-21 06:33:34 +00:00
Apprentice Harper
20ab5b354d Remove incorrect Linux support for Kobo Desktop 2016-12-20 06:27:08 +00:00
Apprentice Harper
46ce2ce0ea Update for strange windows users on a network, and more xml verification fixes 2016-10-20 07:12:37 +01:00
Apprentice Harper
ca59704dc4 Updated the FAQs and the main ReadMe 2016-10-19 07:14:42 +01:00
Apprentice Harper
17300283d0 improve xml detection and handle strange windows network file systems better 2016-10-10 17:41:05 +01:00
33 changed files with 491 additions and 229 deletions

BIN
AmznKFX.zip Normal file

Binary file not shown.

View File

@@ -24,7 +24,7 @@
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>droplet</string> <string>droplet</string>
<key>CFBundleGetInfoString</key> <key>CFBundleGetInfoString</key>
<string>DeDRM AppleScript 6.5.2 Written 20102016 by Apprentice Alf et al.</string> <string>DeDRM AppleScript 6.5.4 Written 20102017 by Apprentice Alf et al.</string>
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>DeDRM</string> <string>DeDRM</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@@ -36,13 +36,13 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>6.5.2</string> <string>6.5.4</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>dplt</string> <string>dplt</string>
<key>LSRequiresCarbon</key> <key>LSRequiresCarbon</key>
<true/> <true/>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>Copyright © 20102016 Apprentice Alf and Apprentice Harper</string> <string>Copyright © 20102017 Apprentice Alf</string>
<key>WindowState</key> <key>WindowState</key>
<dict> <dict>
<key>bundleDividerCollapsed</key> <key>bundleDividerCollapsed</key>

View File

@@ -56,6 +56,8 @@ __docformat__ = 'restructuredtext en'
# Fix an error in wineutils.py # Fix an error in wineutils.py
# 6.5.1 - Updated version number, added PDF check for DRM-free documents # 6.5.1 - Updated version number, added PDF check for DRM-free documents
# 6.5.2 - Another Topaz fix # 6.5.2 - Another Topaz fix
# 6.5.3 - Warn about KFX files explicitly
# 6.5.4 - Mac App Fix, improve PDF decryption, handle latest tcl changes in ActivePython
""" """
@@ -63,7 +65,7 @@ Decrypt DRMed ebooks.
""" """
PLUGIN_NAME = u"DeDRM" PLUGIN_NAME = u"DeDRM"
PLUGIN_VERSION_TUPLE = (6, 5, 2) PLUGIN_VERSION_TUPLE = (6, 5, 4)
PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE]) PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE])
# Include an html helpfile in the plugin's zipfile with the following name. # Include an html helpfile in the plugin's zipfile with the following name.
RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' RESOURCE_NAME = PLUGIN_NAME + '_Help.htm'

View File

@@ -3,13 +3,14 @@
from __future__ import with_statement from __future__ import with_statement
# ignobleepub.pyw, version 3.8 # ignobleepub.pyw, version 4.1
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102013 by some_updates, DiapDealer and Apprentice Alf # Modified 20102013 by some_updates, DiapDealer and Apprentice Alf
# Modified 20152017 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.6 # Windows users: Before running this program, you must first install Python 2.6
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
@@ -35,13 +36,14 @@ from __future__ import with_statement
# 3.8 - Fixed to retain zip file metadata (e.g. file modification date) # 3.8 - Fixed to retain zip file metadata (e.g. file modification date)
# 3.9 - moved unicode_argv call inside main for Windows DeDRM compatibility # 3.9 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 4.0 - Work if TkInter is missing # 4.0 - Work if TkInter is missing
# 4.1 - Import tkFileDialog, don't assume something else will import it.
""" """
Decrypt Barnes & Noble encrypted ePub books. Decrypt Barnes & Noble encrypted ePub books.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "4.0" __version__ = "4.1"
import sys import sys
import os import os
@@ -337,6 +339,7 @@ def gui_main():
try: try:
import Tkinter import Tkinter
import Tkconstants import Tkconstants
import tkFileDialog
import tkMessageBox import tkMessageBox
import traceback import traceback
except: except:

View File

@@ -3,14 +3,14 @@
from __future__ import with_statement from __future__ import with_statement
# ineptepub.pyw, version 6.5 # ineptepub.pyw, version 6.6
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102013 by some_updates, DiapDealer and Apprentice Alf # Modified 20102013 by some_updates, DiapDealer and Apprentice Alf
# Modified 20152016 by Apprentice Harper # Modified 20152017 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.7 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
@@ -42,13 +42,14 @@ from __future__ import with_statement
# 6.3 - Add additional check on DER file sanity # 6.3 - Add additional check on DER file sanity
# 6.4 - Remove erroneous check on DER file sanity # 6.4 - Remove erroneous check on DER file sanity
# 6.5 - Completely remove erroneous check on DER file sanity # 6.5 - Completely remove erroneous check on DER file sanity
# 6.6 - Import tkFileDialog, don't assume something else will import it.
""" """
Decrypt Adobe Digital Editions encrypted ePub books. Decrypt Adobe Digital Editions encrypted ePub books.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "6.5" __version__ = "6.6"
import sys import sys
import os import os
@@ -484,6 +485,7 @@ def gui_main():
try: try:
import Tkinter import Tkinter
import Tkconstants import Tkconstants
import tkFileDialog
import tkMessageBox import tkMessageBox
import traceback import traceback
except: except:

View File

@@ -3,14 +3,14 @@
from __future__ import with_statement from __future__ import with_statement
# ineptpdf.pyw, version 8.0.4 # ineptpdf.pyw, version 8.0.6
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102012 by some_updates, DiapDealer and Apprentice Alf # Modified 20102012 by some_updates, DiapDealer and Apprentice Alf
# Modified 2015-2016 by Apprentice Harper # Modified 2015-2017 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.7 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
@@ -58,6 +58,7 @@ from __future__ import with_statement
# 8.0.3 - Remove erroneous check on DER file sanity # 8.0.3 - Remove erroneous check on DER file sanity
# 8.0.4 - Completely remove erroneous check on DER file sanity # 8.0.4 - Completely remove erroneous check on DER file sanity
# 8.0.5 - Do not process DRM-free documents # 8.0.5 - Do not process DRM-free documents
# 8.0.6 - Replace use of float by Decimal for greater precision, and import tkFileDialog
""" """
@@ -65,7 +66,7 @@ Decrypts Adobe ADEPT-encrypted PDF files.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "8.0.5" __version__ = "8.0.6"
import sys import sys
import os import os
@@ -73,6 +74,7 @@ import re
import zlib import zlib
import struct import struct
import hashlib import hashlib
from decimal import *
from itertools import chain, islice from itertools import chain, islice
import xml.etree.ElementTree as etree import xml.etree.ElementTree as etree
@@ -653,7 +655,7 @@ class PSBaseParser(object):
return (self.parse_number, j+1) return (self.parse_number, j+1)
if c == '.': if c == '.':
self.token = c self.token = c
return (self.parse_float, j+1) return (self.parse_decimal, j+1)
if c.isalpha(): if c.isalpha():
self.token = c self.token = c
return (self.parse_keyword, j+1) return (self.parse_keyword, j+1)
@@ -718,20 +720,21 @@ class PSBaseParser(object):
c = s[j] c = s[j]
if c == '.': if c == '.':
self.token += c self.token += c
return (self.parse_float, j+1) return (self.parse_decimal, j+1)
try: try:
self.add_token(int(self.token)) self.add_token(int(self.token))
except ValueError: except ValueError:
pass pass
return (self.parse_main, j) return (self.parse_main, j)
def parse_float(self, s, i):
def parse_decimal(self, s, i):
m = END_NUMBER.search(s, i) m = END_NUMBER.search(s, i)
if not m: if not m:
self.token += s[i:] self.token += s[i:]
return (self.parse_float, len(s)) return (self.parse_decimal, len(s))
j = m.start(0) j = m.start(0)
self.token += s[i:j] self.token += s[i:j]
self.add_token(float(self.token)) self.add_token(Decimal(self.token))
return (self.parse_main, j) return (self.parse_main, j)
def parse_keyword(self, s, i): def parse_keyword(self, s, i):
@@ -933,7 +936,7 @@ class PSStackParser(PSBaseParser):
(pos, token) = self.nexttoken() (pos, token) = self.nexttoken()
##print (pos,token), (self.curtype, self.curstack) ##print (pos,token), (self.curtype, self.curstack)
if (isinstance(token, int) or if (isinstance(token, int) or
isinstance(token, float) or isinstance(token, Decimal) or
isinstance(token, bool) or isinstance(token, bool) or
isinstance(token, str) or isinstance(token, str) or
isinstance(token, PSLiteral)): isinstance(token, PSLiteral)):
@@ -1062,17 +1065,17 @@ def int_value(x):
return 0 return 0
return x return x
def float_value(x): def decimal_value(x):
x = resolve1(x) x = resolve1(x)
if not isinstance(x, float): if not isinstance(x, Decimal):
if STRICT: if STRICT:
raise PDFTypeError('Float required: %r' % x) raise PDFTypeError('Decimal required: %r' % x)
return 0.0 return 0.0
return x return x
def num_value(x): def num_value(x):
x = resolve1(x) x = resolve1(x)
if not (isinstance(x, int) or isinstance(x, float)): if not (isinstance(x, int) or isinstance(x, Decimal)):
if STRICT: if STRICT:
raise PDFTypeError('Int or Float required: %r' % x) raise PDFTypeError('Int or Float required: %r' % x)
return 0 return 0
@@ -2142,7 +2145,11 @@ class PDFSerializer(object):
if self.last.isalnum(): if self.last.isalnum():
self.write(' ') self.write(' ')
self.write(str(obj).lower()) self.write(str(obj).lower())
elif isinstance(obj, (int, long, float)): elif isinstance(obj, (int, long)):
if self.last.isalnum():
self.write(' ')
self.write(str(obj))
elif isinstance(obj, Decimal):
if self.last.isalnum(): if self.last.isalnum():
self.write(' ') self.write(' ')
self.write(str(obj)) self.write(str(obj))
@@ -2218,6 +2225,7 @@ def gui_main():
try: try:
import Tkinter import Tkinter
import Tkconstants import Tkconstants
import tkFileDialog
import tkMessageBox import tkMessageBox
import traceback import traceback
except: except:

View File

@@ -56,8 +56,9 @@ from __future__ import with_statement
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility # 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 5.2 - Fixed error in command line processing of unicode arguments # 5.2 - Fixed error in command line processing of unicode arguments
# 5.3 - Changed Android support to allow passing of backup .ab files # 5.3 - Changed Android support to allow passing of backup .ab files
# 5.4 - Recognise KFX files masquerading as azw, even if we can't decrypt them yet.
__version__ = '5.3' __version__ = '5.4'
import sys, os, re import sys, os, re
@@ -194,7 +195,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
raise DrmException(u"Input file does not exist.") raise DrmException(u"Input file does not exist.")
mobi = True mobi = True
magic3 = open(infile,'rb').read(3) magic8 = open(infile,'rb').read(8)
if magic8 == '\xeaDRMION\xee':
raise DrmException(u"KFX format detected. This format cannot be decrypted yet.")
magic3 = magic8[:3]
if magic3 == 'TPZ': if magic3 == 'TPZ':
mobi = False mobi = False
@@ -215,8 +220,9 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
md1, md2 = mb.getPIDMetaInfo() md1, md2 = mb.getPIDMetaInfo()
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases)) totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
# remove any duplicates # remove any duplicates
totalpid = list(set(totalpids)) totalpids = list(set(totalpids))
print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids)) print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids))
#print totalpids
try: try:
mb.processBook(totalpids) mb.processBook(totalpids)

View File

@@ -4,7 +4,7 @@
from __future__ import with_statement from __future__ import with_statement
# kindlekey.py # kindlekey.py
# Copyright © 2010-2016 by some_updates, Apprentice Alf and Apprentice Harper # Copyright © 2010-2017 by some_updates, Apprentice Alf and Apprentice Harper
# Revision history: # Revision history:
# 1.0 - Kindle info file decryption, extracted from k4mobidedrm, etc. # 1.0 - Kindle info file decryption, extracted from k4mobidedrm, etc.
@@ -22,6 +22,7 @@ from __future__ import with_statement
# 2.1 - Fixed Kindle for PC encryption changes March 2016 # 2.1 - Fixed Kindle for PC encryption changes March 2016
# 2.2 - Fixes for Macs with bonded ethernet ports # 2.2 - Fixes for Macs with bonded ethernet ports
# Also removed old .kinfo file support (pre-2011) # Also removed old .kinfo file support (pre-2011)
# 2.3 - Added more field names thanks to concavegit's KFX code.
""" """
@@ -29,7 +30,7 @@ Retrieve Kindle for PC/Mac user key.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = '2.2' __version__ = '2.3'
import sys, os, re import sys, os, re
from struct import pack, unpack, unpack_from from struct import pack, unpack, unpack_from
@@ -1010,8 +1011,11 @@ if iswindows:
'max_date',\ 'max_date',\
'SIGVERIF',\ 'SIGVERIF',\
'build_version',\ 'build_version',\
'SerialNumber',\
'UsernameHash',\
'kindle.directedid.info',\
'DSN'
] ]
DB = {} DB = {}
with open(kInfoFile, 'rb') as infoReader: with open(kInfoFile, 'rb') as infoReader:
data = infoReader.read() data = infoReader.read()
@@ -1447,6 +1451,10 @@ elif isosx:
'max_date',\ 'max_date',\
'SIGVERIF',\ 'SIGVERIF',\
'build_version',\ 'build_version',\
'SerialNumber',\
'UsernameHash',\
'kindle.directedid.info',\
'DSN'
] ]
with open(kInfoFile, 'rb') as infoReader: with open(kInfoFile, 'rb') as infoReader:
filedata = infoReader.read() filedata = infoReader.read()

View File

@@ -28,8 +28,10 @@
# 6.5.0 - Fix for some new tags in Topaz ebooks # 6.5.0 - Fix for some new tags in Topaz ebooks
# 6.5.1 - Version bump to match plugin & Mac app # 6.5.1 - Version bump to match plugin & Mac app
# 6.5.2 - Fix for a new tag in Topaz ebooks # 6.5.2 - Fix for a new tag in Topaz ebooks
# 6.5.3 - Explicitly warn about KFX files
# 6.5.4 - PDF float fix.
__version__ = '6.5.2' __version__ = '6.5.4'
import sys import sys
import os, os.path import os, os.path

View File

@@ -56,6 +56,8 @@ __docformat__ = 'restructuredtext en'
# Fix an error in wineutils.py # Fix an error in wineutils.py
# 6.5.1 - Updated version number, added PDF check for DRM-free documents # 6.5.1 - Updated version number, added PDF check for DRM-free documents
# 6.5.2 - Another Topaz fix # 6.5.2 - Another Topaz fix
# 6.5.3 - Warn about KFX files explicitly
# 6.5.4 - Mac App Fix, improve PDF decryption, handle latest tcl changes in ActivePython
""" """
@@ -63,7 +65,7 @@ Decrypt DRMed ebooks.
""" """
PLUGIN_NAME = u"DeDRM" PLUGIN_NAME = u"DeDRM"
PLUGIN_VERSION_TUPLE = (6, 5, 2) PLUGIN_VERSION_TUPLE = (6, 5, 4)
PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE]) PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE])
# Include an html helpfile in the plugin's zipfile with the following name. # Include an html helpfile in the plugin's zipfile with the following name.
RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' RESOURCE_NAME = PLUGIN_NAME + '_Help.htm'

View File

@@ -3,13 +3,14 @@
from __future__ import with_statement from __future__ import with_statement
# ignobleepub.pyw, version 3.8 # ignobleepub.pyw, version 4.1
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102013 by some_updates, DiapDealer and Apprentice Alf # Modified 20102013 by some_updates, DiapDealer and Apprentice Alf
# Modified 20152017 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.6 # Windows users: Before running this program, you must first install Python 2.6
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
@@ -35,13 +36,14 @@ from __future__ import with_statement
# 3.8 - Fixed to retain zip file metadata (e.g. file modification date) # 3.8 - Fixed to retain zip file metadata (e.g. file modification date)
# 3.9 - moved unicode_argv call inside main for Windows DeDRM compatibility # 3.9 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 4.0 - Work if TkInter is missing # 4.0 - Work if TkInter is missing
# 4.1 - Import tkFileDialog, don't assume something else will import it.
""" """
Decrypt Barnes & Noble encrypted ePub books. Decrypt Barnes & Noble encrypted ePub books.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "4.0" __version__ = "4.1"
import sys import sys
import os import os
@@ -337,6 +339,7 @@ def gui_main():
try: try:
import Tkinter import Tkinter
import Tkconstants import Tkconstants
import tkFileDialog
import tkMessageBox import tkMessageBox
import traceback import traceback
except: except:

View File

@@ -3,14 +3,14 @@
from __future__ import with_statement from __future__ import with_statement
# ineptepub.pyw, version 6.5 # ineptepub.pyw, version 6.6
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102013 by some_updates, DiapDealer and Apprentice Alf # Modified 20102013 by some_updates, DiapDealer and Apprentice Alf
# Modified 20152016 by Apprentice Harper # Modified 20152017 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.7 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
@@ -42,13 +42,14 @@ from __future__ import with_statement
# 6.3 - Add additional check on DER file sanity # 6.3 - Add additional check on DER file sanity
# 6.4 - Remove erroneous check on DER file sanity # 6.4 - Remove erroneous check on DER file sanity
# 6.5 - Completely remove erroneous check on DER file sanity # 6.5 - Completely remove erroneous check on DER file sanity
# 6.6 - Import tkFileDialog, don't assume something else will import it.
""" """
Decrypt Adobe Digital Editions encrypted ePub books. Decrypt Adobe Digital Editions encrypted ePub books.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "6.5" __version__ = "6.6"
import sys import sys
import os import os
@@ -484,6 +485,7 @@ def gui_main():
try: try:
import Tkinter import Tkinter
import Tkconstants import Tkconstants
import tkFileDialog
import tkMessageBox import tkMessageBox
import traceback import traceback
except: except:

View File

@@ -3,14 +3,14 @@
from __future__ import with_statement from __future__ import with_statement
# ineptpdf.pyw, version 8.0.4 # ineptpdf.pyw, version 8.0.6
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102012 by some_updates, DiapDealer and Apprentice Alf # Modified 20102012 by some_updates, DiapDealer and Apprentice Alf
# Modified 2015-2016 by Apprentice Harper # Modified 2015-2017 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.7 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
@@ -58,6 +58,7 @@ from __future__ import with_statement
# 8.0.3 - Remove erroneous check on DER file sanity # 8.0.3 - Remove erroneous check on DER file sanity
# 8.0.4 - Completely remove erroneous check on DER file sanity # 8.0.4 - Completely remove erroneous check on DER file sanity
# 8.0.5 - Do not process DRM-free documents # 8.0.5 - Do not process DRM-free documents
# 8.0.6 - Replace use of float by Decimal for greater precision, and import tkFileDialog
""" """
@@ -65,7 +66,7 @@ Decrypts Adobe ADEPT-encrypted PDF files.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "8.0.5" __version__ = "8.0.6"
import sys import sys
import os import os
@@ -73,6 +74,7 @@ import re
import zlib import zlib
import struct import struct
import hashlib import hashlib
from decimal import *
from itertools import chain, islice from itertools import chain, islice
import xml.etree.ElementTree as etree import xml.etree.ElementTree as etree
@@ -653,7 +655,7 @@ class PSBaseParser(object):
return (self.parse_number, j+1) return (self.parse_number, j+1)
if c == '.': if c == '.':
self.token = c self.token = c
return (self.parse_float, j+1) return (self.parse_decimal, j+1)
if c.isalpha(): if c.isalpha():
self.token = c self.token = c
return (self.parse_keyword, j+1) return (self.parse_keyword, j+1)
@@ -718,20 +720,21 @@ class PSBaseParser(object):
c = s[j] c = s[j]
if c == '.': if c == '.':
self.token += c self.token += c
return (self.parse_float, j+1) return (self.parse_decimal, j+1)
try: try:
self.add_token(int(self.token)) self.add_token(int(self.token))
except ValueError: except ValueError:
pass pass
return (self.parse_main, j) return (self.parse_main, j)
def parse_float(self, s, i):
def parse_decimal(self, s, i):
m = END_NUMBER.search(s, i) m = END_NUMBER.search(s, i)
if not m: if not m:
self.token += s[i:] self.token += s[i:]
return (self.parse_float, len(s)) return (self.parse_decimal, len(s))
j = m.start(0) j = m.start(0)
self.token += s[i:j] self.token += s[i:j]
self.add_token(float(self.token)) self.add_token(Decimal(self.token))
return (self.parse_main, j) return (self.parse_main, j)
def parse_keyword(self, s, i): def parse_keyword(self, s, i):
@@ -933,7 +936,7 @@ class PSStackParser(PSBaseParser):
(pos, token) = self.nexttoken() (pos, token) = self.nexttoken()
##print (pos,token), (self.curtype, self.curstack) ##print (pos,token), (self.curtype, self.curstack)
if (isinstance(token, int) or if (isinstance(token, int) or
isinstance(token, float) or isinstance(token, Decimal) or
isinstance(token, bool) or isinstance(token, bool) or
isinstance(token, str) or isinstance(token, str) or
isinstance(token, PSLiteral)): isinstance(token, PSLiteral)):
@@ -1062,17 +1065,17 @@ def int_value(x):
return 0 return 0
return x return x
def float_value(x): def decimal_value(x):
x = resolve1(x) x = resolve1(x)
if not isinstance(x, float): if not isinstance(x, Decimal):
if STRICT: if STRICT:
raise PDFTypeError('Float required: %r' % x) raise PDFTypeError('Decimal required: %r' % x)
return 0.0 return 0.0
return x return x
def num_value(x): def num_value(x):
x = resolve1(x) x = resolve1(x)
if not (isinstance(x, int) or isinstance(x, float)): if not (isinstance(x, int) or isinstance(x, Decimal)):
if STRICT: if STRICT:
raise PDFTypeError('Int or Float required: %r' % x) raise PDFTypeError('Int or Float required: %r' % x)
return 0 return 0
@@ -2142,7 +2145,11 @@ class PDFSerializer(object):
if self.last.isalnum(): if self.last.isalnum():
self.write(' ') self.write(' ')
self.write(str(obj).lower()) self.write(str(obj).lower())
elif isinstance(obj, (int, long, float)): elif isinstance(obj, (int, long)):
if self.last.isalnum():
self.write(' ')
self.write(str(obj))
elif isinstance(obj, Decimal):
if self.last.isalnum(): if self.last.isalnum():
self.write(' ') self.write(' ')
self.write(str(obj)) self.write(str(obj))
@@ -2218,6 +2225,7 @@ def gui_main():
try: try:
import Tkinter import Tkinter
import Tkconstants import Tkconstants
import tkFileDialog
import tkMessageBox import tkMessageBox
import traceback import traceback
except: except:

View File

@@ -3,8 +3,8 @@
from __future__ import with_statement from __future__ import with_statement
# k4mobidedrm.py, version 5.3 # k4mobidedrm.py, version 5.5
# Copyright © 2009-2015 by ApprenticeHarper et al. # Copyright © 2009-2017 by ApprenticeHarper et al.
# engine to remove drm from Kindle and Mobipocket ebooks # engine to remove drm from Kindle and Mobipocket ebooks
# for personal use for archiving and converting your ebooks # for personal use for archiving and converting your ebooks
@@ -56,13 +56,16 @@ from __future__ import with_statement
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility # 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 5.2 - Fixed error in command line processing of unicode arguments # 5.2 - Fixed error in command line processing of unicode arguments
# 5.3 - Changed Android support to allow passing of backup .ab files # 5.3 - Changed Android support to allow passing of backup .ab files
# 5.4 - Recognise KFX files masquerading as azw, even if we can't decrypt them yet.
# 5.5 - Support multiple input files
__version__ = '5.3' __version__ = '5.5'
import sys, os, re import sys, os, re
import csv import csv
import getopt import getopt
import glob
import re import re
import traceback import traceback
import time import time
@@ -194,7 +197,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
raise DrmException(u"Input file does not exist.") raise DrmException(u"Input file does not exist.")
mobi = True mobi = True
magic3 = open(infile,'rb').read(3) magic8 = open(infile,'rb').read(8)
if magic8 == '\xeaDRMION\xee':
raise DrmException(u"KFX format detected. This format cannot be decrypted yet.")
magic3 = magic8[:3]
if magic3 == 'TPZ': if magic3 == 'TPZ':
mobi = False mobi = False
@@ -215,8 +222,9 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
md1, md2 = mb.getPIDMetaInfo() md1, md2 = mb.getPIDMetaInfo()
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases)) totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
# remove any duplicates # remove any duplicates
totalpid = list(set(totalpids)) totalpids = list(set(totalpids))
print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids)) print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids))
#print totalpids
try: try:
mb.processBook(totalpids) mb.processBook(totalpids)
@@ -281,7 +289,7 @@ def decryptBook(infile, outdir, kDatabaseFiles, androidFiles, serials, pids):
def usage(progname): def usage(progname):
print u"Removes DRM protection from Mobipocket, Amazon KF8, Amazon Print Replica and Amazon Topaz ebooks" print u"Removes DRM protection from Mobipocket, Amazon KF8, Amazon Print Replica and Amazon Topaz ebooks"
print u"Usage:" print u"Usage:"
print u" {0} [-k <kindle.k4i>] [-p <comma separated PIDs>] [-s <comma separated Kindle serial numbers>] [ -a <AmazonSecureStorage.xml|backup.ab> ] <infile> <outdir>".format(progname) print u" {0} [-k <kindle.k4i>] [-p <comma separated PIDs>] [-s <comma separated Kindle serial numbers>] [ -a <AmazonSecureStorage.xml|backup.ab> ] <infile, infiles, or indir> <outdir>".format(progname)
# #
# Main # Main
@@ -301,8 +309,7 @@ def cli_main():
usage(progname) usage(progname)
sys.exit(2) sys.exit(2)
infile = args[0] outdir = args.pop()
outdir = args[1]
kDatabaseFiles = [] kDatabaseFiles = []
androidFiles = [] androidFiles = []
serials = [] serials = []
@@ -329,7 +336,21 @@ def cli_main():
# try with built in Kindle Info files if not on Linux # try with built in Kindle Info files if not on Linux
k4 = not sys.platform.startswith('linux') k4 = not sys.platform.startswith('linux')
return decryptBook(infile, outdir, kDatabaseFiles, androidFiles, serials, pids) filenames = []
for filename in args:
if os.path.isdir(filename):
for file_extension in ['.azw', '.azw1', '.azw3', '.azw4', '.prc', '.mobi', '.pobi']:
filenames += glob.glob(os.path.join(filename, '*%s' % file_extension))
else:
# Assume a filename
filenames.append(filename)
for infile in filenames:
result = decryptBook(infile, outdir, kDatabaseFiles, androidFiles, serials, pids)
if result != 0:
print u'Error with %r' % infile
# return last result only
return result
if __name__ == '__main__': if __name__ == '__main__':

View File

@@ -4,7 +4,7 @@
from __future__ import with_statement from __future__ import with_statement
# kindlekey.py # kindlekey.py
# Copyright © 2010-2016 by some_updates, Apprentice Alf and Apprentice Harper # Copyright © 2010-2017 by some_updates, Apprentice Alf and Apprentice Harper
# Revision history: # Revision history:
# 1.0 - Kindle info file decryption, extracted from k4mobidedrm, etc. # 1.0 - Kindle info file decryption, extracted from k4mobidedrm, etc.
@@ -22,6 +22,7 @@ from __future__ import with_statement
# 2.1 - Fixed Kindle for PC encryption changes March 2016 # 2.1 - Fixed Kindle for PC encryption changes March 2016
# 2.2 - Fixes for Macs with bonded ethernet ports # 2.2 - Fixes for Macs with bonded ethernet ports
# Also removed old .kinfo file support (pre-2011) # Also removed old .kinfo file support (pre-2011)
# 2.3 - Added more field names thanks to concavegit's KFX code.
""" """
@@ -29,7 +30,7 @@ Retrieve Kindle for PC/Mac user key.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = '2.2' __version__ = '2.3'
import sys, os, re import sys, os, re
from struct import pack, unpack, unpack_from from struct import pack, unpack, unpack_from
@@ -1010,8 +1011,11 @@ if iswindows:
'max_date',\ 'max_date',\
'SIGVERIF',\ 'SIGVERIF',\
'build_version',\ 'build_version',\
'SerialNumber',\
'UsernameHash',\
'kindle.directedid.info',\
'DSN'
] ]
DB = {} DB = {}
with open(kInfoFile, 'rb') as infoReader: with open(kInfoFile, 'rb') as infoReader:
data = infoReader.read() data = infoReader.read()
@@ -1447,6 +1451,10 @@ elif isosx:
'max_date',\ 'max_date',\
'SIGVERIF',\ 'SIGVERIF',\
'build_version',\ 'build_version',\
'SerialNumber',\
'UsernameHash',\
'kindle.directedid.info',\
'DSN'
] ]
with open(kInfoFile, 'rb') as infoReader: with open(kInfoFile, 'rb') as infoReader:
filedata = infoReader.read() filedata = infoReader.read()

View File

@@ -20,7 +20,7 @@ Installation
------------ ------------
0. If you don't already have a correct version of Python and PyCrypto installed, follow the "Installing Python on Windows" and "Installing PyCrypto on Windows" sections below before continuing. 0. If you don't already have a correct version of Python and PyCrypto installed, follow the "Installing Python on Windows" and "Installing PyCrypto on Windows" sections below before continuing.
1. Drag the DeDRM_App folder from tools_v6.3.4a/DeDRM_Application_Windows to your "My Documents" folder. 1. Drag the DeDRM_App folder from DeDRM_Application_Windows to your "My Documents" folder.
2. Open the DeDRM_App folder you've just dragged, and make a short-cut of the DeDRM_Drop_Target.bat file (right-click/Create Shortcut). Drag the shortcut file onto your Desktop. 2. Open the DeDRM_App folder you've just dragged, and make a short-cut of the DeDRM_Drop_Target.bat file (right-click/Create Shortcut). Drag the shortcut file onto your Desktop.

View File

@@ -56,6 +56,8 @@ __docformat__ = 'restructuredtext en'
# Fix an error in wineutils.py # Fix an error in wineutils.py
# 6.5.1 - Updated version number, added PDF check for DRM-free documents # 6.5.1 - Updated version number, added PDF check for DRM-free documents
# 6.5.2 - Another Topaz fix # 6.5.2 - Another Topaz fix
# 6.5.3 - Warn about KFX files explicitly
# 6.5.4 - Mac App Fix, improve PDF decryption, handle latest tcl changes in ActivePython
""" """
@@ -63,7 +65,7 @@ Decrypt DRMed ebooks.
""" """
PLUGIN_NAME = u"DeDRM" PLUGIN_NAME = u"DeDRM"
PLUGIN_VERSION_TUPLE = (6, 5, 2) PLUGIN_VERSION_TUPLE = (6, 5, 4)
PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE]) PLUGIN_VERSION = u".".join([unicode(str(x)) for x in PLUGIN_VERSION_TUPLE])
# Include an html helpfile in the plugin's zipfile with the following name. # Include an html helpfile in the plugin's zipfile with the following name.
RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' RESOURCE_NAME = PLUGIN_NAME + '_Help.htm'

View File

@@ -3,13 +3,14 @@
from __future__ import with_statement from __future__ import with_statement
# ignobleepub.pyw, version 3.8 # ignobleepub.pyw, version 4.1
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102013 by some_updates, DiapDealer and Apprentice Alf # Modified 20102013 by some_updates, DiapDealer and Apprentice Alf
# Modified 20152017 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.6 # Windows users: Before running this program, you must first install Python 2.6
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
@@ -35,13 +36,14 @@ from __future__ import with_statement
# 3.8 - Fixed to retain zip file metadata (e.g. file modification date) # 3.8 - Fixed to retain zip file metadata (e.g. file modification date)
# 3.9 - moved unicode_argv call inside main for Windows DeDRM compatibility # 3.9 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 4.0 - Work if TkInter is missing # 4.0 - Work if TkInter is missing
# 4.1 - Import tkFileDialog, don't assume something else will import it.
""" """
Decrypt Barnes & Noble encrypted ePub books. Decrypt Barnes & Noble encrypted ePub books.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "4.0" __version__ = "4.1"
import sys import sys
import os import os
@@ -337,6 +339,7 @@ def gui_main():
try: try:
import Tkinter import Tkinter
import Tkconstants import Tkconstants
import tkFileDialog
import tkMessageBox import tkMessageBox
import traceback import traceback
except: except:

View File

@@ -3,14 +3,14 @@
from __future__ import with_statement from __future__ import with_statement
# ineptepub.pyw, version 6.5 # ineptepub.pyw, version 6.6
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102013 by some_updates, DiapDealer and Apprentice Alf # Modified 20102013 by some_updates, DiapDealer and Apprentice Alf
# Modified 20152016 by Apprentice Harper # Modified 20152017 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.7 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
@@ -42,13 +42,14 @@ from __future__ import with_statement
# 6.3 - Add additional check on DER file sanity # 6.3 - Add additional check on DER file sanity
# 6.4 - Remove erroneous check on DER file sanity # 6.4 - Remove erroneous check on DER file sanity
# 6.5 - Completely remove erroneous check on DER file sanity # 6.5 - Completely remove erroneous check on DER file sanity
# 6.6 - Import tkFileDialog, don't assume something else will import it.
""" """
Decrypt Adobe Digital Editions encrypted ePub books. Decrypt Adobe Digital Editions encrypted ePub books.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "6.5" __version__ = "6.6"
import sys import sys
import os import os
@@ -484,6 +485,7 @@ def gui_main():
try: try:
import Tkinter import Tkinter
import Tkconstants import Tkconstants
import tkFileDialog
import tkMessageBox import tkMessageBox
import traceback import traceback
except: except:

View File

@@ -3,14 +3,14 @@
from __future__ import with_statement from __future__ import with_statement
# ineptpdf.pyw, version 8.0.4 # ineptpdf.pyw, version 8.0.6
# Copyright © 2009-2010 by i♥cabbages # Copyright © 2009-2010 by i♥cabbages
# Released under the terms of the GNU General Public Licence, version 3 # Released under the terms of the GNU General Public Licence, version 3
# <http://www.gnu.org/licenses/> # <http://www.gnu.org/licenses/>
# Modified 20102012 by some_updates, DiapDealer and Apprentice Alf # Modified 20102012 by some_updates, DiapDealer and Apprentice Alf
# Modified 2015-2016 by Apprentice Harper # Modified 2015-2017 by Apprentice Harper
# Windows users: Before running this program, you must first install Python 2.7 # Windows users: Before running this program, you must first install Python 2.7
# from <http://www.python.org/download/> and PyCrypto from # from <http://www.python.org/download/> and PyCrypto from
@@ -58,6 +58,7 @@ from __future__ import with_statement
# 8.0.3 - Remove erroneous check on DER file sanity # 8.0.3 - Remove erroneous check on DER file sanity
# 8.0.4 - Completely remove erroneous check on DER file sanity # 8.0.4 - Completely remove erroneous check on DER file sanity
# 8.0.5 - Do not process DRM-free documents # 8.0.5 - Do not process DRM-free documents
# 8.0.6 - Replace use of float by Decimal for greater precision, and import tkFileDialog
""" """
@@ -65,7 +66,7 @@ Decrypts Adobe ADEPT-encrypted PDF files.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = "8.0.5" __version__ = "8.0.6"
import sys import sys
import os import os
@@ -73,6 +74,7 @@ import re
import zlib import zlib
import struct import struct
import hashlib import hashlib
from decimal import *
from itertools import chain, islice from itertools import chain, islice
import xml.etree.ElementTree as etree import xml.etree.ElementTree as etree
@@ -653,7 +655,7 @@ class PSBaseParser(object):
return (self.parse_number, j+1) return (self.parse_number, j+1)
if c == '.': if c == '.':
self.token = c self.token = c
return (self.parse_float, j+1) return (self.parse_decimal, j+1)
if c.isalpha(): if c.isalpha():
self.token = c self.token = c
return (self.parse_keyword, j+1) return (self.parse_keyword, j+1)
@@ -718,20 +720,21 @@ class PSBaseParser(object):
c = s[j] c = s[j]
if c == '.': if c == '.':
self.token += c self.token += c
return (self.parse_float, j+1) return (self.parse_decimal, j+1)
try: try:
self.add_token(int(self.token)) self.add_token(int(self.token))
except ValueError: except ValueError:
pass pass
return (self.parse_main, j) return (self.parse_main, j)
def parse_float(self, s, i):
def parse_decimal(self, s, i):
m = END_NUMBER.search(s, i) m = END_NUMBER.search(s, i)
if not m: if not m:
self.token += s[i:] self.token += s[i:]
return (self.parse_float, len(s)) return (self.parse_decimal, len(s))
j = m.start(0) j = m.start(0)
self.token += s[i:j] self.token += s[i:j]
self.add_token(float(self.token)) self.add_token(Decimal(self.token))
return (self.parse_main, j) return (self.parse_main, j)
def parse_keyword(self, s, i): def parse_keyword(self, s, i):
@@ -933,7 +936,7 @@ class PSStackParser(PSBaseParser):
(pos, token) = self.nexttoken() (pos, token) = self.nexttoken()
##print (pos,token), (self.curtype, self.curstack) ##print (pos,token), (self.curtype, self.curstack)
if (isinstance(token, int) or if (isinstance(token, int) or
isinstance(token, float) or isinstance(token, Decimal) or
isinstance(token, bool) or isinstance(token, bool) or
isinstance(token, str) or isinstance(token, str) or
isinstance(token, PSLiteral)): isinstance(token, PSLiteral)):
@@ -1062,17 +1065,17 @@ def int_value(x):
return 0 return 0
return x return x
def float_value(x): def decimal_value(x):
x = resolve1(x) x = resolve1(x)
if not isinstance(x, float): if not isinstance(x, Decimal):
if STRICT: if STRICT:
raise PDFTypeError('Float required: %r' % x) raise PDFTypeError('Decimal required: %r' % x)
return 0.0 return 0.0
return x return x
def num_value(x): def num_value(x):
x = resolve1(x) x = resolve1(x)
if not (isinstance(x, int) or isinstance(x, float)): if not (isinstance(x, int) or isinstance(x, Decimal)):
if STRICT: if STRICT:
raise PDFTypeError('Int or Float required: %r' % x) raise PDFTypeError('Int or Float required: %r' % x)
return 0 return 0
@@ -2142,7 +2145,11 @@ class PDFSerializer(object):
if self.last.isalnum(): if self.last.isalnum():
self.write(' ') self.write(' ')
self.write(str(obj).lower()) self.write(str(obj).lower())
elif isinstance(obj, (int, long, float)): elif isinstance(obj, (int, long)):
if self.last.isalnum():
self.write(' ')
self.write(str(obj))
elif isinstance(obj, Decimal):
if self.last.isalnum(): if self.last.isalnum():
self.write(' ') self.write(' ')
self.write(str(obj)) self.write(str(obj))
@@ -2218,6 +2225,7 @@ def gui_main():
try: try:
import Tkinter import Tkinter
import Tkconstants import Tkconstants
import tkFileDialog
import tkMessageBox import tkMessageBox
import traceback import traceback
except: except:

View File

@@ -56,8 +56,9 @@ from __future__ import with_statement
# 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility # 5.1 - moved unicode_argv call inside main for Windows DeDRM compatibility
# 5.2 - Fixed error in command line processing of unicode arguments # 5.2 - Fixed error in command line processing of unicode arguments
# 5.3 - Changed Android support to allow passing of backup .ab files # 5.3 - Changed Android support to allow passing of backup .ab files
# 5.4 - Recognise KFX files masquerading as azw, even if we can't decrypt them yet.
__version__ = '5.3' __version__ = '5.4'
import sys, os, re import sys, os, re
@@ -194,7 +195,11 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
raise DrmException(u"Input file does not exist.") raise DrmException(u"Input file does not exist.")
mobi = True mobi = True
magic3 = open(infile,'rb').read(3) magic8 = open(infile,'rb').read(8)
if magic8 == '\xeaDRMION\xee':
raise DrmException(u"KFX format detected. This format cannot be decrypted yet.")
magic3 = magic8[:3]
if magic3 == 'TPZ': if magic3 == 'TPZ':
mobi = False mobi = False
@@ -215,8 +220,9 @@ def GetDecryptedBook(infile, kDatabases, androidFiles, serials, pids, starttime
md1, md2 = mb.getPIDMetaInfo() md1, md2 = mb.getPIDMetaInfo()
totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases)) totalpids.extend(kgenpids.getPidList(md1, md2, serials, kDatabases))
# remove any duplicates # remove any duplicates
totalpid = list(set(totalpids)) totalpids = list(set(totalpids))
print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids)) print u"Found {1:d} keys to try after {0:.1f} seconds".format(time.time()-starttime, len(totalpids))
#print totalpids
try: try:
mb.processBook(totalpids) mb.processBook(totalpids)

View File

@@ -4,7 +4,7 @@
from __future__ import with_statement from __future__ import with_statement
# kindlekey.py # kindlekey.py
# Copyright © 2010-2016 by some_updates, Apprentice Alf and Apprentice Harper # Copyright © 2010-2017 by some_updates, Apprentice Alf and Apprentice Harper
# Revision history: # Revision history:
# 1.0 - Kindle info file decryption, extracted from k4mobidedrm, etc. # 1.0 - Kindle info file decryption, extracted from k4mobidedrm, etc.
@@ -22,6 +22,7 @@ from __future__ import with_statement
# 2.1 - Fixed Kindle for PC encryption changes March 2016 # 2.1 - Fixed Kindle for PC encryption changes March 2016
# 2.2 - Fixes for Macs with bonded ethernet ports # 2.2 - Fixes for Macs with bonded ethernet ports
# Also removed old .kinfo file support (pre-2011) # Also removed old .kinfo file support (pre-2011)
# 2.3 - Added more field names thanks to concavegit's KFX code.
""" """
@@ -29,7 +30,7 @@ Retrieve Kindle for PC/Mac user key.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = '2.2' __version__ = '2.3'
import sys, os, re import sys, os, re
from struct import pack, unpack, unpack_from from struct import pack, unpack, unpack_from
@@ -1010,8 +1011,11 @@ if iswindows:
'max_date',\ 'max_date',\
'SIGVERIF',\ 'SIGVERIF',\
'build_version',\ 'build_version',\
'SerialNumber',\
'UsernameHash',\
'kindle.directedid.info',\
'DSN'
] ]
DB = {} DB = {}
with open(kInfoFile, 'rb') as infoReader: with open(kInfoFile, 'rb') as infoReader:
data = infoReader.read() data = infoReader.read()
@@ -1447,6 +1451,10 @@ elif isosx:
'max_date',\ 'max_date',\
'SIGVERIF',\ 'SIGVERIF',\
'build_version',\ 'build_version',\
'SerialNumber',\
'UsernameHash',\
'kindle.directedid.info',\
'DSN'
] ]
with open(kInfoFile, 'rb') as infoReader: with open(kInfoFile, 'rb') as infoReader:
filedata = infoReader.read() filedata = infoReader.read()

View File

@@ -1,19 +1,23 @@
DeDRM_plugin.zip DeDRM_plugin.zip
================ ================
This calibre plugin replaces many previously separate DRM removal plugins. Before you install this plugin, you should uninstall any older individual DRM removal plugins, e.g. K4MobiDeDRM. The exception is the obok plugin, which should not be removed. This calibre plugin replaces many previously separate DRM removal plugins. Before you install this plugin, you should uninstall any older individual DRM removal plugins, e.g. K4MobiDeDRM. The exception is the obok plugin, which should not be removed.
This plugin will remove the DRM from This plugin will remove the DRM from
- Kindle ebooks (from Kindle for Mac/PC and eInk Kindles). - Kindle ebooks (files from Kindle for Mac/PC (v1.17*) and eInk Kindles**).
- Barnes and Noble ePubs - Barnes and Noble ePubs
- Adobe Digital Editions (v2.0.1*) ePubs (including Kobo and Google ePubs downloaded to ADE) - Adobe Digital Editions (v2.0.1***) ePubs (including Kobo and Google ePubs downloaded to ADE)
- Adobe Digital Editions (v2.0.1) PDFs - Adobe Digital Editions (v2.0.1) PDFs
- Mobipocket ebooks - Mobipocket ebooks
- eReader PDB books - eReader PDB books
These tools do NOT work with kepubs downloaded using Kobo's desktop app (see the separate obok plugin) nor Apple's iBooks FairPlay DRM (see details about Requiem at the end of this file.) These tools do NOT work with kepubs downloaded using Kobo's desktop app (see the separate obok plugin) nor Apple's iBooks FairPlay DRM (see details about Requiem at the end of this file.)
* With Adobe Digital Editions 3.0 and later, Adobe have introduced a new, optional, DRM scheme. To avoid this new scheme, you should use Adobe Digital Editions 2.0.1. Some books are required to use the new DRM scheme and so will not download with ADE 2.0.1. If you still want such a book, you will need to use ADE 3.0 or later to download it, but you should remember that no tools to remove Adobe's new DRM scheme exist as of June 2016. * With Kindle for PC/Mac 1.19 and later, Amazon included support for their new KFX format which uses a new DRM scheme that these tools cannot remove. Using 1.17 or earlier prevents downloads of the new format.
** Some later Kindles support Amazon's new KFX format which uses a new DRM scheme that these tools cannot remove. To avoid this problem, instead of using files downloaded directly to your Kindle, download from Amazon's web site 'for transfer via USB'. This will give you an older format file that the tools can decrypt.
*** With Adobe Digital Editions 3.0 and later, Adobe have introduced a new, optional, DRM scheme. To avoid this new scheme, you should use Adobe Digital Editions 2.0.1. Some books are required to use the new DRM scheme and so will not download with ADE 2.0.1. If you still want such a book, you will need to use ADE 3.0 or later to download it, but you should remember that no tools to remove Adobe's new DRM scheme exist as of April 2017.
Installation Installation
@@ -78,23 +82,24 @@ Linux Systems Only
Instructions for installing Wine, Kindle for PC, Adobe Digital Editions, Python and PyCrypto Instructions for installing Wine, Kindle for PC, Adobe Digital Editions, Python and PyCrypto
-------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------
These instructions have been tested with Wine 1.4 on Ubuntu. These instructions have been tested with Wine 1.4 on Ubuntu.
1. First download the software you're going to to have to install. 1. First download the software you're going to to have to install.
a. Kindle for PC from http://www.amazon.co.uk/gp/kindle/pc/ a. Adobe Digital Editions 1.7.x from http://helpx.adobe.com/digital-editions/kb/cant-install-digital-editions.html
b. Adobe Digital Editions 1.7.x from http://helpx.adobe.com/digital-editions/kb/cant-install-digital-editions.html
(Adobe Digital Editions 2.x doesn't work with Wine.) (Adobe Digital Editions 2.x doesn't work with Wine.)
c. ActivePython 2.7.X for Windows (x86) from http://www.activestate.com/activepython/downloads b. Python 2.7.X for Windows (x86) from https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi
d. PyCrypto 2.1 for 32bit Windows and Python 2.7 from http://www.voidspace.org.uk/python/modules.shtml#pycrypto c. PyCrypto 2.1 for 32bit Windows and Python 2.7 from http://www.voidspace.org.uk/python/modules.shtml#pycrypto
(PyCrypto downloads as a zip file. You will need to unzip it.) (PyCrypto downloads as a zip file. You will need to unzip it.)
2. Install Wine for 32-bit x86. (e.g. on Ubuntu, Open the Ubuntu Software Center, search for Wine, and install "Wine Windows Program Loader".) 2. Install Wine for 32-bit x86. (e.g. on Ubuntu, Open the Ubuntu Software Center, search for Wine, and install "Wine Windows Program Loader".)
2a. [update] Kindle for PC now requires Windows 7, so in the following setups, choose any option for Windows 7, not Windows XP.
3. Run "Configure Wine", which will set up the default 'wineprefix' 3. Run "Configure Wine", which will set up the default 'wineprefix'
4. Run winetricks, select the default wineprefix and install component vcrun2008 4. Navigate to "Install an application" and install Kindle. Alternatively, run `winetricks kindle`
5. Run the mis-named "Uninstall Wine Software", which also allows installation of software. 5. Install Adobe Digital Editions. Accept all defaults and register with your Adobe ID.
6. Install Kindle for PC. Accept all defaults and register with your Amazon Account. 6. Install Python 2.7.x using `msiexec /i python-2.7.8.msi`. Accept all defaults.
7. Install Adobe Digital Editions. Accept all defaults and register with your Adobe ID. 7. Install PyCrypto 2.1. Accept all defaults.
8. Install ActiveState Python 2.7.x. Accept all defaults. 8. Unzip DeDRM_plugin.zip and move kindlekey.py to somewhere in drive_c, such as ~/.wine/drive_c/DeDRM/libraryfiles/kindlekey.py.
9. Install PyCrypto 2.1. Accept all defaults. 9. Run `wine 'C:\Python27/python.exe' 'C:DeDRM/libraryfiles/kindlekey.py'`, or wherever you copied kindlekey.py to.
10. Import the resulting key file to the Calibre plugin through the Kindle for Mac/PC ebooks option.
Instructions for getting Kindle for PC and Adobe Digital Editions default decryption keys Instructions for getting Kindle for PC and Adobe Digital Editions default decryption keys

73
FAQs.md
View File

@@ -1,6 +1,6 @@
# Overview # Overview
## What's this repository all about? ## What's this repository all about?
Ebooks and DRM. That is, providing free tools to remove DRM from most ebooks. Providing free open source tools to remove DRM from your ebooks.
## What's DRM? ## What's DRM?
DRM ("Digital Rights Management") is a way of using encryption to tie the books you've bought to a specific device or to a particular piece of software. DRM ("Digital Rights Management") is a way of using encryption to tie the books you've bought to a specific device or to a particular piece of software.
@@ -10,12 +10,28 @@ When your ebooks have DRM you are unable to convert the ebook from one format to
## So how can I remove DRM from my ebooks? ## So how can I remove DRM from my ebooks?
Just download and use these tools, that's all! Uh, almost. There are a few, uh, provisos, a, a couple of quid pro quos. Just download and use these tools, that's all! Uh, almost. There are a few, uh, provisos, a, a couple of quid pro quos.
* The tools don't work on all ebooks. For example, they don't work on any ebooks from Apple's iBooks store. * The tools don't work on all ebooks. For example, they don't work on any ebooks from Apple's iBooks store.
* You must own the ebook - the tools won't work on library ebooks or rented ebooks or books from a friend. * You must own the ebook - the tools won't work on library ebooks or rented ebooks or books from a friend.
* You must not use these tools to give your ebooks to a hundred of your closest friends. Or to a million strangers. Authors need to sell books to be able to write more books. Don't be mean to the authors. * You must not use these tools to give your ebooks to a hundred of your closest friends. Or to a million strangers. Authors need to sell books to be able to write more books. Don't be mean to the authors.
* Do NOT use Adobe Digital Editions 3.0 or later to download your ePubs. ADE 3.0 and later can use a new encryption scheme that the tools can't handle. While major ebook stores aren't using the new scheme yet, using ADE 2.0.1 will ensure that your ebooks are downloaded using the old scheme. Once a book has been downloaded with the new scheme, it's IMPOSSIBLE to re-download using the old scheme (without buying it again). * Do NOT use Adobe Digital Editions 3.0 or later to download your ePubs. ADE 3.0 and later might use a new encryption scheme that the tools can't handle. While major ebook stores aren't using the new scheme yet, using ADE 2.0.1 will ensure that your ebooks are downloaded using the old scheme. Once a book has been downloaded with the new scheme, it's IMPOSSIBLE to re-download using the old scheme (without buying it again).
But otherwise, if your ebook is from Amazon, Kobo, Barnes & Noble or any of the ebook stores selling ebooks compatible with Adobe Digital Editions 2.0.1, you should be able to free your books from DRM. But otherwise, if your ebook is from Amazon, Kobo, Barnes & Noble or any of the ebook stores selling ebooks compatible with Adobe Digital Editions 2.0.1, you should be able to remove the DRM that's been applied to your ebooks.
### A Recent Change to Kindle for PC/Kindle for Mac
Starting with version 1.19, Kindle for PC/Mac uses Amazon's new KFX format which these tools can't handle. Stick with version 1.17 or earlier. Kindle for PC 1.17 can be downloaded from https://s3.amazonaws.com/kindleforpc/44183/KindleForPC-installer-1.17.44183.exe and Kindle for Mac 1.17 can be downloaded from https://s3.amazonaws.com/kindleformac/44182/KindleForMac-44182.dmg
If you have already installed or have been updated to 1.19, just go to the preferences and uncheck the auto update checkbox. The download and install 1.17 over the top of the 1.19 installation. You'll also need to delete the KFX folders from your My Kindle Content folder.
A second possible solution is to use 1.19 or later, but disable KFX by renaming or disabling a necessary component of the application. This may or may not work on versions after 1.20. In a command window, enter the following commands when Kindle for PC/Mac is not running:
#### Windows
ren %localappdata%\Amazon\Kindle\application\renderer-test.exe renderer-test.xxx
#### Macintosh
chmod -x /Applications/Kindle.app/Contents/MacOS/renderer-test
After restarting the Kindle program any books previously downloaded in KFX format will no longer open. You will need to remove them from your device and re-download them. All future downloads will use the older Kindle formats instead of KFX although they will continue to be placed in one individual subdirectory per book.
## Where can I get the latest version of these free DRM removal tools? ## Where can I get the latest version of these free DRM removal tools?
Right here at github. Just go to the [releases page](https://github.com/apprenticeharper/DeDRM_tools/releases) and download the latest zip archive of the tools, named DeDRM\_tools\_X.X.X.zip, where X.X.X is the version number. You do not need to download the source code archive. Right here at github. Just go to the [releases page](https://github.com/apprenticeharper/DeDRM_tools/releases) and download the latest zip archive of the tools, named DeDRM\_tools\_X.X.X.zip, where X.X.X is the version number. You do not need to download the source code archive.
@@ -24,15 +40,12 @@ Right here at github. Just go to the [releases page](https://github.com/apprenti
First, unzip the archive. You should now have a DeDRM folder containing several other folders and a ReadMe\_First.txt file. Please read the ReadMe\_First file! That will explain what the folders are, and you'll be able to work out which of the tools you need. First, unzip the archive. You should now have a DeDRM folder containing several other folders and a ReadMe\_First.txt file. Please read the ReadMe\_First file! That will explain what the folders are, and you'll be able to work out which of the tools you need.
## That's a big complicated ReadMe file! Isn't there a quick guide? ## That's a big complicated ReadMe file! Isn't there a quick guide?
Install calibre. Install the DeDRM\_plugin in calibre. Install the Obok\_plugin in calibre. Restart calibre. In the DeDRM_plugin customisation dialog add in any E-Ink Kindle serial numbers and your B&N account email address and password. Remember that the plugin only tries to remove DRM when ebooks are imported, not at any other time. Install calibre. Install the DeDRM\_plugin in calibre. Install the Obok\_plugin in calibre. Restart calibre. In the DeDRM_plugin customisation dialog add in any E-Ink Kindle serial numbers and your B&N account email address and password. Remember that the plugin only tries to remove DRM when ebooks are imported.
# Breaking News
### The recent (September 2016) Kobo Desktop update to version 4.0.x has added encryption to the database of ebooks. A test version of the obok plugin can be downloaded directly from the repository here: https://github.com/apprenticeharper/DeDRM_tools/tree/master/Obok_calibre_plugin
# Installing the Tools # Installing the Tools
## The calibre plugin ## The calibre plugin
### I am trying to install the calibre plugin, but calibre says "ERROR: Unhandled exception: InvalidPlugin: The plugin in u[path]DeDRM\_tools\_6.4.3.zip is invalid. It does not contain a top-level \_\_init\_\_.py file" ### I am trying to install the calibre plugin, but calibre says "ERROR: Unhandled exception: InvalidPlugin: The plugin in u[path]DeDRM\_tools\_6.5.3.zip is invalid. It does not contain a top-level \_\_init\_\_.py file"
You are trying to add the tools archive (e.g. DeDRM\_tools\_6.4.3.zip) instead of the plugin. The tools archive is not the plugin. It is a collection of DRM removal tools which includes the plugin. You must unzip the archive, and install the calibre plugin (DeDRM\_plugin.zip) from a folder called “DeDRM\_calibre_plugin” in the unzipped archive. You are trying to add the tools archive (e.g. DeDRM\_tools\_6.5.3.zip) instead of the plugin. The tools archive is not the plugin. It is a collection of DRM removal tools which includes the plugin. You must unzip the archive, and install the calibre plugin (DeDRM\_plugin.zip) from a folder called “DeDRM\_calibre_plugin” in the unzipped archive.
### Ive unzipped the tools archive, but I cant find the calibre plugin when I try to add them to calibre. I use Windows. ### Ive unzipped the tools archive, but I cant find the calibre plugin when I try to add them to calibre. I use Windows.
You should select the zip file that is in the “DeDRM\_calibre\_plugin” folder, not any files inside the plugins zip archive. Make sure you are selecting from the folder that you created when you unzipped the tools archive and not selecting a file inside the still-zipped tools archive. You should select the zip file that is in the “DeDRM\_calibre\_plugin” folder, not any files inside the plugins zip archive. Make sure you are selecting from the folder that you created when you unzipped the tools archive and not selecting a file inside the still-zipped tools archive.
@@ -43,21 +56,24 @@ We strongly recommend renaming the DeDRM\_tools\_X.X.X.zip archive (after extrac
## The Windows Application ## The Windows Application
### I've installed ActiveState Python and PyCrypto, but the Windows application won't run. What have I done wrong? ### I've installed ActiveState Python and PyCrypto, but the Windows application won't run. What have I done wrong?
Nothing. There's a bug in the current ActiveState Python Windows installer that puts the Tcl code in the wrong place. See [this comment of mine at ActiveState community](https://community.activestate.com/node/19090). Just move the Tcl code and the Windows app should run. Nothing. There's a bug in the some older ActiveState Python Windows installers that puts the Tcl code in the wrong place. See [this comment of mine at ActiveState community](https://community.activestate.com/node/19090). Just move the Tcl code to the correct place manually and the Windows app should run.
## The Macintosh Application ## The Macintosh Application
### I can't open the Macintosh Application. Some message about it not being signed or something. ### I can't open the Macintosh Application. Some message about it not being signed or something.
Try right-clicking and select open. That might give you the option to open it anyway. Otherwise you'll need to change your security settings to allow unsigned applications to run. You can probably change these back after running it for the first time. Try right-clicking and select open. That might give you the option to open it anyway. Otherwise you'll need to change your security settings to allow unsigned applications to run. You can probably change these back after running it for the first time.
### I can't open the Macintosh Application at all. I get 'The aplication "DeDRM" can't be opened'
Some unzip applications do not respect the execution bit setting. Try unzipping the main tools archive using the built-in Mac unzip utility.
# Using the Tools # Using the Tools
## I cant get the tools to work on my rented or library ebooks. ## I cant get the tools to work on my rented or library ebooks.
Support for removing DRM from rented or library ebooks is not provided. The tools are not designed to remove DRM from rented or library ebooks.
## I've unzipped the tools, but what are all the different files, and how do I use them? ## I've unzipped the tools, but what are all the different files, and how do I use them?
Read the ReadMe_First.txt file and the ReadMe files included in the tools folder. That's what they're for. Read the ReadMe_First.txt file and then the ReadMe files included in the tools folder(s) you're interested in. That's what they're for.
## I have installed the calibre plugin, but my books still have DRM. When I try to view or convert my books, calibre says they have DRM. ## I have installed the calibre plugin, but my books still have DRM. When I try to view or convert my books, calibre says they have DRM.
The DRM only gets removed when the ebook is imported into calibre. If the book is already in calibre, by default calibre will discard the newly imported file. You can change this in calibre's Adding books preferences page (Automerge..../Overwrite....), so that newly imported files overwrite existing ebook formats. Then just re-import your books and the DRM-free versions will overwrite the DRMed versions while retaining your books' metadata. DRM only gets removed when an ebook is imported into calibre. Also, if the book is already in calibre, by default calibre will discard the newly imported file. You can change this in calibre's Adding books preferences page (Automerge..../Overwrite....), so that newly imported files overwrite existing ebook formats. Then just re-import your books and the DRM-free versions will overwrite the DRMed versions while retaining your books' metadata.
## I have installed the calibre plugin or I am trying to use one of the other tools, but I dont know where my ebooks are stored. ## I have installed the calibre plugin or I am trying to use one of the other tools, but I dont know where my ebooks are stored.
Your ebooks are stored on your computer or on your ebook reader. You need to find them to be able to remove the DRM. If they are on your reader, you should be able to locate them easily. On your computer its not so obvious. Here are the default locations. Your ebooks are stored on your computer or on your ebook reader. You need to find them to be able to remove the DRM. If they are on your reader, you should be able to locate them easily. On your computer its not so obvious. Here are the default locations.
@@ -70,7 +86,7 @@ Kindle for Mac ebooks are in either Library/Application Support/Kindle/My Kindle
Adobe Digital Editions ebooks are in Documents/Digital Editions Adobe Digital Editions ebooks are in Documents/Digital Editions
### Windows ### Windows
Navigating from your My Documents folder Navigating from your "Documents" folder ("My Documents" folder, pre-Windows 7)
Kindle for PC ebooks are in My Kindle Content Kindle for PC ebooks are in My Kindle Content
@@ -84,11 +100,13 @@ If you cannot read the ebook on your current device or installed software, the t
## I have installed the calibre plugin, and the book is not already in calibre, but the DRM does not get removed. It is a Kindle book. ## I have installed the calibre plugin, and the book is not already in calibre, but the DRM does not get removed. It is a Kindle book.
If you are on Windows 8 and using the Windows 8 AppStore Kindle app, you must download and install the Kindle for PC application directly from the Amazon website. The tools do not work with the Windows 8 AppStore Kindle app. If you are on Windows 8 and using the Windows 8 AppStore Kindle app, you must download and install the Kindle for PC application directly from the Amazon website. The tools do not work with the Windows 8 AppStore Kindle app.
If you are on Windows, using the Kindle for PC application, and your windows user name has accented or other non-ASCII characters in it, this might cause the plugin to fail. Create a new user account with an ASCII-only username. Install and register Kindle for PC there, and see if things work running calibre and the plugin in that user account. If you are on Windows, using the Kindle for PC application, and your windows user name has accented or other non-ASCII characters in it, this will cause the plugin to fail. Create a new user account with an ASCII-only username. Install and register Kindle for PC there, and see if things work running calibre and the plugin in that user account.
If this book is from an eInk Kindle, you must enter the serial number into the configuration dialog. The serial number is sixteen characters long, and is case-sensitive. If this book is from an eInk Kindle (e.g. Paperwhite), you must enter the serial number into the configuration dialog. The serial number is sixteen characters long, and is case-sensitive.
If this book is from Kindle for Mac or Kindle for PC, you must have the Kindle Software installed on the same computer as your copy of calibre. If this book is from Kindle for Mac or Kindle for PC, you must have the Kindle Software installed on the same computer and user account as your copy of calibre.
If this book is from Kindle for Mac or Kindle for PC, you must be using version 1.17 or below, see note at top of this file.
If the book is from Kindle for PC or Kindle for Mac and you think you are doing everything right, and you are getting this message, it is possible that the files containing the encryption key arent quite in the format the tools expect. To try to fix this: If the book is from Kindle for PC or Kindle for Mac and you think you are doing everything right, and you are getting this message, it is possible that the files containing the encryption key arent quite in the format the tools expect. To try to fix this:
@@ -97,15 +115,14 @@ If the book is from Kindle for PC or Kindle for Mac and you think you are doing
1. Delete the Kindle for PC(Mac) preferences 1. Delete the Kindle for PC(Mac) preferences
* PC: Delete the directory [home folder]\AppData\Local\Amazon (it might be hidden) and [home folder]\My Documents\My Kindle Content * PC: Delete the directory [home folder]\AppData\Local\Amazon (it might be hidden) and [home folder]\My Documents\My Kindle Content
* Mac: Delete the directory [home folder]/Library/Application Support/Kindle/and/or [home folder]/Library/Containers/com.amazon.Kindle/Data/Library/Application Support/Kindle/ (one or both may be present and should be deleted) * Mac: Delete the directory [home folder]/Library/Application Support/Kindle/and/or [home folder]/Library/Containers/com.amazon.Kindle/Data/Library/Application Support/Kindle/ (one or both may be present and should be deleted)
1. Reinstall Kindle for PC(Mac) 1. Reinstall Kindle for PC(Mac) version 1.17 or earlier (see above for download links).
1. Re-register Kindle for PC(Mac) with your Amazon account 1. Re-register Kindle for PC(Mac) with your Amazon account
1. Download the ebook again. Do not use the files you have downloaded previously. 1. Download the ebook again. Do not use the files you have downloaded previously.
## Some of my books had their DRM removed, but some still say that they have DRM and will not convert. ## Some of my books had their DRM removed, but some still say that they have DRM and will not convert.
There are several possible reasons why only some books get their DRM removed. There are several possible reasons why only some books get their DRM removed.
* You still dont have the DRM removal tools working correctly, but some of your books didnt have DRM in the first place. * You still dont have the DRM removal tools working correctly, but some of your books didnt have DRM in the first place.
* You added your books to calibre in large batches. For some unknown reason, sometimes calibre stops using the plugin after a while on a single import. Delete the books that still have DRM and import them into calibre in batches of twenty. * Kindle only: It is a Topaz format book and contains some coding that the tools do not understand. You will need to get a log of the DeDRM attempt, and then create a [new issue at Apprentice Harper's github repository](https://github.com/apprenticeharper/DeDRM_tools/issues/), attaching the book and the log, so that the tools can be updated.
* Kindle only: It is a Topaz format book and contains some coding that the tools do not understand. You will need to get a log of the deDRM attempt, and then send the book and the PID (shown in the log) for the book to Apprentice Alf, so that the tools can be updated.
If you are still having problems with particular books, you will need to create a log of the DRM removal attempt for one of the problem books, and post that in a comment at Apprentice Alf's blog or in a new issue at Apprentice Harper's github repository. If you are still having problems with particular books, you will need to create a log of the DRM removal attempt for one of the problem books, and post that in a comment at Apprentice Alf's blog or in a new issue at Apprentice Harper's github repository.
@@ -121,8 +138,8 @@ Mostly likely, this is a book downloaded from Amazon directly to one of the newe
## Do the tools work on books from Kobo? ## Do the tools work on books from Kobo?
If you use the Kobo desktop application for Mac or PC, install the obok plugin. This will import and remove the DRM from your Kobo books, and is the easiest method for Kobo ebooks. If you use the Kobo desktop application for Mac or PC, install the obok plugin. This will import and remove the DRM from your Kobo books, and is the easiest method for Kobo ebooks.
## I registered Adobe Digital Editions with an Adobe ID before downloading, but my epub or PDF still has DRM. ## I registered Adobe Digital Editions 3.0 or later with an Adobe ID before downloading, but my epub or PDF still has DRM.
Adobe introduced a new DRM scheme with ADE 3.0 and later. Install ADE 2.0.1 and register with the same Adobe ID. If you can't open your book in ADE 2.01, then you have a book with the new DRM scheme. These tools can't help. You can avoid the new DRM scheme by always downloading your ebooks with ADE 2.0.1. Some retailers will require ADE 3.0+, in which case you won't be able to download with ADE 2.0.1. Adobe introduced a new DRM scheme with ADE 3.0 and later. Install ADE 2.0.1 and register with the same Adobe ID. If you can't open your book in ADE 2.01, then you have a book with the new DRM scheme. These tools can't help. You can avoid the new DRM scheme by always downloading your ebooks with ADE 2.0.1. Some retailers will require ADE 3.0 or later, in which case you won't be able to download with ADE 2.0.1.
## The DRM wasn't removed and the log says "Failed to decrypt with error: Cannot decode library or rented ebooks." What now? ## The DRM wasn't removed and the log says "Failed to decrypt with error: Cannot decode library or rented ebooks." What now?
You're trying to remove the DRM from an ebook that's only on loan to you. No help will be given to remove DRM from such ebooks. If you think that you have received this message for a book you own, please create an issue at github, or comment at the blog. You're trying to remove the DRM from an ebook that's only on loan to you. No help will be given to remove DRM from such ebooks. If you think that you have received this message for a book you own, please create an issue at github, or comment at the blog.
@@ -143,15 +160,17 @@ The Windows DeDRM application creates a log file in your home directory (C:\User
The tools only remove the DRM. No attempt is made to remove any personally identifying information. The tools only remove the DRM. No attempt is made to remove any personally identifying information.
## What do some of my Kindle ebooks import as HTMLZ format in calibre? ## What do some of my Kindle ebooks import as HTMLZ format in calibre?
Most Amazon Kindle ebooks are Mobipocket format ebooks, or the new KF8 format. However, some are in a format known as Topaz. The Topaz format is only used by Amazon. A Topaz ebook is a collections of glyphs and their positions on each page tagged with some additional information from that page including OCRed text (Optical Character Recognition generated Text) to allow searching, and some additional layout information. Each page of a Topaz ebook is effectively a description of an image of that page. To convert a Topaz ebook to another format is not easy as there is not a one-to-one mapping between glyphs and characters/fonts. To account for this, two different formats are generated by the DRM removal software. The first is an html description built from the OCRtext and images stored in the Topaz file (HTMLZ). This format is easily reflowed but may suffer from typical OCRtext errors including typos, garbled text, missing italics, missing bolds, etc. The second format uses the glyph and position information to create an accurate scalable vector graphics (SVG) image of each page of the book that can be viewed in web browsers that support svg images (Safari, Firefox 4 or later, etc). Additional conversion software can be used to convert these SVG images to an image only PDF file. The DeDRM and Kindlebooks tools from this site provide both versions of the Topaz ebook so that the user can choose which one to use. The K4MobiDeDRM plugin only produces the html version of the ebook. The html version can be manually cleaned up and spell checked and then converted using Sigil/calibre to epubs, mobi ebooks, and etc. Most Amazon Kindle ebooks are Mobipocket format ebooks, or the new KF8 format. However, some are in a format known as Topaz. The Topaz format is only used by Amazon. A Topaz ebook is a collections of glyphs and their positions on each page tagged with some additional information from that page including OCRed text (Optical Character Recognition generated Text) to allow searching, and some additional layout information. Each page of a Topaz ebook is effectively a description of an image of that page. To convert a Topaz ebook to another format is not easy as there is not a one-to-one mapping between glyphs and characters/fonts. To account for this, two different formats are generated by the DRM removal software. The first is an html description built from the OCRtext and images stored in the Topaz file (HTMLZ). This format is easily reflowed but may suffer from typical OCRtext errors including typos, garbled text, missing italics, missing bolds, etc. The second format uses the glyph and position information to create an accurate scalable vector graphics (SVG) image of each page of the book that can be viewed in web browsers that support svg images (Safari, Firefox 4 or later, etc). Additional conversion software can be used to convert these SVG images to an image only PDF file. The DeDRM calibre plugin only imports the HTMLZ versions of the Topaz ebook. The html version can be manually cleaned up and spell checked and then converted using Sigil/calibre to epubs, mobi ebooks, and etc.
## Are the tools open source? How can I be sure they are safe and not a trojan horse? ## Are the tools open source? How can I be sure they are safe and not a trojan horse?
All the DRM removal tools hosted here are almost entirely scripts of one kind or another: Python, Applescript or Windows Batch files. So they are inherently open source, and open to inspection by everyone who downloads them. The source for any compiled pieces are provided right inside the tools themselves. All the DRM removal tools hosted here are almost entirely scripts of one kind or another: Python, Applescript or Windows Batch files. So they are inherently open source, and open to inspection by everyone who downloads them.
There are some optional shared libraries (`*.dll`, `*.dylib`, and `*.so`) included for performance. The source for any compiled pieces are provided within `alfcrypto_src.zip`. If this is a concern either delete the binary files or manually rebuild them.
## What ebooks do these tools work on? ## What ebooks do these tools work on?
The tools linked from this blog remove DRM from PDF, ePub, kePub (Kobo), eReader, Kindle (Mobipocket, KF8, Print Replica and Topaz) format ebooks using Adobe Adept, Barnes & Noble, Amazon, Kobo and eReader DRM schemes. The tools linked from this blog remove DRM from PDF, ePub, kePub (Kobo), eReader, Kindle (Mobipocket, KF8, Print Replica and Topaz) format ebooks using Adobe Adept, Barnes & Noble, Amazon, Kobo and eReader DRM schemes.
Note these tools do NOT crack the DRM. They simply allow the books owner (and only the books owner) to use the encryption key information already stored someplace on their computer or device to decrypt the ebook in the same manner the official ebook reading software uses. Note these tools do NOT crack the DRM. They simply allow the books owner to use the encryption key information already stored someplace on their computer or device to decrypt the ebook in the same manner the official ebook reading software uses.
## Why dont the tools work with Kindle Fire ebooks? ## Why dont the tools work with Kindle Fire ebooks?
Because no-one's found out how to remove the DRM from ebooks from Kindle Fire devices yet. The workaround is to install Kindle for PC or Kindle for Mac and use books from there instead. Because no-one's found out how to remove the DRM from ebooks from Kindle Fire devices yet. The workaround is to install Kindle for PC or Kindle for Mac and use books from there instead.
@@ -163,12 +182,12 @@ Amazon changed the way the key was generated for Kindle for iOS books, and the t
Amazon turned off backup for Kindle for Android, so the tools can no longer find the key. The workaround is to install Kindle for PC or Kindle for Mac and use books from there instead. Amazon turned off backup for Kindle for Android, so the tools can no longer find the key. The workaround is to install Kindle for PC or Kindle for Mac and use books from there instead.
## Why don't the tools work on books from the Apple iBooks Store? ## Why don't the tools work on books from the Apple iBooks Store?
Apple regularly change the details of their DRM and so the tools in the main tools archive will not work with these ebooks. Apples Fairplay DRM scheme can be removed using Requiem if the appropriate version of iTunes can still be installed and used. See the post Apple and ebooks: iBookstore DRM and how to remove it at Apprentice Alf's blog for more details and links. Apple regularly change the details of their DRM and so the tools in the main tools archive will not work with these ebooks. Apples Fairplay DRM scheme can be removed using Requiem if the appropriate version of iTunes can still be installed and used. See the post Apple and ebooks: iBookstore DRM and how to remove it at Apprentice Alf's blog for more details.
## Ive got the tools archive and Ive read all the FAQs but I still cant install the tools and/or the DRM removal doesnt work ## Ive got the tools archive and Ive read all the FAQs but I still cant install the tools and/or the DRM removal doesnt work
* Read the ReadMe_First.txt file in the top level of the tools archive * Read the ReadMe_First.txt file in the top level of the tools archive
* Read the ReadMe file in the folder of the tools you want to use. * Read the ReadMe file in the folder of the tools you want to use.
* If you still cant remove the DRM, ask in the comments section of Apprentice Alf's blog, reporting the error as precisely as you can, what platform you use, what tool you have tried, what errors you get, and what versions you are using. If the problem happens when running one of the tools, post a log (see previous questions on how to do this). * If you still cant remove the DRM, ask in the comments section of Apprentice Alf's blog or create a new issue at Apprentice Harper's github repository, reporting the error as precisely as you can, what platform you use, what tool you have tried, what errors you get, and what versions you are using. If the problem happens when running one of the tools, post a log (see previous questions on how to do this).
## Who wrote these scripts? ## Who wrote these scripts?
The authors tend to identify themselves only by pseudonyms: The authors tend to identify themselves only by pseudonyms:

Binary file not shown.

View File

@@ -19,7 +19,7 @@ except NameError:
PLUGIN_NAME = 'Obok DeDRM' PLUGIN_NAME = 'Obok DeDRM'
PLUGIN_SAFE_NAME = PLUGIN_NAME.strip().lower().replace(' ', '_') PLUGIN_SAFE_NAME = PLUGIN_NAME.strip().lower().replace(' ', '_')
PLUGIN_DESCRIPTION = _('Removes DRM from Kobo kepubs and adds them to the library.') PLUGIN_DESCRIPTION = _('Removes DRM from Kobo kepubs and adds them to the library.')
PLUGIN_VERSION_TUPLE = (6, 5, 2) PLUGIN_VERSION_TUPLE = (6, 5, 4)
PLUGIN_VERSION = '.'.join([str(x) for x in PLUGIN_VERSION_TUPLE]) PLUGIN_VERSION = '.'.join([str(x) for x in PLUGIN_VERSION_TUPLE])
HELPFILE_NAME = PLUGIN_SAFE_NAME + '_Help.htm' HELPFILE_NAME = PLUGIN_SAFE_NAME + '_Help.htm'
PLUGIN_AUTHORS = 'Anon' PLUGIN_AUTHORS = 'Anon'

View File

@@ -1,6 +1,15 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Version 3.2.5 December 2016
# Improve detection of good text decryption.
#
# Version 3.2.4 December 2016
# Remove incorrect support for Kobo Desktop under Wine
#
# Version 3.2.3 October 2016
# Fix for windows network user and more xml fixes
#
# Version 3.2.2 October 2016 # Version 3.2.2 October 2016
# Change to the way the new database version is handled. # Change to the way the new database version is handled.
# #
@@ -142,7 +151,7 @@
# #
"""Manage all Kobo books, either encrypted or DRM-free.""" """Manage all Kobo books, either encrypted or DRM-free."""
__version__ = '3.2.2' __version__ = '3.2.4'
__about__ = u"Obok v{0}\nCopyright © 2012-2016 Physisticated et al.".format(__version__) __about__ = u"Obok v{0}\nCopyright © 2012-2016 Physisticated et al.".format(__version__)
import sys import sys
@@ -348,9 +357,9 @@ class KoboLibrary(object):
self.kobodir = os.path.join(self.kobodir, u"Kobo", u"Kobo Desktop Edition") self.kobodir = os.path.join(self.kobodir, u"Kobo", u"Kobo Desktop Edition")
elif sys.platform.startswith('darwin'): elif sys.platform.startswith('darwin'):
self.kobodir = os.path.join(os.environ['HOME'], u"Library", u"Application Support", u"Kobo", u"Kobo Desktop Edition") self.kobodir = os.path.join(os.environ['HOME'], u"Library", u"Application Support", u"Kobo", u"Kobo Desktop Edition")
elif linux_path != None: #elif linux_path != None:
# Probably Linux, let's get the wine prefix and path to Kobo. # Probably Linux, let's get the wine prefix and path to Kobo.
self.kobodir = os.path.join(linux_path, u"Local Settings", u"Application Data", u"Kobo", u"Kobo Desktop Edition") # self.kobodir = os.path.join(linux_path, u"Local Settings", u"Application Data", u"Kobo", u"Kobo Desktop Edition")
# desktop versions use Kobo.sqlite # desktop versions use Kobo.sqlite
kobodb = os.path.join(self.kobodir, u"Kobo.sqlite") kobodb = os.path.join(self.kobodir, u"Kobo.sqlite")
# check for existence of file # check for existence of file
@@ -428,7 +437,8 @@ class KoboLibrary(object):
macaddrs = [] macaddrs = []
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
c = re.compile('\s(' + '[0-9a-f]{2}-' * 5 + '[0-9a-f]{2})(\s|$)', re.IGNORECASE) c = re.compile('\s(' + '[0-9a-f]{2}-' * 5 + '[0-9a-f]{2})(\s|$)', re.IGNORECASE)
for line in os.popen('ipconfig /all'): (p_in, p_out, p_err) = os.popen3('ipconfig /all')
for line in p_out:
m = c.search(line) m = c.search(line)
if m: if m:
macaddrs.append(re.sub("-", ":", m.group(1)).upper()) macaddrs.append(re.sub("-", ":", m.group(1)).upper())
@@ -578,6 +588,36 @@ class KoboFile(object):
Returns True if the content was checked, False if it was not Returns True if the content was checked, False if it was not
checked.""" checked."""
if self.mimetype == 'application/xhtml+xml': if self.mimetype == 'application/xhtml+xml':
# assume utf-8 with no BOM
textoffset = 0
stride = 1
print u"Checking text:{0}:".format(contents[:10])
# check for byte order mark
if contents[:3]=="\xef\xbb\xbf":
# seems to be utf-8 with BOM
print u"Could be utf-8 with BOM"
textoffset = 3
elif contents[:2]=="\xfe\xff":
# seems to be utf-16BE
print u"Could be utf-16BE"
textoffset = 3
stride = 2
elif contents[:2]=="\xff\xfe":
# seems to be utf-16LE
print u"Could be utf-16LE"
textoffset = 2
stride = 2
else:
print u"Perhaps utf-8 without BOM"
# now check that the first few characters are in the ASCII range
for i in xrange(textoffset,textoffset+5*stride,stride):
if ord(contents[i])<32 or ord(contents[i])>127:
# Non-ascii, so decryption probably failed
print u"Bad character at {0}, value {1}".format(i,ord(contents[i]))
raise ValueError
print u"Seems to be good text"
return True
if contents[:5]=="<?xml" or contents[:8]=="\xef\xbb\xbf<?xml": if contents[:5]=="<?xml" or contents[:8]=="\xef\xbb\xbf<?xml":
# utf-8 # utf-8
return True return True
@@ -587,6 +627,15 @@ class KoboFile(object):
elif contents[:14]=="\xff\xfe<\x00?\x00x\x00m\x00l\x00": elif contents[:14]=="\xff\xfe<\x00?\x00x\x00m\x00l\x00":
# utf-16LE # utf-16LE
return True return True
elif contents[:9]=="<!DOCTYPE" or contents[:12]=="\xef\xbb\xbf<!DOCTYPE":
# utf-8 of weird <!DOCTYPE start
return True
elif contents[:22]=="\xfe\xff\x00<\x00!\x00D\x00O\x00C\x00T\x00Y\x00P\x00E":
# utf-16BE of weird <!DOCTYPE start
return True
elif contents[:22]=="\xff\xfe<\x00!\x00D\x00O\x00C\x00T\x00Y\x00P\x00E\x00":
# utf-16LE of weird <!DOCTYPE start
return True
else: else:
print u"Bad XML: {0}".format(contents[:8]) print u"Bad XML: {0}".format(contents[:8])
raise ValueError raise ValueError
@@ -616,41 +665,16 @@ class KoboFile(object):
contents = contents[:-padding] contents = contents[:-padding]
return contents return contents
def cli_main(): def decrypt_book(book, lib):
description = __about__
epilog = u"Parsing of arguments failed."
parser = argparse.ArgumentParser(prog=sys.argv[0], description=description, epilog=epilog)
parser.add_argument('--devicedir', default='/media/KOBOeReader', help="directory of connected Kobo device")
args = vars(parser.parse_args())
serials = []
devicedir = u""
if args['devicedir']:
devicedir = args['devicedir']
lib = KoboLibrary(serials, devicedir)
for i, book in enumerate(lib.books):
print u"{0}: {1}".format(i + 1, book.title)
num_string = raw_input(u"Convert book number... ")
try:
num = int(num_string)
book = lib.books[num - 1]
except (ValueError, IndexError):
exit()
print u"Converting {0}".format(book.title) print u"Converting {0}".format(book.title)
zin = zipfile.ZipFile(book.filename, "r") zin = zipfile.ZipFile(book.filename, "r")
# make filename out of Unicode alphanumeric and whitespace equivalents from title # make filename out of Unicode alphanumeric and whitespace equivalents from title
outname = u"{0}.epub".format(re.sub('[^\s\w]', '_', book.title, 0, re.UNICODE)) outname = u"{0}.epub".format(re.sub('[^\s\w]', '_', book.title, 0, re.UNICODE))
if (book.type == 'drm-free'): if (book.type == 'drm-free'):
print u"DRM-free book, conversion is not needed" print u"DRM-free book, conversion is not needed"
shutil.copyfile(book.filename, outname) shutil.copyfile(book.filename, outname)
print u"Book saved as {0}".format(os.path.join(os.getcwd(), outname)) print u"Book saved as {0}".format(os.path.join(os.getcwd(), outname))
exit(0) return 0
result = 1 result = 1
for userkey in lib.userkeys: for userkey in lib.userkeys:
print u"Trying key: {0}".format(userkey.encode('hex_codec')) print u"Trying key: {0}".format(userkey.encode('hex_codec'))
@@ -673,13 +697,50 @@ def cli_main():
print u"Decryption failed." print u"Decryption failed."
zout.close() zout.close()
os.remove(outname) os.remove(outname)
zin.close() zin.close()
lib.close()
if result != 0:
print u"Could not decrypt book with any of the keys found."
return result return result
def cli_main():
description = __about__
epilog = u"Parsing of arguments failed."
parser = argparse.ArgumentParser(prog=sys.argv[0], description=description, epilog=epilog)
parser.add_argument('--devicedir', default='/media/KOBOeReader', help="directory of connected Kobo device")
parser.add_argument('--all', action='store_true', help="flag for converting all books on device")
args = vars(parser.parse_args())
serials = []
devicedir = u""
if args['devicedir']:
devicedir = args['devicedir']
lib = KoboLibrary(serials, devicedir)
if args['all']:
books = lib.books
else:
for i, book in enumerate(lib.books):
print u"{0}: {1}".format(i + 1, book.title)
print u"Or 'all'"
choice = raw_input(u"Convert book number... ")
if choice == u'all':
books = list(lib.books)
else:
try:
num = int(choice)
books = [lib.books[num - 1]]
except (ValueError, IndexError):
print u"Invalid choice. Exiting..."
exit()
results = [decrypt_book(book, lib) for book in books]
lib.close()
overall_result = all(result != 0 for result in results)
if overall_result != 0:
print u"Could not decrypt book with any of the keys found."
return overall_result
if __name__ == '__main__': if __name__ == '__main__':
sys.stdout=SafeUnbuffered(sys.stdout) sys.stdout=SafeUnbuffered(sys.stdout)
sys.stderr=SafeUnbuffered(sys.stderr) sys.stderr=SafeUnbuffered(sys.stderr)

View File

@@ -4,7 +4,7 @@
from __future__ import with_statement from __future__ import with_statement
# kindlekey.py # kindlekey.py
# Copyright © 2010-2016 by some_updates, Apprentice Alf and Apprentice Harper # Copyright © 2010-2017 by some_updates, Apprentice Alf and Apprentice Harper
# Revision history: # Revision history:
# 1.0 - Kindle info file decryption, extracted from k4mobidedrm, etc. # 1.0 - Kindle info file decryption, extracted from k4mobidedrm, etc.
@@ -22,6 +22,7 @@ from __future__ import with_statement
# 2.1 - Fixed Kindle for PC encryption changes March 2016 # 2.1 - Fixed Kindle for PC encryption changes March 2016
# 2.2 - Fixes for Macs with bonded ethernet ports # 2.2 - Fixes for Macs with bonded ethernet ports
# Also removed old .kinfo file support (pre-2011) # Also removed old .kinfo file support (pre-2011)
# 2.3 - Added more field names thanks to concavegit's KFX code.
""" """
@@ -29,7 +30,7 @@ Retrieve Kindle for PC/Mac user key.
""" """
__license__ = 'GPL v3' __license__ = 'GPL v3'
__version__ = '2.2' __version__ = '2.3'
import sys, os, re import sys, os, re
from struct import pack, unpack, unpack_from from struct import pack, unpack, unpack_from
@@ -1010,8 +1011,11 @@ if iswindows:
'max_date',\ 'max_date',\
'SIGVERIF',\ 'SIGVERIF',\
'build_version',\ 'build_version',\
'SerialNumber',\
'UsernameHash',\
'kindle.directedid.info',\
'DSN'
] ]
DB = {} DB = {}
with open(kInfoFile, 'rb') as infoReader: with open(kInfoFile, 'rb') as infoReader:
data = infoReader.read() data = infoReader.read()
@@ -1447,6 +1451,10 @@ elif isosx:
'max_date',\ 'max_date',\
'SIGVERIF',\ 'SIGVERIF',\
'build_version',\ 'build_version',\
'SerialNumber',\
'UsernameHash',\
'kindle.directedid.info',\
'DSN'
] ]
with open(kInfoFile, 'rb') as infoReader: with open(kInfoFile, 'rb') as infoReader:
filedata = infoReader.read() filedata = infoReader.read()

131
Other_Tools/Kobo/obok.py Normal file → Executable file
View File

@@ -1,6 +1,15 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Version 3.2.5 December 2016
# Improve detection of good text decryption.
#
# Version 3.2.4 December 2016
# Remove incorrect support for Kobo Desktop under Wine
#
# Version 3.2.3 October 2016
# Fix for windows network user and more xml fixes
#
# Version 3.2.2 October 2016 # Version 3.2.2 October 2016
# Change to the way the new database version is handled. # Change to the way the new database version is handled.
# #
@@ -142,7 +151,7 @@
# #
"""Manage all Kobo books, either encrypted or DRM-free.""" """Manage all Kobo books, either encrypted or DRM-free."""
__version__ = '3.2.2' __version__ = '3.2.4'
__about__ = u"Obok v{0}\nCopyright © 2012-2016 Physisticated et al.".format(__version__) __about__ = u"Obok v{0}\nCopyright © 2012-2016 Physisticated et al.".format(__version__)
import sys import sys
@@ -348,9 +357,9 @@ class KoboLibrary(object):
self.kobodir = os.path.join(self.kobodir, u"Kobo", u"Kobo Desktop Edition") self.kobodir = os.path.join(self.kobodir, u"Kobo", u"Kobo Desktop Edition")
elif sys.platform.startswith('darwin'): elif sys.platform.startswith('darwin'):
self.kobodir = os.path.join(os.environ['HOME'], u"Library", u"Application Support", u"Kobo", u"Kobo Desktop Edition") self.kobodir = os.path.join(os.environ['HOME'], u"Library", u"Application Support", u"Kobo", u"Kobo Desktop Edition")
elif linux_path != None: #elif linux_path != None:
# Probably Linux, let's get the wine prefix and path to Kobo. # Probably Linux, let's get the wine prefix and path to Kobo.
self.kobodir = os.path.join(linux_path, u"Local Settings", u"Application Data", u"Kobo", u"Kobo Desktop Edition") # self.kobodir = os.path.join(linux_path, u"Local Settings", u"Application Data", u"Kobo", u"Kobo Desktop Edition")
# desktop versions use Kobo.sqlite # desktop versions use Kobo.sqlite
kobodb = os.path.join(self.kobodir, u"Kobo.sqlite") kobodb = os.path.join(self.kobodir, u"Kobo.sqlite")
# check for existence of file # check for existence of file
@@ -428,7 +437,8 @@ class KoboLibrary(object):
macaddrs = [] macaddrs = []
if sys.platform.startswith('win'): if sys.platform.startswith('win'):
c = re.compile('\s(' + '[0-9a-f]{2}-' * 5 + '[0-9a-f]{2})(\s|$)', re.IGNORECASE) c = re.compile('\s(' + '[0-9a-f]{2}-' * 5 + '[0-9a-f]{2})(\s|$)', re.IGNORECASE)
for line in os.popen('ipconfig /all'): (p_in, p_out, p_err) = os.popen3('ipconfig /all')
for line in p_out:
m = c.search(line) m = c.search(line)
if m: if m:
macaddrs.append(re.sub("-", ":", m.group(1)).upper()) macaddrs.append(re.sub("-", ":", m.group(1)).upper())
@@ -578,6 +588,36 @@ class KoboFile(object):
Returns True if the content was checked, False if it was not Returns True if the content was checked, False if it was not
checked.""" checked."""
if self.mimetype == 'application/xhtml+xml': if self.mimetype == 'application/xhtml+xml':
# assume utf-8 with no BOM
textoffset = 0
stride = 1
print u"Checking text:{0}:".format(contents[:10])
# check for byte order mark
if contents[:3]=="\xef\xbb\xbf":
# seems to be utf-8 with BOM
print u"Could be utf-8 with BOM"
textoffset = 3
elif contents[:2]=="\xfe\xff":
# seems to be utf-16BE
print u"Could be utf-16BE"
textoffset = 3
stride = 2
elif contents[:2]=="\xff\xfe":
# seems to be utf-16LE
print u"Could be utf-16LE"
textoffset = 2
stride = 2
else:
print u"Perhaps utf-8 without BOM"
# now check that the first few characters are in the ASCII range
for i in xrange(textoffset,textoffset+5*stride,stride):
if ord(contents[i])<32 or ord(contents[i])>127:
# Non-ascii, so decryption probably failed
print u"Bad character at {0}, value {1}".format(i,ord(contents[i]))
raise ValueError
print u"Seems to be good text"
return True
if contents[:5]=="<?xml" or contents[:8]=="\xef\xbb\xbf<?xml": if contents[:5]=="<?xml" or contents[:8]=="\xef\xbb\xbf<?xml":
# utf-8 # utf-8
return True return True
@@ -587,6 +627,15 @@ class KoboFile(object):
elif contents[:14]=="\xff\xfe<\x00?\x00x\x00m\x00l\x00": elif contents[:14]=="\xff\xfe<\x00?\x00x\x00m\x00l\x00":
# utf-16LE # utf-16LE
return True return True
elif contents[:9]=="<!DOCTYPE" or contents[:12]=="\xef\xbb\xbf<!DOCTYPE":
# utf-8 of weird <!DOCTYPE start
return True
elif contents[:22]=="\xfe\xff\x00<\x00!\x00D\x00O\x00C\x00T\x00Y\x00P\x00E":
# utf-16BE of weird <!DOCTYPE start
return True
elif contents[:22]=="\xff\xfe<\x00!\x00D\x00O\x00C\x00T\x00Y\x00P\x00E\x00":
# utf-16LE of weird <!DOCTYPE start
return True
else: else:
print u"Bad XML: {0}".format(contents[:8]) print u"Bad XML: {0}".format(contents[:8])
raise ValueError raise ValueError
@@ -616,41 +665,16 @@ class KoboFile(object):
contents = contents[:-padding] contents = contents[:-padding]
return contents return contents
def cli_main(): def decrypt_book(book, lib):
description = __about__
epilog = u"Parsing of arguments failed."
parser = argparse.ArgumentParser(prog=sys.argv[0], description=description, epilog=epilog)
parser.add_argument('--devicedir', default='/media/KOBOeReader', help="directory of connected Kobo device")
args = vars(parser.parse_args())
serials = []
devicedir = u""
if args['devicedir']:
devicedir = args['devicedir']
lib = KoboLibrary(serials, devicedir)
for i, book in enumerate(lib.books):
print u"{0}: {1}".format(i + 1, book.title)
num_string = raw_input(u"Convert book number... ")
try:
num = int(num_string)
book = lib.books[num - 1]
except (ValueError, IndexError):
exit()
print u"Converting {0}".format(book.title) print u"Converting {0}".format(book.title)
zin = zipfile.ZipFile(book.filename, "r") zin = zipfile.ZipFile(book.filename, "r")
# make filename out of Unicode alphanumeric and whitespace equivalents from title # make filename out of Unicode alphanumeric and whitespace equivalents from title
outname = u"{0}.epub".format(re.sub('[^\s\w]', '_', book.title, 0, re.UNICODE)) outname = u"{0}.epub".format(re.sub('[^\s\w]', '_', book.title, 0, re.UNICODE))
if (book.type == 'drm-free'): if (book.type == 'drm-free'):
print u"DRM-free book, conversion is not needed" print u"DRM-free book, conversion is not needed"
shutil.copyfile(book.filename, outname) shutil.copyfile(book.filename, outname)
print u"Book saved as {0}".format(os.path.join(os.getcwd(), outname)) print u"Book saved as {0}".format(os.path.join(os.getcwd(), outname))
exit(0) return 0
result = 1 result = 1
for userkey in lib.userkeys: for userkey in lib.userkeys:
print u"Trying key: {0}".format(userkey.encode('hex_codec')) print u"Trying key: {0}".format(userkey.encode('hex_codec'))
@@ -673,13 +697,50 @@ def cli_main():
print u"Decryption failed." print u"Decryption failed."
zout.close() zout.close()
os.remove(outname) os.remove(outname)
zin.close() zin.close()
lib.close()
if result != 0:
print u"Could not decrypt book with any of the keys found."
return result return result
def cli_main():
description = __about__
epilog = u"Parsing of arguments failed."
parser = argparse.ArgumentParser(prog=sys.argv[0], description=description, epilog=epilog)
parser.add_argument('--devicedir', default='/media/KOBOeReader', help="directory of connected Kobo device")
parser.add_argument('--all', action='store_true', help="flag for converting all books on device")
args = vars(parser.parse_args())
serials = []
devicedir = u""
if args['devicedir']:
devicedir = args['devicedir']
lib = KoboLibrary(serials, devicedir)
if args['all']:
books = lib.books
else:
for i, book in enumerate(lib.books):
print u"{0}: {1}".format(i + 1, book.title)
print u"Or 'all'"
choice = raw_input(u"Convert book number... ")
if choice == u'all':
books = list(lib.books)
else:
try:
num = int(choice)
books = [lib.books[num - 1]]
except (ValueError, IndexError):
print u"Invalid choice. Exiting..."
exit()
results = [decrypt_book(book, lib) for book in books]
lib.close()
overall_result = all(result != 0 for result in results)
if overall_result != 0:
print u"Could not decrypt book with any of the keys found."
return overall_result
if __name__ == '__main__': if __name__ == '__main__':
sys.stdout=SafeUnbuffered(sys.stdout) sys.stdout=SafeUnbuffered(sys.stdout)
sys.stderr=SafeUnbuffered(sys.stderr) sys.stderr=SafeUnbuffered(sys.stderr)

View File

@@ -1,41 +1,54 @@
Welcome to the tools! Welcome to the tools!
===================== =====================
This ReadMe_First.txt is meant to give users a quick overview of what is available and how to get started. This document is part of the Tools v6.5.1 archive from Apprentice Alf's Blog: http://apprenticealf.wordpress.com/ This ReadMe_First.txt is meant to give users a quick overview of what is available and how to get started. This document is part of the Tools v6.5.4 archive from Apprentice Harper's github repository: https://github.com/apprenticeharper/DeDRM_tools/
The is archive includes tools to remove DRM from: The is archive includes tools to remove DRM from:
- Kindle ebooks (from Kindle for Mac/PC and eInk Kindles). - Kindle ebooks (files from Kindle for Mac/PC (v1.17*) and eInk Kindles**).
- Barnes and Noble ePubs - Adobe Digital Editions (v2.0.1***) ePubs (including Kobo and Google ePubs downloaded to ADE)
- Adobe Digital Editions (v2.0.1*) ePubs (including Kobo and Google ePubs downloaded to ADE)
- Kobo kePubs from the Kobo Desktop application - Kobo kePubs from the Kobo Desktop application
- Barnes and Noble ePubs
- Adobe Digital Editions (v2.0.1) PDFs - Adobe Digital Editions (v2.0.1) PDFs
- Mobipocket ebooks
- eReader PDB books
- Scuolabooks (Link to solution by Hex) - Scuolabooks (Link to solution by Hex)
- Mobipocket ebooks
- eReader PDB ebooks
- Rocket ebooks (source only)
These tools do NOT work with Apple's iBooks FairPlay DRM (see end of this file.) These tools do NOT work with Apple's iBooks FairPlay DRM (see end of this file.)
* With Adobe Digital Editions 3.0 and later, Adobe have introduced a new, optional, DRM scheme. To avoid this new scheme, you should use Adobe Digital Editions 2.0.1. Some books are required to use the new DRM scheme and so will not download with ADE 2.0.1. If you still want such a book, you will need to use ADE 3.0 or later to download it, but you should remember that no tools to remove Adobe's new DRM scheme exist as of June 2016. * With Kindle for PC/Mac 1.19 and later, Amazon included support for their new KFX format which uses a new DRM scheme that these tools cannot remove. Using 1.17 or earlier prevents downloads of the new format.
** Some later Kindles support Amazon's new KFX format which uses a new DRM scheme that these tools cannot remove. To avoid this problem, instead of using files downloaded directly to your Kindle, download from Amazon's web site 'for transfer via USB'. This will give you an older format file that the tools can decrypt. See also the FAQ entry about this.
*** With Adobe Digital Editions 3.0 and later, Adobe have introduced a new, optional, DRM scheme. To avoid this new scheme, you should use Adobe Digital Editions 2.0.1. Some books are required to use the new DRM scheme and so will not download with ADE 2.0.1. If you still want such a book, you will need to use ADE 3.0 or later to download it, but you should remember that no tools to remove Adobe's new DRM scheme exist as of June 2017.
About the tools About the tools
--------------- ---------------
These tools are updated and maintained by Apprentice Alf and Apprentice Harper. You can find links to the latest updates and get support at Apprentice Alf's blog: http://www.apprenticealf.wordpress.com/ These tools are updated and maintained by Apprentice Alf and Apprentice Harper. You can find the latest updates at Apprentice Harper's github repository https://github.com/apprenticeharper/DeDRM_tools/ and get support by creating an issue at the repository (github account required) or by posting a comment at Apprentice Alf's blog: http://www.apprenticealf.wordpress.com/
If you re-post these tools, a link to the blog would be appreciated.
If you re-post these tools, a link to the repository and/or the blog would be appreciated.
DeDRM plugin for calibre (Mac OS X, Windows, and Linux) DeDRM plugin for calibre (Mac OS X, Windows, and Linux)
------------------------------------------------------- -------------------------------------------------------
Calibre is an open source freeware ebook library manager. It is the best tool around for keeping track of your ebooks. The DeDRM plugin for calibre provides the simplest way, especially on Windows, to remove DRM from your ebooks. Just install the DeDRM plugin from the DeDRM_calibre_plugin folder, following the instructions and configuration directions provided in the ReadMe file and the help links in the plugin's configuration dialogs. Calibre is an open source freeware ebook library manager. It is the best tool around for keeping track of your ebooks. The DeDRM plugin for calibre provides the simplest way, especially on Windows, to remove DRM from your Kindle and Adobe DRM ebooks. Just install the DeDRM plugin from the DeDRM_calibre_plugin folder, following the instructions and configuration directions provided in the ReadMe file and the help links in the plugin's configuration dialogs.
Once installed and configured, you can simply add a DRM book to calibre and the DRM-free version will be imported into the calibre database. Note that DRM removal only occurs on IMPORT not on CONVERSION or at any other time. If you have already imported DRM books you'll need to remove them from calibre and re-import them. Once installed and configured, you can simply add a DRM book to calibre and the DRM-free version will be imported into the calibre database. Note that DRM removal only occurs on IMPORT not on CONVERSION or at any other time. If you have already imported DRM books you'll need to remove them from calibre and re-import them.
Linux users should read the section at the end of the DeDRM_plugin_ReadMe.txt file. For instructions, see the DeDRM_plugin_ReadMe.txt file in the DeDRM_calibre_plugin folder.
Obok plugin for calibre (Mac OS X and Windows)
----------------------------------------------
To import ebooks from the Kobo Desktop app or from a Kobo ebook reader, install the Obok plugin. This works in a different way to the DeDRM plugin, in that it finds your ebooks downloaded using the Kobo Desktop app, or on an attached Kobo ebooks reader, and displays them in a list, so that you can choose the ones you want to import into calibre.
For instructions, see the obok_plugin_ReadMe.txt file in the Obok_calibre_plugin folder.
DeDRM application for Mac OS X users: (Mac OS X 10.4 and above) DeDRM application for Mac OS X users: (Mac OS X 10.4 and above)
--------------------------------------------------------------- ---------------------------------------------------------------
This application is a stand-alone DRM removal application for Mac OS X users. This application is a stand-alone DRM removal application for Mac OS X users. It is only needed for people who cannot or will not use the calibre plugin.
For instructions, see the "DeDRM ReadMe.rtf" file in the DeDRM_Macintosh_Application folder. For instructions, see the "DeDRM ReadMe.rtf" file in the DeDRM_Macintosh_Application folder.
@@ -47,18 +60,11 @@ DeDRM application for Windows users: (Windows XP through Windows 10)
***This program requires that Python and PyCrypto be properly installed.*** ***This program requires that Python and PyCrypto be properly installed.***
***See below for details on recommended versions and how to install them.*** ***See below for details on recommended versions and how to install them.***
This application is a stand-alone application for Windows users. This application is a stand-alone application for Windows users. It is only needed for people who cannot or will not use the calibre plugin.
For instructions, see the DeDRM_App_ReadMe.txt file in the DeDRM_Windows_Applications folder. For instructions, see the DeDRM_App_ReadMe.txt file in the DeDRM_Windows_Applications folder.
Obok plugin for calibre (Mac OS X, Windows)
-------------------------------------------
This plugin allows you to import kePub ebooks from your kobo desktop application. It is separate from the DeDRM application because it has to work in a different way. It will find all the books downloaded to your kobo desktop application, and let you choose which ones to import, removing the DRM as they are imported.
For instructions, see the obok_plugin_ReadMe.txt file in the Obok_calibre_plugin folder.
Other_Tools Other_Tools
----------- -----------
This is a folder of other tools that may be useful for DRMed ebooks from certain sources or for Linux users. Most users won't need any of these tools. This is a folder of other tools that may be useful for DRMed ebooks from certain sources or for Linux users. Most users won't need any of these tools.
@@ -90,15 +96,13 @@ http://www.activestate.com/activepython/downloads
We do **NOT** recommend the version of Python from python.org as it is missing various Windows specific libraries, does not install the Tk Widget kit (for graphical user interfaces) by default, and does not properly update the system PATH environment variable. Therefore using the default python.org build on Windows is simply an exercise in frustration for most Windows users. We do **NOT** recommend the version of Python from python.org as it is missing various Windows specific libraries, does not install the Tk Widget kit (for graphical user interfaces) by default, and does not properly update the system PATH environment variable. Therefore using the default python.org build on Windows is simply an exercise in frustration for most Windows users.
Note that currently (June 2016) ActiveState Python puts the tcl library in the wrong place, and it needs to be manually moved. See this thread at activestate.com for the latest information: https://community.activestate.com/node/19090
In addition, Windows Users need PyCrypto: In addition, Windows Users need PyCrypto:
There are many places to get PyCrypto installers for Windows. One such place is: There are many places to get PyCrypto installers for Windows. One such place is:
http://www.voidspace.org.uk/python/modules.shtml http://www.voidspace.org.uk/python/modules.shtml
Please get the latest (currently 2.6) PyCrypto meant for Windows Python version 2.7 Please get the latest (currently 2.6) PyCrypto meant for Windows Python version 2.7. Note that the PyCrypto binaries have two version numbers. The first is the PyCrypto version, and the second is the python version that they work with. This can be confusing.
Once Windows users have installed Python 2.7, and the matching PyCrypto, they are ready to run the DeDRM application or individual scripts. Once Windows users have installed Python 2.7, and the matching PyCrypto, they are ready to run the DeDRM application or individual scripts.
@@ -124,7 +128,7 @@ MD5: 1636862796d573c693d56bcc526b60bd
If you have any problems with Requiem, I suggest you contact Brahms directly through their Tor website. If you have any problems with Requiem, I suggest you contact Brahms directly through their Tor website.
No support for requiem is provided at Apprentice Alf's blog. No support for requiem is provided at Apprentice Alf's blog or Apprentice Harper's github repository.
Credits Credits