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.")
"""
__license__ = 'GPL v3'
-__version__ = '7.3'
+__version__ = '7.4'
import sys, os, struct, getopt
from base64 import b64decode
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'
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)
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"
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")
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
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
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"
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
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"
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
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
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:
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),
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)
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
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
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: