|
1 | 1 | #!/usr/bin/env python3
|
2 | 2 | # -*- coding: utf-8 -*-
|
3 | 3 |
|
4 |
| -# adobekey.pyw, version 6.0 |
5 |
| -# Copyright © 2009-2020 i♥cabbages, Apprentice Harper et al. |
| 4 | +# adobekey.pyw, version 7.1 |
| 5 | +# Copyright © 2009-2021 i♥cabbages, Apprentice Harper et al. |
6 | 6 |
|
7 | 7 | # Released under the terms of the GNU General Public Licence, version 3
|
8 | 8 | # <http://www.gnu.org/licenses/>
|
|
29 | 29 | # 5.9 - moved unicode_argv call inside main for Windows DeDRM compatibility
|
30 | 30 | # 6.0 - Work if TkInter is missing
|
31 | 31 | # 7.0 - Python 3 for calibre 5
|
| 32 | +# 7.1 - Fix "failed to decrypt user key key" error (read username from registry) |
32 | 33 |
|
33 | 34 | """
|
34 | 35 | Retrieve Adobe ADEPT user key.
|
35 | 36 | """
|
36 | 37 |
|
37 | 38 | __license__ = 'GPL v3'
|
38 |
| -__version__ = '7.0' |
| 39 | +__version__ = '7.1' |
39 | 40 |
|
40 | 41 | import sys, os, struct, getopt
|
41 | 42 | from base64 import b64decode
|
@@ -288,8 +289,13 @@ def __call__(self, *args):
|
288 | 289 |
|
289 | 290 | def __del__(self):
|
290 | 291 | if self._buf is not None:
|
291 |
| - VirtualFree(self._buf) |
292 |
| - self._buf = None |
| 292 | + try: |
| 293 | + VirtualFree(self._buf) |
| 294 | + self._buf = None |
| 295 | + except TypeError: |
| 296 | + # Apparently this sometimes gets cleared on application exit |
| 297 | + # Causes a useless exception in the log, so let's just catch and ignore that. |
| 298 | + pass |
293 | 299 |
|
294 | 300 | if struct.calcsize("P") == 4:
|
295 | 301 | CPUID0_INSNS = (
|
@@ -400,25 +406,40 @@ def adeptkeys():
|
400 | 406 | ktype = winreg.QueryValueEx(plkparent, None)[0]
|
401 | 407 | if ktype != 'credentials':
|
402 | 408 | continue
|
403 |
| - uuid_name = "Unknown" |
| 409 | + uuid_name = "" |
404 | 410 | for j in range(0, 16):
|
405 | 411 | try:
|
406 | 412 | plkkey = winreg.OpenKey(plkparent, "%04d" % (j,))
|
407 | 413 | except WindowsError:
|
408 | 414 | break
|
409 | 415 | ktype = winreg.QueryValueEx(plkkey, None)[0]
|
410 | 416 | if ktype == 'user':
|
411 |
| - uuid_name = winreg.QueryValueEx(plkkey, 'value')[0] |
412 |
| - if ktype != 'privateLicenseKey': |
413 |
| - continue |
414 |
| - userkey = winreg.QueryValueEx(plkkey, 'value')[0] |
415 |
| - userkey = b64decode(userkey) |
416 |
| - aes = AES(keykey) |
417 |
| - userkey = aes.decrypt(userkey) |
418 |
| - userkey = userkey[26:-ord(userkey[-1:])] |
419 |
| - # print ("found " + uuid_name + " key: " + str(userkey)) |
420 |
| - keys.append(userkey) |
421 |
| - names.append(uuid_name[9:]) |
| 417 | + # Add Adobe UUID to key name |
| 418 | + uuid_name = uuid_name + winreg.QueryValueEx(plkkey, 'value')[0][9:] + "_" |
| 419 | + if ktype == 'username': |
| 420 | + # Add account type & email to key name, if present |
| 421 | + try: |
| 422 | + uuid_name = uuid_name + winreg.QueryValueEx(plkkey, 'method')[0] + "_" |
| 423 | + except: |
| 424 | + pass |
| 425 | + try: |
| 426 | + uuid_name = uuid_name + winreg.QueryValueEx(plkkey, 'value')[0] + "_" |
| 427 | + except: |
| 428 | + pass |
| 429 | + if ktype == 'privateLicenseKey': |
| 430 | + userkey = winreg.QueryValueEx(plkkey, 'value')[0] |
| 431 | + userkey = b64decode(userkey) |
| 432 | + aes = AES(keykey) |
| 433 | + userkey = aes.decrypt(userkey) |
| 434 | + userkey = userkey[26:-ord(userkey[-1:])] |
| 435 | + # print ("found " + uuid_name + " key: " + str(userkey)) |
| 436 | + keys.append(userkey) |
| 437 | + |
| 438 | + if uuid_name == "": |
| 439 | + names.append("Unknown") |
| 440 | + else: |
| 441 | + names.append(uuid_name[:-1]) |
| 442 | + |
422 | 443 | if len(keys) == 0:
|
423 | 444 | raise ADEPTError('Could not locate privateLicenseKey')
|
424 | 445 | print("Found {0:d} keys".format(len(keys)))
|
@@ -461,16 +482,32 @@ def adeptkeys():
|
461 | 482 | tree = etree.parse(actpath)
|
462 | 483 | adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag)
|
463 | 484 | expr = '//%s/%s' % (adept('credentials'), adept('privateLicenseKey'))
|
464 |
| - exprUUID = '//%s/%s' % (adept('credentials'), adept('user')) |
465 | 485 | userkey = tree.findtext(expr)
|
466 |
| - userUUID = "Unknown" |
| 486 | + |
| 487 | + exprUUID = '//%s/%s' % (adept('credentials'), adept('user')) |
| 488 | + keyName = "" |
467 | 489 | try:
|
468 |
| - userUUID = tree.findtext(exprUUID) |
| 490 | + keyName = tree.findtext(exprUUID)[9:] + "_" |
469 | 491 | except:
|
470 | 492 | pass
|
| 493 | + |
| 494 | + try: |
| 495 | + exprMail = '//%s/%s' % (adept('credentials'), adept('username')) |
| 496 | + keyName = keyName + tree.find(exprMail).attrib["method"] + "_" |
| 497 | + keyName = keyName + tree.findtext(exprMail) + "_" |
| 498 | + except: |
| 499 | + pass |
| 500 | + |
| 501 | + if keyName == "": |
| 502 | + keyName = "Unknown" |
| 503 | + else: |
| 504 | + keyName = keyName[:-1] |
| 505 | + |
| 506 | + |
| 507 | + |
471 | 508 | userkey = b64decode(userkey)
|
472 | 509 | userkey = userkey[26:]
|
473 |
| - return [userkey], [userUUID[9:]] |
| 510 | + return [userkey], [keyName] |
474 | 511 |
|
475 | 512 | else:
|
476 | 513 | def adeptkeys():
|
|
0 commit comments