|
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