]> xmof Git - DeDRM.git/commitdiff
New approach to Android backup files. Changed version number to 6.3.1
authorapprenticeharper <apprenticeharper@gmail.com>
Sun, 2 Aug 2015 10:09:35 +0000 (11:09 +0100)
committerapprenticeharper <apprenticeharper@gmail.com>
Sun, 2 Aug 2015 10:09:35 +0000 (11:09 +0100)
24 files changed:
DeDRM_Macintosh_Application/DeDRM ReadMe.rtf
DeDRM_Macintosh_Application/DeDRM.app.txt
DeDRM_Macintosh_Application/DeDRM.app/Contents/Info.plist
DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt
DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/__init__.py
DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/description.rtfd/TXT.rtf
DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ignoblekeyfetch.py
DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/ignoblekeygen.py
DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/k4mobidedrm.py
DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/DeDRM_app.pyw
DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/__init__.py
DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ignoblekeyfetch.py
DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/ignoblekeygen.py
DeDRM_Windows_Application/DeDRM_App/DeDRM_lib/lib/k4mobidedrm.py
DeDRM_calibre_plugin/DeDRM_plugin/__init__.py
DeDRM_calibre_plugin/DeDRM_plugin/ignoblekeyfetch.py
DeDRM_calibre_plugin/DeDRM_plugin/ignoblekeygen.py
DeDRM_calibre_plugin/DeDRM_plugin/k4mobidedrm.py
Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeyfetch.pyw
Other_Tools/DRM_Key_Scripts/Barnes_and_Noble_ePubs/ignoblekeygen.pyw
Other_Tools/DRM_Key_Scripts/Kindle_for_Android/androidkindlekey.pyw
Other_Tools/Kindle_for_Android_Patches/A_Patching_Experience.txt
README.md
ReadMe_First.txt

index 95e8b32834b549adad510f598b64ba46dcc8838f..aa9043b6be02cc1db5a3ccb39a0056620addf9ef 100644 (file)
Binary files a/DeDRM_Macintosh_Application/DeDRM ReadMe.rtf and b/DeDRM_Macintosh_Application/DeDRM ReadMe.rtf differ
index e79ff4e5bee3bc64dad4ae766291cdcad512cbc6..fdf0a43220ef5c2fd329a192dd56235a8282ff2b 100644 (file)
Binary files a/DeDRM_Macintosh_Application/DeDRM.app.txt and b/DeDRM_Macintosh_Application/DeDRM.app.txt differ
index 2beb96d1692c2bf546fb44588ff719950d12fdfa..1d01a8a908ac29bdfd0c6ec33ec97fad3f15216a 100644 (file)
@@ -24,7 +24,7 @@
        <key>CFBundleExecutable</key>
        <string>droplet</string>
        <key>CFBundleGetInfoString</key>
-       <string>DeDRM AppleScript 6.3.0 Written 2010–2015 by Apprentice Alf et al.</string>
+       <string>DeDRM AppleScript 6.3.1 Written 2010–2015 by Apprentice Alf et al.</string>
        <key>CFBundleIconFile</key>
        <string>DeDRM</string>
        <key>CFBundleIdentifier</key>
@@ -36,7 +36,7 @@
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleShortVersionString</key>
-       <string>6.3.0</string>
+       <string>6.3.1</string>
        <key>CFBundleSignature</key>
        <string>dplt</string>
        <key>LSRequiresCarbon</key>
@@ -48,6 +48,7 @@
                <key>bundleDividerCollapsed</key>
                <false/>
                <key>bundlePositionOfDivider</key>
+               <real>1162</real>
                <key>dividerCollapsed</key>
                <false/>
                <key>eventLogLevel</key>
@@ -55,9 +56,9 @@
                <key>name</key>
                <string>ScriptWindowState</string>
                <key>positionOfDivider</key>
-               <real>439</real>
+               <real>652</real>
                <key>savedFrame</key>
-               <string>128 98 1246 778 0 0 1680 1027 </string>
+               <string>0 36 1680 991 0 0 1680 1027 </string>
                <key>selectedTab</key>
                <string>log</string>
        </dict>
