From dc5261870f5c6afed736bd903b6376f1cfd6abf9 Mon Sep 17 00:00:00 2001 From: Apprentice Harper Date: Mon, 18 Apr 2016 17:39:17 +0100 Subject: [PATCH] Topaz fixes to Mac & Windows apps, and version number update --- .../DeDRM.app/Contents/Info.plist | 4 +- .../Contents/Resources/convert2xml.py | 15 ++++-- .../DeDRM_App/DeDRM_lib/DeDRM_App.pyw | 3 +- .../DeDRM_App/DeDRM_lib/lib/convert2xml.py | 15 ++++-- DeDRM_calibre_plugin/DeDRM_plugin.zip | Bin 353872 -> 353933 bytes DeDRM_calibre_plugin/DeDRM_plugin/__init__.py | 3 +- .../Kindle_for_Mac_and_PC/kindlekey.pyw | 48 +++++++++++++++--- 7 files changed, 67 insertions(+), 21 deletions(-) diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist index 0edfc81..a5791fe 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist @@ -24,7 +24,7 @@ CFBundleExecutable droplet CFBundleGetInfoString - DeDRM AppleScript 6.4.1 Written 2010–2016 by Apprentice Alf et al. + DeDRM AppleScript 6.4.2 Written 2010–2016 by Apprentice Alf et al. CFBundleIconFile DeDRM CFBundleIdentifier @@ -36,7 +36,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 6.4.1 + 6.4.2 CFBundleSignature dplt LSRequiresCarbon diff --git a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/convert2xml.py b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/convert2xml.py index bbb7b04..443dd82 100644 --- a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/convert2xml.py +++ b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/convert2xml.py @@ -317,11 +317,16 @@ class PageParser(object): 'span.gridBeginCenter' : (1, 'scalar_number', 0, 0), 'span.gridEndCenter' : (1, 'scalar_number', 0, 0), - 'extratokens' : (1, 'snippets', 1, 0), - 'extratokens.class' : (1, 'scalar_text', 0, 0), - 'extratokens.type' : (1, 'scalar_text', 0, 0), - 'extratokens.firstGlyph' : (1, 'scalar_number', 0, 0), - 'extratokens.lastGlyph' : (1, 'scalar_number', 0, 0), + 'extratokens' : (1, 'snippets', 1, 0), + 'extratokens.class' : (1, 'scalar_text', 0, 0), + 'extratokens.type' : (1, 'scalar_text', 0, 0), + 'extratokens.firstGlyph' : (1, 'scalar_number', 0, 0), + 'extratokens.lastGlyph' : (1, 'scalar_number', 0, 0), + 'extratokens.gridSize' : (1, 'scalar_number', 0, 0), + 'extratokens.gridBottomCenter' : (1, 'scalar_number', 0, 0), + 'extratokens.gridTopCenter' : (1, 'scalar_number', 0, 0), + 'extratokens.gridBeginCenter' : (1, 'scalar_number', 0, 0), + 'extratokens.gridEndCenter' : (1, 'scalar_number', 0, 0), 'glyph.h' : (1, 'number', 0, 0), 'glyph.w' : (1, 'number', 0, 0), diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_App.pyw b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_App.pyw index 6a2e6c8..6ce1411 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_App.pyw +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_App.pyw @@ -23,8 +23,9 @@ # 6.3.6 - Version bump to match plugin # 6.4.0 - Fix for Kindle for PC encryption change # 6.4.1 - Fix for new tags in Topaz ebooks +# 6.4.2 - Fix for new tags in Topaz ebooks, and very small Topaz ebooks -__version__ = '6.4.1' +__version__ = '6.4.2' import sys import os, os.path diff --git a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/convert2xml.py b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/convert2xml.py index bbb7b04..443dd82 100644 --- a/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/convert2xml.py +++ b/DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/convert2xml.py @@ -317,11 +317,16 @@ class PageParser(object): 'span.gridBeginCenter' : (1, 'scalar_number', 0, 0), 'span.gridEndCenter' : (1, 'scalar_number', 0, 0), - 'extratokens' : (1, 'snippets', 1, 0), - 'extratokens.class' : (1, 'scalar_text', 0, 0), - 'extratokens.type' : (1, 'scalar_text', 0, 0), - 'extratokens.firstGlyph' : (1, 'scalar_number', 0, 0), - 'extratokens.lastGlyph' : (1, 'scalar_number', 0, 0), + 'extratokens' : (1, 'snippets', 1, 0), + 'extratokens.class' : (1, 'scalar_text', 0, 0), + 'extratokens.type' : (1, 'scalar_text', 0, 0), + 'extratokens.firstGlyph' : (1, 'scalar_number', 0, 0), + 'extratokens.lastGlyph' : (1, 'scalar_number', 0, 0), + 'extratokens.gridSize' : (1, 'scalar_number', 0, 0), + 'extratokens.gridBottomCenter' : (1, 'scalar_number', 0, 0), + 'extratokens.gridTopCenter' : (1, 'scalar_number', 0, 0), + 'extratokens.gridBeginCenter' : (1, 'scalar_number', 0, 0), + 'extratokens.gridEndCenter' : (1, 'scalar_number', 0, 0), 'glyph.h' : (1, 'number', 0, 0), 'glyph.w' : (1, 'number', 0, 0), diff --git a/DeDRM_calibre_plugin/DeDRM_plugin.zip b/DeDRM_calibre_plugin/DeDRM_plugin.zip index de165c15ff8f3067226172a9a725f02de028edfc..ef69a25ba44e816618ab0dc7077f0f5919970096 100644 GIT binary patch delta 17415 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 delta 17411 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
yiOWLs4YYY@s^u#sjE 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 diff --git a/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py b/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py index ddba7a4..080c194 100644 --- a/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py +++ b/DeDRM_calibre_plugin/DeDRM_plugin/__init__.py @@ -48,6 +48,7 @@ __docformat__ = 'restructuredtext en' # 6.3.6 - Fixes for ADE ePub and PDF introduced in 6.3.5 # 6.4.0 - Updated for new Kindle for PC encryption # 6.4.1 - Fix for some new tags in Topaz ebooks. +# 6.4.2 - Fix for more new tags in Topaz ebooks and very small Topaz ebooks """ @@ -55,7 +56,7 @@ Decrypt DRMed ebooks. """ PLUGIN_NAME = u"DeDRM" -PLUGIN_VERSION_TUPLE = (6, 4, 1) +PLUGIN_VERSION_TUPLE = (6, 4, 2) 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. RESOURCE_NAME = PLUGIN_NAME + '_Help.htm' diff --git a/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw b/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw index a597a26..c5159cc 100644 --- a/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw +++ b/Other_Tools/DRM_Key_Scripts/Kindle_for_Mac_and_PC/kindlekey.pyw @@ -993,7 +993,22 @@ if iswindows: # determine type of kindle info provided and return a # database of keynames and values def getDBfromFile(kInfoFile): - names = ['kindle.account.tokens','kindle.cookie.item','eulaVersionAccepted','login_date','kindle.token.item','login','kindle.key.item','kindle.name.info','kindle.device.info', 'MazamaRandomNumber', 'max_date', 'SIGVERIF'] + names = [\ + 'kindle.account.tokens',\ + 'kindle.cookie.item',\ + 'eulaVersionAccepted',\ + 'login_date',\ + 'kindle.token.item',\ + 'login',\ + 'kindle.key.item',\ + 'kindle.name.info',\ + 'kindle.device.info',\ + 'MazamaRandomNumber',\ + 'max_date',\ + 'SIGVERIF',\ + 'build_version',\ + ] + DB = {} with open(kInfoFile, 'rb') as infoReader: hdr = infoReader.read(1) @@ -1134,6 +1149,8 @@ if iswindows: if encodeHash(name,testMap8) == keyhash: keyname = name break + if keyname == "unknown": + keyname = keyhash # the testMap8 encoded contents data has had a length # of chars (always odd) cut off of the front and moved @@ -1158,14 +1175,17 @@ if iswindows: # decode using new testMap8 to get the original CryptProtect Data encryptedValue = decode(encdata,testMap8) cleartext = CryptUnprotectData(encryptedValue, entropy, 1) - DB[keyname] = cleartext + if len(cleartext)>0: + DB[keyname] = cleartext + #print keyname, cleartext - if 'kindle.account.tokens' in DB: + if len(DB)>4: # store values used in decryption DB['IDString'] = GetIDString() DB['UserName'] = GetUserName() print u"Decrypted key file using IDString '{0:s}' and UserName '{1:s}'".format(GetIDString(), GetUserName().encode('hex')) else: + print u"Couldn't decrypt file." DB = {} return DB elif isosx: @@ -1577,7 +1597,21 @@ elif isosx: # determine type of kindle info provided and return a # database of keynames and values def getDBfromFile(kInfoFile): - names = ['kindle.account.tokens','kindle.cookie.item','eulaVersionAccepted','login_date','kindle.token.item','login','kindle.key.item','kindle.name.info','kindle.device.info', 'MazamaRandomNumber', 'max_date', 'SIGVERIF'] + names = [\ + 'kindle.account.tokens',\ + 'kindle.cookie.item',\ + 'eulaVersionAccepted',\ + 'login_date',\ + 'kindle.token.item',\ + 'login',\ + 'kindle.key.item',\ + 'kindle.name.info',\ + 'kindle.device.info',\ + 'MazamaRandomNumber',\ + 'max_date',\ + 'SIGVERIF',\ + 'build_version',\ + ] with open(kInfoFile, 'rb') as infoReader: filehdr = infoReader.read(1) filedata = infoReader.read() @@ -1683,7 +1717,7 @@ elif isosx: if len(cleartext) > 0: DB[keyname] = cleartext - if 'MazamaRandomNumber' in DB and 'kindle.account.tokens' in DB: + if len(DB)>4: break else: # the latest .kinf2011 version for K4M 1.9.1 @@ -1772,11 +1806,11 @@ elif isosx: if len(cleartext) > 0: DB[keyname] = cleartext - if 'MazamaRandomNumber' in DB and 'kindle.account.tokens' in DB: + if len(DB)>4: break except: pass - if 'kindle.account.tokens' in DB: + if len(DB)>4: # store values used in decryption print u"Decrypted key file using IDString '{0:s}' and UserName '{1:s}'".format(IDString, GetUserName()) DB['IDString'] = IDString