#!/usr/bin/env python
# -*- coding: utf-8 -*-
-from __future__ import with_statement
-
# adobekey.pyw, version 6.0
# Copyright © 2009-2010 i♥cabbages
# 6.0 - Work if TkInter is missing
# 7.0 - Python 3 compatible for calibre 5
-from __future__ import print_function
-
"""
Retrieve Adobe ADEPT user key.
"""
__version__ = '7.0'
import sys, os, struct, getopt
+from base64 import b64decode
+
# Wrap a stream so that output gets flushed immediately
# and also make sure that any unicode strings get
if self.encoding == None:
self.encoding = "utf-8"
def write(self, data):
- if isinstance(data,unicode):
+ if isinstance(data, str):
data = data.encode(self.encoding,"replace")
- self.stream.write(data)
- self.stream.flush()
+ self.stream.buffer.write(data)
+ self.stream.buffer.flush()
+
def __getattr__(self, attr):
return getattr(self.stream, attr)
# Remove Python executable and commands if present
start = argc.value - len(sys.argv)
return [argv[i] for i in
- xrange(start, argc.value)]
+ range(start, argc.value)]
# if we don't have any arguments at all, just pass back script name
# this should never happen
return [u"adobekey.py"]
else:
- argvencoding = sys.stdin.encoding
- if argvencoding == None:
- argvencoding = "utf-8"
- return arg
+ argvencoding = sys.stdin.encoding or "utf-8"
+ return [arg if isinstance(arg, str) else str(arg, argvencoding) for arg in sys.argv]
class ADEPTError(Exception):
pass
c_long, c_ulong
from ctypes.wintypes import LPVOID, DWORD, BOOL
- import _winreg as winreg
+ import winreg
def _load_crypto_libcrypto():
from ctypes.util import find_library
raise ADEPTError('Failed to initialize AES key')
def decrypt(self, data):
out = create_string_buffer(len(data))
- iv = ("\x00" * self._blocksize)
+ iv = (b"\x00" * self._blocksize)
rv = AES_cbc_encrypt(data, out, len(data), self._key, iv, 0)
if rv == 0:
raise ADEPTError('AES decryption failed')
from Crypto.Cipher import AES as _AES
class AES(object):
def __init__(self, key):
- self._aes = _AES.new(key, _AES.MODE_CBC, '\x00'*16)
+ self._aes = _AES.new(key, _AES.MODE_CBC, b'\x00'*16)
def decrypt(self, data):
return self._aes.decrypt(data)
return AES
if struct.calcsize("P") == 4:
CPUID0_INSNS = (
- "\x53" # push %ebx
- "\x31\xc0" # xor %eax,%eax
- "\x0f\xa2" # cpuid
- "\x8b\x44\x24\x08" # mov 0x8(%esp),%eax
- "\x89\x18" # mov %ebx,0x0(%eax)
- "\x89\x50\x04" # mov %edx,0x4(%eax)
- "\x89\x48\x08" # mov %ecx,0x8(%eax)
- "\x5b" # pop %ebx
- "\xc3" # ret
+ b"\x53" # push %ebx
+ b"\x31\xc0" # xor %eax,%eax
+ b"\x0f\xa2" # cpuid
+ b"\x8b\x44\x24\x08" # mov 0x8(%esp),%eax
+ b"\x89\x18" # mov %ebx,0x0(%eax)
+ b"\x89\x50\x04" # mov %edx,0x4(%eax)
+ b"\x89\x48\x08" # mov %ecx,0x8(%eax)
+ b"\x5b" # pop %ebx
+ b"\xc3" # ret
)
CPUID1_INSNS = (
- "\x53" # push %ebx
- "\x31\xc0" # xor %eax,%eax
- "\x40" # inc %eax
- "\x0f\xa2" # cpuid
- "\x5b" # pop %ebx
- "\xc3" # ret
+ b"\x53" # push %ebx
+ b"\x31\xc0" # xor %eax,%eax
+ b"\x40" # inc %eax
+ b"\x0f\xa2" # cpuid
+ b"\x5b" # pop %ebx
+ b"\xc3" # ret
)
else:
CPUID0_INSNS = (
- "\x49\x89\xd8" # mov %rbx,%r8
- "\x49\x89\xc9" # mov %rcx,%r9
- "\x48\x31\xc0" # xor %rax,%rax
- "\x0f\xa2" # cpuid
- "\x4c\x89\xc8" # mov %r9,%rax
- "\x89\x18" # mov %ebx,0x0(%rax)
- "\x89\x50\x04" # mov %edx,0x4(%rax)
- "\x89\x48\x08" # mov %ecx,0x8(%rax)
- "\x4c\x89\xc3" # mov %r8,%rbx
- "\xc3" # retq
+ b"\x49\x89\xd8" # mov %rbx,%r8
+ b"\x49\x89\xc9" # mov %rcx,%r9
+ b"\x48\x31\xc0" # xor %rax,%rax
+ b"\x0f\xa2" # cpuid
+ b"\x4c\x89\xc8" # mov %r9,%rax
+ b"\x89\x18" # mov %ebx,0x0(%rax)
+ b"\x89\x50\x04" # mov %edx,0x4(%rax)
+ b"\x89\x48\x08" # mov %ecx,0x8(%rax)
+ b"\x4c\x89\xc3" # mov %r8,%rbx
+ b"\xc3" # retq
)
CPUID1_INSNS = (
- "\x53" # push %rbx
- "\x48\x31\xc0" # xor %rax,%rax
- "\x48\xff\xc0" # inc %rax
- "\x0f\xa2" # cpuid
- "\x5b" # pop %rbx
- "\xc3" # retq
+ b"\x53" # push %rbx
+ b"\x48\x31\xc0" # xor %rax,%rax
+ b"\x48\xff\xc0" # inc %rax
+ b"\x0f\xa2" # cpuid
+ b"\x5b" # pop %rbx
+ b"\xc3" # retq
)
def cpuid0():
plkroot = winreg.OpenKey(cuser, PRIVATE_LICENCE_KEY_PATH)
except WindowsError:
raise ADEPTError("Could not locate ADE activation")
- for i in xrange(0, 16):
+ for i in range(0, 16):
try:
plkparent = winreg.OpenKey(plkroot, "%04d" % (i,))
except WindowsError:
ktype = winreg.QueryValueEx(plkparent, None)[0]
if ktype != 'credentials':
continue
- for j in xrange(0, 16):
+ for j in range(0, 16):
try:
plkkey = winreg.OpenKey(plkparent, "%04d" % (j,))
except WindowsError:
if ktype != 'privateLicenseKey':
continue
userkey = winreg.QueryValueEx(plkkey, 'value')[0]
- userkey = userkey.decode('base64')
+ userkey = b64decode(userkey)
aes = AES(keykey)
userkey = aes.decrypt(userkey)
- userkey = userkey[26:-ord(userkey[-1])]
+ userkey = userkey[26:-ord(userkey[-1:])]
#print "found key:",userkey.encode('hex')
keys.append(userkey)
if len(keys) == 0:
reslst = out1.split('\n')
cnt = len(reslst)
ActDatPath = "activation.dat"
- for j in xrange(cnt):
+ for j in range(cnt):
resline = reslst[j]
pp = resline.find('activation.dat')
if pp >= 0:
adept = lambda tag: '{%s}%s' % (NSMAP['adept'], tag)
expr = '//%s/%s' % (adept('credentials'), adept('privateLicenseKey'))
userkey = tree.findtext(expr)
- userkey = userkey.decode('base64')
+ userkey = b64decode(userkey)
userkey = userkey[26:]
return [userkey]
if len(keys) > 0:
if not os.path.isdir(outpath):
outfile = outpath
- with file(outfile, 'wb') as keyfileout:
+ with open(outfile, 'wb') as keyfileout:
keyfileout.write(keys[0])
print(u"Saved a key to {0}".format(outfile))
else:
outfile = os.path.join(outpath,u"adobekey_{0:d}.der".format(keycount))
if not os.path.exists(outfile):
break
- with file(outfile, 'wb') as keyfileout:
+ with open(outfile, 'wb') as keyfileout:
keyfileout.write(key)
print(u"Saved a key to {0}".format(outfile))
return True
if len(args) == 1:
# save to the specified file or directory
- outpath = args[0]
- if not os.path.isabs(outpath):
- outpath = os.path.abspath(outpath)
+ outpath = os.path.abspath(args[0])
else:
# save to the same directory as the script
outpath = os.path.dirname(argv[0])
if len(keys) > 0:
if not os.path.isdir(outpath):
outfile = outpath
- with file(outfile, 'wb') as keyfileout:
+ with open(outfile, 'wb') as keyfileout:
keyfileout.write(keys[0])
print(u"Saved a key to {0}".format(outfile))
else:
outfile = os.path.join(outpath,u"adobekey_{0:d}.der".format(keycount))
if not os.path.exists(outfile):
break
- with file(outfile, 'wb') as keyfileout:
+ with open(outfile, 'wb') as keyfileout:
keyfileout.write(key)
print(u"Saved a key to {0}".format(outfile))
else:
def gui_main():
try:
- import Tkinter
- import Tkconstants
- import tkMessageBox
+ import tkinter
+ import tkinter.constants
+ import tkinter.messagebox
import traceback
except:
return cli_main()
- class ExceptionDialog(Tkinter.Frame):
+ class ExceptionDialog(tkinter.Frame):
def __init__(self, root, text):
- Tkinter.Frame.__init__(self, root, border=5)
- label = Tkinter.Label(self, text=u"Unexpected error:",
- anchor=Tkconstants.W, justify=Tkconstants.LEFT)
- label.pack(fill=Tkconstants.X, expand=0)
- self.text = Tkinter.Text(self)
- self.text.pack(fill=Tkconstants.BOTH, expand=1)
+ tkinter.Frame.__init__(self, root, border=5)
+ label = tkinter.Label(self, text=u"Unexpected error:",
+ anchor=tkinter.constants.W, justify=tkinter.constants.LEFT)
+ label.pack(fill=tkinter.constants.X, expand=0)
+ self.text = tkinter.Text(self)
+ self.text.pack(fill=tkinter.constants.BOTH, expand=1)
- self.text.insert(Tkconstants.END, text)
+ self.text.insert(tkinter.constants.END, text)
argv=unicode_argv()
- root = Tkinter.Tk()
+ root = tkinter.Tk()
root.withdraw()
progpath, progname = os.path.split(argv[0])
success = False
if not os.path.exists(outfile):
break
- with file(outfile, 'wb') as keyfileout:
+ with open(outfile, 'wb') as keyfileout:
keyfileout.write(key)
success = True
- tkMessageBox.showinfo(progname, u"Key successfully retrieved to {0}".format(outfile))
+ tkinter.messagebox.showinfo(progname, u"Key successfully retrieved to {0}".format(outfile))
except ADEPTError as e:
- tkMessageBox.showerror(progname, u"Error: {0}".format(str(e)))
+ tkinter.messagebox.showerror(progname, u"Error: {0}".format(str(e)))
except Exception:
root.wm_state('normal')
root.title(progname)
text = traceback.format_exc()
- ExceptionDialog(root, text).pack(fill=Tkconstants.BOTH, expand=1)
+ ExceptionDialog(root, text).pack(fill=tkinter.constants.BOTH, expand=1)
root.mainloop()
if not success:
return 1