index 3993b61ccf0544b97e390a2b3bf761665ccd50c3..c09575ef3546e9770e28caf612db45a67d82e92b 100644 (file)
Binary files a/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt and b/DeDRM_Macintosh_Application/DeDRM.app/Contents/Resources/Scripts/main.scpt differ
index 5919f5b0c88496dca2f2686832f54eec409d5b30..6992561f184430f81dec3f86ffbcdd5b476cf60f 100644 (file)
@@ -42,6 +42,7 @@ __docformat__ = 'restructuredtext en'
 #   6.2.1 - Fix for non-ascii Windows user names
 #   6.2.2 - Added URL method for B&N/nook books
 #   6.3.0 - Added in Kindle for Android serial number solution
+#   6.3.1 - Version number bump for clarity
 
 
 """
@@ -49,7 +50,7 @@ Decrypt DRMed ebooks.
 """
 
 PLUGIN_NAME = u"DeDRM"
-PLUGIN_VERSION_TUPLE = (6, 3, 0)
+PLUGIN_VERSION_TUPLE = (6, 3, 1)
 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'
index 2b42b220e0b4821fa0d067bae8e26fd3c0e6d27a..e9c3bc1acd13a0f97fcb22075d300a59fe6e8548 100644 (file)
@@ -1,4 +1,4 @@
-{\rtf1\ansi\ansicpg1252\cocoartf1343\cocoasubrtf160
+{\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170
 {\fonttbl}
 {\colortbl;\red255\green255\blue255;}
 }
\ No newline at end of file
index c91e6f3522ec00c2d64ebf4269082f6d31e72e0d..e9637a17bab22aa0a9d812437cec72febc703004 100644 (file)
@@ -30,7 +30,7 @@ Fetch Barnes & Noble EPUB user key from B&N servers using email and password
 """
 
 __license__ = 'GPL v3'
-__version__ = "1.0"
+__version__ = "1.1"
 
 import sys
 import os
@@ -101,23 +101,23 @@ class IGNOBLEError(Exception):
     pass
 
 def fetch_key(email, password):
-    # change name and CC numbers to utf-8 if unicode
+    # change email and password to utf-8 if unicode
     if type(email)==unicode:
         email = email.encode('utf-8')
     if type(password)==unicode:
         password = password.encode('utf-8')
-        
+
     import random
     random = "%030x" % random.randrange(16**30)
-    
+
     import urllib, urllib2, re
-    
+
     # try the URL from nook for PC
     fetch_url = "https://cart4.barnesandnoble.com/services/service.aspx?Version=2&acctPassword="
     fetch_url += urllib.quote(password,'')+"&devID=PC_BN_2.5.6.9575_"+random+"&emailAddress="
     fetch_url += urllib.quote(email,"")+"&outFormat=5&schema=1&service=1&stage=deviceHashB"
     #print fetch_url
-    
+
     found = ''
     try:
         req = urllib2.Request(fetch_url)
@@ -133,13 +133,13 @@ def fetch_key(email, password):
         fetch_url += urllib.quote(password,'')+"&devID=hobbes_9.3.50818_"+random+"&emailAddress="
         fetch_url += urllib.quote(email,"")+"&outFormat=5&schema=1&service=1&stage=deviceHashB"
         #print fetch_url
-        
+
         found = ''
         try:
             req = urllib2.Request(fetch_url)
             response = urllib2.urlopen(req)
             the_page = response.read()
-            #print the_page            
+            #print the_page
             found = re.search('ccHash>(.+?)</ccHash', the_page).group(1)
         except:
             found = ''
@@ -169,6 +169,7 @@ def cli_main():
 def gui_main():
     try:
         import Tkinter
+        import tkFileDialog
         import Tkconstants
         import tkMessageBox
         import traceback
index 5118c870358d1c1dfcf80faa9ca771968b34f7c2..d2917c756af5dd57df8df3a158148356c97ae202 100644 (file)
@@ -33,13 +33,14 @@ from __future__ import with_statement
 #   2.5 - Additional improvement for unicode and plugin support
 #   2.6 - moved unicode_argv call inside main for Windows DeDRM compatibility
 #   2.7 - Work if TkInter is missing
+#   2.8 - Fix bug in stand-alone use (import tkFileDialog)
 
 """
 Generate Barnes & Noble EPUB user key from name and credit card number.
 """
 
 __license__ = 'GPL v3'
-__version__ = "2.7"
+__version__ = "2.8"
 
 import sys
 import os
@@ -240,6 +241,7 @@ def gui_main():
         import Tkinter
         import Tkconstants
         import tkMessageBox
+        import tkFileDialog
         import traceback
     except:
         return cli_main()
index 4ce5aab7b550a11aec305fc3a08658696558c8f6..67eb4cbf3d6b8d180272f7d5090907a2954c6e0c 100644 (file)
@@ -323,8 +323,8 @@ def cli_main():
             serials = a.split(',')
         if o == '-a':
             if a == None:
-                continue
-            androidFiles.apprend(a)
+                raise DrmException("Invalid parameter for -a")
+            androidFiles.append(a)
 
     # try with built in Kindle Info files if not on Linux
     k4 = not sys.platform.startswith('linux')
index 34cfa7073703fb9b94bce16e3347e0c6657602ba..9c2fb58041482f16349115b0f8a0b9c02fa6eaf9 100644 (file)
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 
 # DeDRM.pyw
-# Copyright 2010-2013 some_updates and Apprentice Alf
+# Copyright 2010-2015 some_updates, Apprentice Alf and Apprentice Harper
 
 # Revision history:
 #   6.0.0 - Release along with unified plugin
@@ -15,8 +15,9 @@
 #   6.2.1 - Fix for non-ascii user names
 #   6.2.2 - Added URL method for B&N/nook books
 #   6.3.0 - Add in Android support
+#   6.3.1 - Version bump for clarity
 
-__version__ = '6.3.0'
+__version__ = '6.3.1'
 
 import sys
 import os, os.path
@@ -167,7 +168,7 @@ class PrefsDialog(Toplevel):
         body.pack(fill=Tkconstants.X, expand=1)
         sticky = Tkconstants.E + Tkconstants.W
         body.grid_columnconfigure(1, weight=2)
-        
+
         cur_row = 0
         Tkinter.Label(body, text='Adobe Key file (adeptkey.der)').grid(row=cur_row, sticky=Tkconstants.E)
         self.adkpath = Tkinter.Entry(body, width=50)
index 5919f5b0c88496dca2f2686832f54eec409d5b30..6992561f184430f81dec3f86ffbcdd5b476cf60f 100644 (file)
@@ -42,6 +42,7 @@ __docformat__ = 'restructuredtext en'
 #   6.2.1 - Fix for non-ascii Windows user names
 #   6.2.2 - Added URL method for B&N/nook books
 #   6.3.0 - Added in Kindle for Android serial number solution
+#   6.3.1 - Version number bump for clarity
 
 
 """
@@ -49,7 +50,7 @@ Decrypt DRMed ebooks.
 """
 
 PLUGIN_NAME = u"DeDRM"
-PLUGIN_VERSION_TUPLE = (6, 3, 0)
+PLUGIN_VERSION_TUPLE = (6, 3, 1)
 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'
index c91e6f3522ec00c2d64ebf4269082f6d31e72e0d..e9637a17bab22aa0a9d812437cec72febc703004 100644 (file)
@@ -30,7 +30,7 @@ Fetch Barnes & Noble EPUB user key from B&N servers using email and password
 """
 
 __license__ = 'GPL v3'
-__version__ = "1.0"
+__version__ = "1.1"
 
 import sys
 import os
@@ -101,23 +101,23 @@ class IGNOBLEError(Exception):
     pass
 
 def fetch_key(email, password):
-    # change name and CC numbers to utf-8 if unicode
+    # change email and password to utf-8 if unicode
     if type(email)==unicode:
         email = email.encode('utf-8')
     if type(password)==unicode:
         password = password.encode('utf-8')
-        
+
     import random
     random = "%030x" % random.randrange(16**30)
-    
+
     import urllib, urllib2, re
-    
+
     # try the URL from nook for PC
     fetch_url = "https://cart4.barnesandnoble.com/services/service.aspx?Version=2&acctPassword="
     fetch_url += urllib.quote(password,'')+"&devID=PC_BN_2.5.6.9575_"+random+"&emailAddress="
     fetch_url += urllib.quote(email,"")+"&outFormat=5&schema=1&service=1&stage=deviceHashB"
     #print fetch_url
-    
+
     found = ''
     try:
         req = urllib2.Request(fetch_url)
@@ -133,13 +133,13 @@ def fetch_key(email, password):
         fetch_url += urllib.quote(password,'')+"&devID=hobbes_9.3.50818_"+random+"&emailAddress="
         fetch_url += urllib.quote(email,"")+"&outFormat=5&schema=1&service=1&stage=deviceHashB"
         #print fetch_url
-        
+
         found = ''
         try:
             req = urllib2.Request(fetch_url)
             response = urllib2.urlopen(req)
             the_page = response.read()
-            #print the_page            
+            #print the_page
             found = re.search('ccHash>(.+?)</ccHash', the_page).group(1)
         except:
             found = ''
@@ -169,6 +169,7 @@ def cli_main():
 def gui_main():
     try:
         import Tkinter
+        import tkFileDialog
         import Tkconstants
         import tkMessageBox
         import traceback
index 5118c870358d1c1dfcf80faa9ca771968b34f7c2..d2917c756af5dd57df8df3a158148356c97ae202 100644 (file)
@@ -33,13 +33,14 @@ from __future__ import with_statement
 #   2.5 - Additional improvement for unicode and plugin support
 #   2.6 - moved unicode_argv call inside main for Windows DeDRM compatibility
 #   2.7 - Work if TkInter is missing
+#   2.8 - Fix bug in stand-alone use (import tkFileDialog)
 
 """
 Generate Barnes & Noble EPUB user key from name and credit card number.
 """
 
 __license__ = 'GPL v3'
-__version__ = "2.7"
+__version__ = "2.8"
 
 import sys
 import os
@@ -240,6 +241,7 @@ def gui_main():
         import Tkinter
         import Tkconstants
         import tkMessageBox
+        import tkFileDialog
         import traceback
     except:
         return cli_main()
index 4ce5aab7b550a11aec305fc3a08658696558c8f6..67eb4cbf3d6b8d180272f7d5090907a2954c6e0c 100644 (file)
@@ -323,8 +323,8 @@ def cli_main():
             serials = a.split(',')
         if o == '-a':
             if a == None:
-                continue
-            androidFiles.apprend(a)
+                raise DrmException("Invalid parameter for -a")
+            androidFiles.append(a)
 
     # try with built in Kindle Info files if not on Linux
     k4 = not sys.platform.startswith('linux')
index 5919f5b0c88496dca2f2686832f54eec409d5b30..6992561f184430f81dec3f86ffbcdd5b476cf60f 100644 (file)
@@ -42,6 +42,7 @@ __docformat__ = 'restructuredtext en'
 #   6.2.1 - Fix for non-ascii Windows user names
 #   6.2.2 - Added URL method for B&N/nook books
 #   6.3.0 - Added in Kindle for Android serial number solution
+#   6.3.1 - Version number bump for clarity
 
 
 """
@@ -49,7 +50,7 @@ Decrypt DRMed ebooks.
 """
 
 PLUGIN_NAME = u"DeDRM"
-PLUGIN_VERSION_TUPLE = (6, 3, 0)
+PLUGIN_VERSION_TUPLE = (6, 3, 1)
 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'
index c91e6f3522ec00c2d64ebf4269082f6d31e72e0d..e9637a17bab22aa0a9d812437cec72febc703004 100644 (file)
@@ -30,7 +30,7 @@ Fetch Barnes & Noble EPUB user key from B&N servers using email and password
 """
 
 __license__ = 'GPL v3'
-__version__ = "1.0"
+__version__ = "1.1"
 
 import sys
 import os
@@ -101,23 +101,23 @@ class IGNOBLEError(Exception):
     pass
 
 def fetch_key(email, password):
-    # change name and CC numbers to utf-8 if unicode
+    # change email and password to utf-8 if unicode
     if type(email)==unicode:
         email = email.encode('utf-8')
     if type(password)==unicode:
         password = password.encode('utf-8')
-        
+
     import random
     random = "%030x" % random.randrange(16**30)
-    
+
     import urllib, urllib2, re
-    
+
     # try the URL from nook for PC
     fetch_url = "https://cart4.barnesandnoble.com/services/service.aspx?Version=2&acctPassword="
     fetch_url += urllib.quote(password,'')+"&devID=PC_BN_2.5.6.9575_"+random+"&emailAddress="
     fetch_url += urllib.quote(email,"")+"&outFormat=5&schema=1&service=1&stage=deviceHashB"
     #print fetch_url
-    
+
     found = ''
     try:
         req = urllib2.Request(fetch_url)
@@ -133,13 +133,13 @@ def fetch_key(email, password):
         fetch_url += urllib.quote(password,'')+"&devID=hobbes_9.3.50818_"+random+"&emailAddress="
         fetch_url += urllib.quote(email,"")+"&outFormat=5&schema=1&service=1&stage=deviceHashB"
         #print fetch_url
-        
+
         found = ''
         try:
             req = urllib2.Request(fetch_url)
             response = urllib2.urlopen(req)
             the_page = response.read()
-            #print the_page            
+            #print the_page
             found = re.search('ccHash>(.+?)</ccHash', the_page).group(1)
         except:
             found = ''
@@ -169,6 +169,7 @@ def cli_main():
 def gui_main():
     try:
         import Tkinter
+        import tkFileDialog
         import Tkconstants
         import tkMessageBox
         import traceback
index 5118c870358d1c1dfcf80faa9ca771968b34f7c2..d2917c756af5dd57df8df3a158148356c97ae202 100644 (file)
@@ -33,13 +33,14 @@ from __future__ import with_statement
 #   2.5 - Additional improvement for unicode and plugin support
 #   2.6 - moved unicode_argv call inside main for Windows DeDRM compatibility
 #   2.7 - Work if TkInter is missing
+#   2.8 - Fix bug in stand-alone use (import tkFileDialog)
 
 """
 Generate Barnes & Noble EPUB user key from name and credit card number.
 """
 
 __license__ = 'GPL v3'
-__version__ = "2.7"
+__version__ = "2.8"
 
 import sys
 import os
@@ -240,6 +241,7 @@ def gui_main():
         import Tkinter
         import Tkconstants
         import tkMessageBox
+        import tkFileDialog
         import traceback
     except:
         return cli_main()
index 4ce5aab7b550a11aec305fc3a08658696558c8f6..67eb4cbf3d6b8d180272f7d5090907a2954c6e0c 100644 (file)
@@ -323,8 +323,8 @@ def cli_main():
             serials = a.split(',')
         if o == '-a':
             if a == None:
-                continue
-            androidFiles.apprend(a)
+                raise DrmException("Invalid parameter for -a")
+            androidFiles.append(a)
 
     # try with built in Kindle Info files if not on Linux
     k4 = not sys.platform.startswith('linux')
index 2ecbe96f1c31ed495b7a9dddb6f3a3b29806bccf..e9637a17bab22aa0a9d812437cec72febc703004 100644 (file)
@@ -3,13 +3,14 @@
 
 from __future__ import with_statement
 
-# ignoblekeyfetch.pyw, version 1.0
+# ignoblekeyfetch.pyw, version 1.1
 # Copyright © 2015 Apprentice Harper
 
 # Released under the terms of the GNU General Public Licence, version 3
 # <http://www.gnu.org/licenses/>
 
 # Based on discoveries by "Nobody You Know"
+# Code partly based on ignoblekeygen.py by several people.
 
 # Windows users: Before running this program, you must first install Python.
 #   We recommend ActiveState Python 2.7.X for Windows from
@@ -17,18 +18,19 @@ from __future__ import with_statement
 #   Then save this script file as ignoblekeyfetch.pyw and double-click on it to run it.
 #
 # Mac OS X users: Save this script file as ignoblekeyfetch.pyw.  You can run this
-#   program from the command line (python ignoblekeygen.pyw) or by double-clicking
+#   program from the command line (python ignoblekeyfetch.pyw) or by double-clicking
 #   it when it has been associated with PythonLauncher.
 
 # Revision history:
-#   1.0 - Initial release
+#   1.0 - Initial  version
+#   1.1 - Try second URL if first one fails
 
 """
 Fetch Barnes & Noble EPUB user key from B&N servers using email and password
 """
 
 __license__ = 'GPL v3'
-__version__ = "1.0"
+__version__ = "1.1"
 
 import sys
 import os
@@ -87,7 +89,7 @@ def unicode_argv():
                     xrange(start, argc.value)]
         # if we don't have any arguments at all, just pass back script name
         # this should never happen
-        return [u"ignoblekeygen.py"]
+        return [u"ignoblekeyfetch.py"]
     else:
         argvencoding = sys.stdin.encoding
         if argvencoding == None:
@@ -99,33 +101,49 @@ class IGNOBLEError(Exception):
     pass
 
 def fetch_key(email, password):
-    # remove spaces and case from name and CC numbers.
+    # change email and password to utf-8 if unicode
     if type(email)==unicode:
         email = email.encode('utf-8')
     if type(password)==unicode:
         password = password.encode('utf-8')
-        
+
     import random
     random = "%030x" % random.randrange(16**30)
-    
-    import urllib, urllib2
+
+    import urllib, urllib2, re
+
+    # try the URL from nook for PC
     fetch_url = "https://cart4.barnesandnoble.com/services/service.aspx?Version=2&acctPassword="
     fetch_url += urllib.quote(password,'')+"&devID=PC_BN_2.5.6.9575_"+random+"&emailAddress="
     fetch_url += urllib.quote(email,"")+"&outFormat=5&schema=1&service=1&stage=deviceHashB"
     #print fetch_url
-    
+
     found = ''
     try:
         req = urllib2.Request(fetch_url)
         response = urllib2.urlopen(req)
         the_page = response.read()
         #print the_page
-        
-        import re
-        
         found = re.search('ccHash>(.+?)</ccHash', the_page).group(1)
     except:
         found = ''
+    if len(found)!=28:
+        # try the URL from android devices
+        fetch_url = "https://cart4.barnesandnoble.com/services/service.aspx?Version=2&acctPassword="
+        fetch_url += urllib.quote(password,'')+"&devID=hobbes_9.3.50818_"+random+"&emailAddress="
+        fetch_url += urllib.quote(email,"")+"&outFormat=5&schema=1&service=1&stage=deviceHashB"
+        #print fetch_url
+
+        found = ''
+        try:
+            req = urllib2.Request(fetch_url)
+            response = urllib2.urlopen(req)
+            the_page = response.read()
+            #print the_page
+            found = re.search('ccHash>(.+?)</ccHash', the_page).group(1)
+        except:
+            found = ''
+
     return found
 
 
@@ -151,6 +169,7 @@ def cli_main():
 def gui_main():
     try:
         import Tkinter
+        import tkFileDialog
         import Tkconstants
         import tkMessageBox
         import traceback
index 83bb2ceb03c0e97128575df01c303a035a78c47d..d2917c756af5dd57df8df3a158148356c97ae202 100644 (file)
@@ -33,13 +33,14 @@ from __future__ import with_statement
 #   2.5 - Additional improvement for unicode and plugin support
 #   2.6 - moved unicode_argv call inside main for Windows DeDRM compatibility
 #   2.7 - Work if TkInter is missing
+#   2.8 - Fix bug in stand-alone use (import tkFileDialog)
 
 """
 Generate Barnes & Noble EPUB user key from name and credit card number.
 """
 
 __license__ = 'GPL v3'
-__version__ = "2.7"
+__version__ = "2.8"
 
 import sys
 import os
index 7a2571070e99fd37274f5b9461bf54bd1109633d..2c539eea40c4159d6b9aeac2cea4186c037824c1 100644 (file)
@@ -14,14 +14,15 @@ from __future__ import with_statement
 #  1.2   - Changed to be callable from AppleScript by returning only serial number
 #        - and changed name to androidkindlekey.py
 #        - and added in unicode command line support
-#  1.3   - added in TkInter interface, output to a file and attempt to get backup from a connected android device.
+#  1.3   - added in TkInter interface, output to a file
+#  1.4   - Fix some problems identified by Aldo Bleeker
 
 """
 Retrieve Kindle for Android Serial Number.
 """
 
 __license__ = 'GPL v3'
-__version__ = '1.3'
+__version__ = '1.4'
 
 import os
 import sys
@@ -199,13 +200,16 @@ def get_serials1(path=STORAGE1):
         return []
 
     serials = []
+    if dsnid:
+        serials.append(dsnid)
     for token in tokens:
         if token:
             serials.append('%s%s' % (dsnid, token))
+            serials.append(token)
     return serials
 
 def get_serials2(path=STORAGE2):
-    ''' get serials from android's shared preference xml '''
+    ''' get serials from android's sql database '''
     if not os.path.isfile(path):
         return []
 
@@ -213,14 +217,32 @@ def get_serials2(path=STORAGE2):
     connection = sqlite3.connect(path)
     cursor = connection.cursor()
     cursor.execute('''select userdata_value from userdata where userdata_key like '%/%token.device.deviceserialname%' ''')
-    dsns = [x[0].encode('utf8') for x in cursor.fetchall()]
+    userdata_keys = cursor.fetchall()
+    dsns = []
+    for userdata_row in userdata_keys:
+        if userdata_row:
+            userdata_utf8 = userdata_row[0].encode('utf8')
+            if len(userdata_utf8) > 0:
+                dsns.append(userdata_utf8)
+    dsns = list(set(dsns))
 
     cursor.execute('''select userdata_value from userdata where userdata_key like '%/%kindle.account.tokens%' ''')
-    tokens = [x[0].encode('utf8') for x in cursor.fetchall()]
+    userdata_keys = cursor.fetchall()
+    tokens = []
+    for userdata_row in userdata_keys:
+        if userdata_row:
+            userdata_utf8 = userdata_row[0].encode('utf8')
+            if len(userdata_utf8) > 0:
+                tokens.append(userdata_utf8)
+    tokens = list(set(tokens))
     serials = []
     for x in dsns:
+        serials.append(x)
         for y in tokens:
             serials.append('%s%s' % (x, y))
+    for y in tokens:
+        serials.append(y)
     return serials
 
 def get_serials(path=STORAGE):
@@ -269,46 +291,31 @@ def get_serials(path=STORAGE):
             write_path = os.path.abspath(write.name)
             serials.extend(get_serials2(write_path))
             os.remove(write_path)
-
-    return serials
+    return list(set(serials))
 
 __all__ = [ 'get_serials', 'getkey']
 
-# interface for Python DeDRM
-# returns single key or multiple keys, depending on path or file passed in
-def getkey(outpath, inpath):
+# procedure for CLI and GUI interfaces
+# returns single or multiple keys (one per line) in the specified file
+def getkey(outfile, inpath):
     keys = get_serials(inpath)
     if len(keys) > 0:
-        if not os.path.isdir(outpath):
-            outfile = outpath
-            with file(outfile, 'w') as keyfileout:
-                keyfileout.write(keys[0])
-            print u"Saved a key to {0}".format(outfile)
-        else:
-            keycount = 0
+        with file(outfile, 'w') as keyfileout:
             for key in keys:
-                while True:
-                    keycount += 1
-                    outfile = os.path.join(outpath,u"kindlekey{0:d}.k4a".format(keycount))
-                    if not os.path.exists(outfile):
-                        break
-                with file(outfile, 'w') as keyfileout:
-                    keyfileout.write(key)
-                print u"Saved a key to {0}".format(outfile)
+                keyfileout.write(key)
+                keyfileout.write("\n")
         return True
     return False
 
 
 def usage(progname):
-    print u"{0} v{1}\nCopyright © 2013-2015 Thom and Apprentice Harper".format(progname,__version__)
-    print u"Decrypts the serial number of Kindle For Android from Android backup or file"
+    print u"Decrypts the serial number(s) of Kindle For Android from Android backup or file"
     print u"Get backup.ab file using adb backup com.amazon.kindle for Android 4.0+."
     print u"Otherwise extract AmazonSecureStorage.xml from /data/data/com.amazon.kindle/shared_prefs/AmazonSecureStorage.xml"
     print u"Or map_data_storage.db from /data/data/com.amazon.kindle/databases/map_data_storage.db"
     print u""
-    print u"Serial number is written to standard output."
     print u"Usage:"
-    print u"    {0:s} [-h] [-b <backup.ab>] [<outpath>]".format(progname)
+    print u"    {0:s} [-h] [-b <backup.ab>] [<outfile.k4a>]".format(progname)
 
 
 def cli_main():
@@ -339,24 +346,28 @@ def cli_main():
 
     if len(args) == 1:
         # save to the specified file or directory
-        outpath = args[0]
-        if not os.path.isabs(outpath):
-           outpath = os.path.join(os.path.dirname(argv[0]),outpath)
-           outpath = os.path.abspath(outpath)
+        outfile = args[0]
+        if not os.path.isabs(outfile):
+           outfile = os.path.join(os.path.dirname(argv[0]),outfile)
+           outfile = os.path.abspath(outfile)
+        if os.path.isdir(outfile):
+           outfile = os.path.join(os.path.dirname(argv[0]),"androidkindlekey.k4a")
     else:
         # save to the same directory as the script
-        outpath = os.path.dirname(argv[0])
+        outfile = os.path.join(os.path.dirname(argv[0]),"androidkindlekey.k4a")
 
     # make sure the outpath is OK
-    outpath = os.path.realpath(os.path.normpath(outpath))
+    outfile = os.path.realpath(os.path.normpath(outfile))
 
     if not os.path.isfile(inpath):
         usage(progname)
         print u"\n{0:s} file not found".format(inpath)
         return 2
 
-    if not getkey(outpath, inpath):
-        print u"Could not retrieve Kindle for Android key."
+    if getkey(outfile, inpath):
+        print u"\nSaved Kindle for Android key to {0}".format(outfile)
+    else:
+        print u"\nCould not retrieve Kindle for Android key."
     return 0
 
 
index d28a96abf10ab0ddea21490fe8a7879e085f66f3..0c24f0d64ec0ad0964d0e75c69762b3a48cede78 100644 (file)
@@ -1,3 +1,14 @@
+Of Historical Interest Only
+===========================
+
+It is now much simpler and easier to get a backup.ab file from your Android device and import that into the tools.
+
+
+
+
+
+
+
 Comment at Apprentice Alf's Blog by cestmoicestmoi, 21st December, 2012.
 ========================================================================
 
index e81a8a5df5c8e09de2745aa82869199983314b9f..4dbe0ee14c79ccae2d96b4f78065c41e7d819f74 100644 (file)
--- a/README.md
+++ b/README.md
@@ -8,8 +8,8 @@ Mostly it tracks the tools releases by Apprentice Alf, athough it also includes
 Users should download the latest zip archive.
 Developers might be interested in forking the repository, as it contains unzipped versions of those tools that are zipped, and text versions of the AppleScripts, to make the changes over time easier to follow.
 
-I welcome contributions from others to improve these tools, from expanding the range of books handled, improving key retrieval,  to just general bug fixe, speed improvements and UI enhancements.
+I welcome contributions from others to improve these tools, from expanding the range of books handled, improving key retrieval,  to just general bug fixes, speed improvements and UI enhancements.
 
-My special thanks to all those developers who have done the hard work of reverse engineering to provide the initial tools. 
+My special thanks to all those developers who have done the hard work of reverse engineering to provide the initial tools.
 
 Apprentice Harper.
index 22af920987f4717d874333f7c685ab54cb609460..5e3ad45ea7f2433744931b98630478bb2af58e74 100644 (file)
@@ -1,11 +1,11 @@
 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.2.2 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.3.1 archive from Apprentice Alf's Blog: http://apprenticealf.wordpress.com/
 
 The is archive includes tools to remove DRM from:
 
- - Kindle ebooks (Mobi, Topaz, Print Replica and KF8).
+ - Kindle ebooks (from Kindle for Mac/PC, eInk Kindles and Kindle for Android).
  - Barnes and Noble ePubs
  - Adobe Digital Editions ePubs (including Kobo and Google ePubs downloaded to ADE)
  - Kobo kePubs from the Kobo Desktop application
@@ -36,7 +36,7 @@ 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.
 
-For instructions, see the "DeDRM ReadMe.rtf" file in the DeDRM_Application_Macintosh folder.
+For instructions, see the "DeDRM ReadMe.rtf" file in the DeDRM_Macintosh_Application folder.
 
 N.B. Mac OS X 10.4 users need to take extra steps before using the application, see the ReadMe.
 
@@ -62,17 +62,14 @@ 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.
 
-DRM_Key_Scripts
-This folder contains python scripts that create or extract or fetch encryption keyfiles for Barnes and Noble ePubs, Adobe Digital Editions ePubs, Kindle for Mac/PC and Kindle for Android ebooks. These files are needed for the Windows stand-alone DeDRM application.
-
-B&N_Download_Helper
+B_and_N_Download_Helper
 A Javascript to enable a download button at the B&N website for ebooks that normally won't download to your PC. Only for the adventurous.
 
 DRM_Key_Scripts
 This folder contains python scripts that create or extract or fetch encryption keyfiles for Barnes and Noble ePubs, Adobe Digital Editions ePubs, Kindle for Mac/PC and Kindle for Android ebooks.
 
 Kindle_for_Android_Patches
-Definitely only for the adventurous, this folder contains information on how to modify the Kindel for Android app to b able to get a PID for use with the other Kindle tools (DeDRM apps and calibre plugin).
+Definitely only for the adventurous, this folder contains information on how to modify the Kindle for Android app to b able to get a PID for use with the other Kindle tools (DeDRM apps and calibre plugin). This is now of historical interest only, as Android support has now been added to the tools more simply.
 
 Kobo
 Contains the standalone obok python script for removing DRM from kePubs downloaded using the kobo desktop application.