]> xmof Git - DeDRM.git/commitdiff
Add back unpad to fix Python2 support
authorNoDRM <no_drm123@protonmail.com>
Sat, 19 Mar 2022 09:14:45 +0000 (10:14 +0100)
committerNoDRM <no_drm123@protonmail.com>
Sat, 19 Mar 2022 09:14:45 +0000 (10:14 +0100)
DeDRM_plugin/__init__.py
DeDRM_plugin/adobekey.py
DeDRM_plugin/adobekey_get_passhash.py
DeDRM_plugin/androidkindlekey.py
DeDRM_plugin/ignoblekeyAndroid.py
DeDRM_plugin/ignoblekeyWindowsStore.py
DeDRM_plugin/ineptepub.py
DeDRM_plugin/ineptpdf.py
DeDRM_plugin/ion.py
Obok_plugin/obok/obok.py

index 7559b99cf70049073e2329f7ccfe23572a798c1c..74612c6ea9820284daf65d20cfd03624197c028c 100644 (file)
@@ -96,7 +96,7 @@ import traceback
 
 try: 
     import __version
-except ModuleNotFoundError
+except: 
     print("#############################")
     print("Failed to load the DeDRM plugin")
     print("Did you bundle this from source code yourself? If so, you'll need to run make_release.py instead to generate a valid plugin file.")
index 36c18decf73800626c23d26ed3280e8d4c669457..50e2c71314589c9076a0bbe2cedadaf4bee33f4d 100644 (file)
@@ -39,7 +39,7 @@ Retrieve Adobe ADEPT user key.
 """
 
 __license__ = 'GPL v3'
-__version__ = '7.3'
+__version__ = '7.4'
 
 import sys, os, struct, getopt
 from base64 import b64decode
@@ -128,10 +128,16 @@ if iswindows:
 
     try:
         from Cryptodome.Cipher import AES
-        from Cryptodome.Util.Padding import unpad
     except ImportError:
         from Crypto.Cipher import AES
-        from Crypto.Util.Padding import unpad
+
+    def unpad(data, padding=16):
+        if sys.version_info[0] == 2:
+            pad_len = ord(data[-1])
+        else:
+            pad_len = data[-1]
+
+        return data[:-pad_len]
 
     DEVICE_KEY_PATH = r'Software\Adobe\Adept\Device'
     PRIVATE_LICENCE_KEY_PATH = r'Software\Adobe\Adept\Activation'
@@ -381,7 +387,7 @@ if iswindows:
                         pass
                 if ktype == 'privateLicenseKey':
                     userkey = winreg.QueryValueEx(plkkey, 'value')[0]
-                    userkey = unpad(AES.new(keykey, AES.MODE_CBC, b'\x00'*16).decrypt(b64decode(userkey)), 16)[26:]
+                    userkey = unpad(AES.new(keykey, AES.MODE_CBC, b'\x00'*16).decrypt(b64decode(userkey)))[26:]
                     # print ("found " + uuid_name + " key: " + str(userkey))
                     keys.append(userkey)
 
index 72b7cd5c743a5c1b10b3f1b4637af30849838810..1e9b8e2dbd300398179312f28acba793e929eab1 100644 (file)
@@ -23,10 +23,17 @@ import sys, os, time
 import base64, hashlib
 try: 
     from Cryptodome.Cipher import AES
-    from Cryptodome.Util.Padding import unpad
 except ImportError:
     from Crypto.Cipher import AES
-    from Crypto.Util.Padding import unpad
+
+
+def unpad(data, padding=16):
+    if sys.version_info[0] == 2:
+        pad_len = ord(data[-1])
+    else:
+        pad_len = data[-1]
+
+    return data[:-pad_len]
 
 PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e"
 
@@ -48,7 +55,7 @@ def decrypt_passhash(passhash, fp):
     hash_key = hashlib.sha1(bytearray.fromhex(serial_number + PASS_HASH_SECRET)).digest()[:16]
 
     encrypted_cc_hash = base64.b64decode(passhash)
-    cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]), 16)
+    cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]))
     return base64.b64encode(cc_hash).decode("ascii")
 
 
index 6b152f3ead6bc3e52afbd0995eb62b44b0f890f1..971d7c30e86c43690c7938d1a29d8da84dcead28 100755 (executable)
@@ -36,10 +36,8 @@ from binascii import a2b_hex, b2a_hex
 
 try:
     from Cryptodome.Cipher import AES, DES
-    from Cryptodome.Util.Padding import pad, unpad
 except ImportError:
     from Crypto.Cipher import AES, DES
-    from Crypto.Util.Padding import pad, unpad
 
 # Routines common to Mac and PC
 
@@ -116,6 +114,20 @@ STORAGE  = "backup.ab"
 STORAGE1 = "AmazonSecureStorage.xml"
 STORAGE2 = "map_data_storage.db"
 
+
+def unpad(data, padding=16):
+    if sys.version_info[0] == 2:
+        pad_len = ord(data[-1])
+    else:
+        pad_len = data[-1]
+
+    return data[:-pad_len]
+
+def pad(data, padding_len=16):
+    padding_data_len = padding_len - (len(data) % padding_len)
+    plaintext = data + chr(padding_data_len) * padding_data_len
+    return plaintext
+
 class AndroidObfuscation(object):
     '''AndroidObfuscation
     For the key, it's written in java, and run in android dalvikvm
index 5fcbd6af1f68cbd4c832864692bd54af511a6abd..e0b2f238e3ebaf4dcd94298d7f792072dadd8a3e 100644 (file)
@@ -10,13 +10,19 @@ import os
 import base64
 try: 
     from Cryptodome.Cipher import AES
-    from Cryptodome.Util.Padding import unpad
 except ImportError:
     from Crypto.Cipher import AES
-    from Crypto.Util.Padding import unpad
 import hashlib
 from lxml import etree
 
+def unpad(data, padding=16):
+    if sys.version_info[0] == 2:
+        pad_len = ord(data[-1])
+    else:
+        pad_len = data[-1]
+
+    return data[:-pad_len]
+
 
 PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e"
 
@@ -46,10 +52,13 @@ def dump_keys(path_to_adobe_folder):
     hashes = []
 
     for pass_hash in activation_xml.findall(".//{http://ns.adobe.com/adept}passHash"):
-        encrypted_cc_hash = base64.b64decode(pass_hash.text)
-        cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]), 16)
-        hashes.append(base64.b64encode(cc_hash).decode("ascii"))
-        #print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii")))
+        try: 
+            encrypted_cc_hash = base64.b64decode(pass_hash.text)
+            cc_hash = unpad(AES.new(hash_key, AES.MODE_CBC, encrypted_cc_hash[:16]).decrypt(encrypted_cc_hash[16:]))
+            hashes.append(base64.b64encode(cc_hash).decode("ascii"))
+            #print("Nook ccHash is %s" % (base64.b64encode(cc_hash).decode("ascii")))
+        except:
+            pass
 
     return hashes
 
index 886c7cd4c08e6a3e543a1acdef24135460f759d6..29df2045322797eddbd39c1479a4afcbeedaf51f 100644 (file)
@@ -16,13 +16,19 @@ import base64
 import traceback
 try: 
     from Cryptodome.Cipher import AES
-    from Cryptodome.Util.Padding import unpad
 except:
     from Crypto.Cipher import AES
-    from Crypto.Util.Padding import unpad
 import hashlib
 from lxml import etree
 
+def unpad(data, padding=16):
+    if sys.version_info[0] == 2:
+        pad_len = ord(data[-1])
+    else:
+        pad_len = data[-1]
+
+    return data[:-pad_len]
+
 
 NOOK_DATA_FOLDER = "%LOCALAPPDATA%\\Packages\\BarnesNoble.Nook_ahnzqzva31enc\\LocalState"
 PASS_HASH_SECRET = "9ca588496a1bc4394553d9e018d70b9e"
index aa7b57142a92f8aa926975ed37197893569047fa..b9ec14912674fe399437628c5e981ac7ba6c134a 100644 (file)
@@ -56,11 +56,18 @@ import hashlib
 try:
     from Cryptodome.Cipher import AES, PKCS1_v1_5
     from Cryptodome.PublicKey import RSA
-    from Cryptodome.Util.Padding import unpad
 except ImportError:
     from Crypto.Cipher import AES, PKCS1_v1_5
     from Crypto.PublicKey import RSA
-    from Crypto.Util.Padding import unpad
+
+
+def unpad(data, padding=16):
+    if sys.version_info[0] == 2:
+        pad_len = ord(data[-1])
+    else:
+        pad_len = data[-1]
+
+    return data[:-pad_len]
 
 # Wrap a stream so that output gets flushed immediately
 # and also make sure that any unicode strings get
index 4319997a5f1605de1c30b714d4b481a5198607c3..cb179de9cdafe20e4296c27ed200d80fffeee93b 100755 (executable)
@@ -75,11 +75,19 @@ from uuid import UUID
 try:
     from Cryptodome.Cipher import AES, ARC4, PKCS1_v1_5
     from Cryptodome.PublicKey import RSA
-    from Cryptodome.Util.Padding import unpad
 except ImportError:
     from Crypto.Cipher import AES, ARC4, PKCS1_v1_5
     from Crypto.PublicKey import RSA
-    from Crypto.Util.Padding import unpad
+
+
+def unpad(data, padding=16):
+    if sys.version_info[0] == 2:
+        pad_len = ord(data[-1])
+    else:
+        pad_len = data[-1]
+
+    return data[:-pad_len]
+
 
 # Wrap a stream so that output gets flushed immediately
 # and also make sure that any unicode strings get
index f9cd879a6e0f4017728e4b25d69d56708a2cb06d..45e96109acc0f93c9116cae524a3d796b624b0aa 100644 (file)
@@ -33,10 +33,8 @@ from io import BytesIO
 try:
     from Cryptodome.Cipher import AES
     from Cryptodome.Util.py3compat import bchr
-    from Cryptodome.Util.Padding import unpad
 except ImportError:
     from Crypto.Cipher import AES
-    from Crypto.Util.Padding import unpad
     from Crypto.Util.py3compat import bchr
 
 try:
@@ -750,6 +748,26 @@ def addprottable(ion):
     ion.addtocatalog("ProtectedData", 1, SYM_NAMES)
 
 
+def pkcs7pad(msg, blocklen):
+    paddinglen = blocklen - len(msg) % blocklen
+    padding = bchr(paddinglen) * paddinglen
+    return msg + padding
+
+
+def pkcs7unpad(msg, blocklen):
+    _assert(len(msg) % blocklen == 0)
+
+    paddinglen = msg[-1]
+
+    _assert(paddinglen > 0 and paddinglen <= blocklen, "Incorrect padding - Wrong key")
+    _assert(msg[-paddinglen:] == bchr(paddinglen) * paddinglen, "Incorrect padding - Wrong key")
+
+    return msg[:-paddinglen]
+
+
+
+
+
 # every VoucherEnvelope version has a corresponding "word" and magic number, used in obfuscating the shared secret
 OBFUSCATION_TABLE = {
     "V1":    (0x00, None),
@@ -865,7 +883,7 @@ class DrmIonVoucher(object):
         key = hmac.new(sharedsecret, b"PIDv3", digestmod=hashlib.sha256).digest()
         aes = AES.new(key[:32], AES.MODE_CBC, self.cipheriv[:16])
         b = aes.decrypt(self.ciphertext)
-        b = unpad(b, 16)
+        b = pkcs7unpad(b, 16)
 
         self.drmkey = BinaryIonParser(BytesIO(b))
         addprottable(self.drmkey)
@@ -1071,7 +1089,7 @@ class DrmIon(object):
     def processpage(self, ct, civ, outpages, decompress, decrypt):
         if decrypt:
             aes = AES.new(self.key[:16], AES.MODE_CBC, civ[:16])
-            msg = unpad(aes.decrypt(ct), 16)
+            msg = pkcs7unpad(aes.decrypt(ct), 16)
         else:
             msg = ct
 
index e95e8d16a14bf9028dacdca5c5f2be1d043d3b01..e7da4307f4922aac450a336a811e22063cf8faf5 100644 (file)
 from __future__ import print_function
 
 __version__ = '10.0.1'
-__about__ =  "Obok v{0}\nCopyright © 2012-2020 Physisticated et al.".format(__version__)
+__about__ =  "Obok v{0}\nCopyright © 2012-2022 Physisticated et al.".format(__version__)
 
 import sys
 import os
@@ -185,10 +185,17 @@ import tempfile
 
 try:
     from Cryptodome.Cipher import AES
-    from Cryptodome.Util.Padding import unpad
 except ImportError:
     from Crypto.Cipher import AES
-    from Crypto.Util.Padding import unpad
+
+def unpad(data, padding=16):
+    if sys.version_info[0] == 2:
+        pad_len = ord(data[-1])
+    else:
+        pad_len = data[-1]
+
+    return data[:-pad_len]
+
 
 can_parse_xml = True
 try: