def pair(self): self.DevicePublicKey = self.getValue("", "DevicePublicKey") if self.DevicePublicKey == '': print "Unable to retreive DevicePublicKey" return False print "Creating host key & certificate" certPem, privateKeyPem, DeviceCertificate = ca_do_everything(self.DevicePublicKey) pair_record = {"DevicePublicKey": plistlib.Data(self.DevicePublicKey), "DeviceCertificate": plistlib.Data(DeviceCertificate), "HostCertificate": plistlib.Data(certPem), "HostID": self.hostID, "RootCertificate": plistlib.Data(certPem), "SystemBUID": "30142955-444094379208051516" } pair = {"Label": self.label, "Request": "Pair", "PairRecord": pair_record} self.c.sendPlist(pair) pair = self.c.recvPlist() if pair and pair.get("Result") == "Success" or pair.has_key("EscrowBag"): pair_record["HostPrivateKey"] = plistlib.Data(privateKeyPem) pair_record["EscrowBag"] = pair.get("EscrowBag") writeHomeFile(HOMEFOLDER, "%s.plist" % self.identifier, plistlib.writePlistToString(pair_record)) self.paired = True return True elif pair and pair.get("Error") == "PasswordProtected": self.c.close() raise NotTrustedError else: print pair.get("Error") self.c.close() raise PairingError
def validate_pairing(self): pair_record = None certPem = None privateKeyPem = None if sys.platform == "win32": folder = os.environ["ALLUSERSPROFILE"] + "/Apple/Lockdown/" elif sys.platform == "darwin": folder = "/var/db/lockdown/" elif len(sys.platform) >= 5: if sys.platform[0:5] == "linux": folder = "/var/lib/lockdown/" try: pair_record = plistlib.readPlist(folder + "%s.plist" % self.identifier) except: pair_record = None if pair_record: print "Using iTunes pair record: %s.plist" % self.identifier certPem = pair_record["HostCertificate"].data privateKeyPem = pair_record["HostPrivateKey"].data else: print "No iTunes pairing record found for device %s" % self.identifier print "Looking for pymobiledevice pairing record" record = readHomeFile(HOMEFOLDER, "%s.plist" % self.identifier) if record: pair_record = plistlib.readPlistFromString(record) print "Found pymobiledevice pairing record for device %s" % self.udid certPem = pair_record["HostCertificate"].data privateKeyPem = pair_record["HostPrivateKey"].data else: print "No pymobiledevice pairing record found for device %s" % self.identifier return False self.record = pair_record if int(self.ios_version.split('.')[0]) < 11: ValidatePair = {"Label": self.label, "Request": "ValidatePair", "PairRecord": pair_record} self.c.sendPlist(ValidatePair) r = self.c.recvPlist() if not r or r.has_key("Error"): pair_record = None print "ValidatePair fail", ValidatePair return False self.hostID = pair_record.get("HostID", self.hostID) self.SystemBUID = pair_record.get("SystemBUID", self.SystemBUID) d = {"Label": self.label, "Request": "StartSession", "HostID": self.hostID, 'SystemBUID': self.SystemBUID} self.c.sendPlist(d) startsession = self.c.recvPlist() self.SessionID = startsession.get("SessionID") if startsession.get("EnableSessionSSL"): sslfile = self.identifier + "_ssl.txt" sslfile = writeHomeFile(HOMEFOLDER, sslfile, certPem + "\n" + privateKeyPem) self.c.ssl_start(sslfile, sslfile) self.paired = True return True
def validate_pairing(self): pair_record = None certPem = None privateKeyPem = None if sys.platform == "win32": folder = os.environ["ALLUSERSPROFILE"] + "/Apple/Lockdown/" elif sys.platform == "darwin": folder = "/var/db/lockdown/" elif len(sys.platform) >= 5: if sys.platform[0:5] == "linux": folder = "/var/lib/lockdown/" try: pair_record = plistlib.readPlist(folder + "%s.plist" % self.identifier) except: pair_record = None if pair_record: print "Using iTunes pair record: %s.plist" % self.identifier certPem = pair_record["HostCertificate"].data privateKeyPem = pair_record["HostPrivateKey"].data else: print "No iTunes pairing record found for device %s" % self.identifier print "Looking for pymobiledevice pairing record" record = readHomeFile(HOMEFOLDER, "%s.plist" % self.identifier) if record: pair_record = plistlib.readPlistFromString(record) print "Found pymobiledevice pairing record for device %s" % self.udid certPem = pair_record["HostCertificate"].data privateKeyPem = pair_record["HostPrivateKey"].data else: print "No pymobiledevice pairing record found for device %s" % self.identifier return False self.record = pair_record ValidatePair = {"Label": self.label, "Request": "ValidatePair", "PairRecord": pair_record} self.c = PlistService(62078,self.udid) self.c.sendPlist(ValidatePair) r = self.c.recvPlist() if not r or r.has_key("Error"): pair_record = None print "ValidatePair fail", ValidatePair return False self.hostID = pair_record.get("HostID", self.hostID) self.SystemBUID = pair_record.get("SystemBUID", self.SystemBUID) d = {"Label": self.label, "Request": "StartSession", "HostID": self.hostID, 'SystemBUID': self.SystemBUID} self.c.sendPlist(d) startsession = self.c.recvPlist() self.SessionID = startsession.get("SessionID") if startsession.get("EnableSessionSSL"): sslfile = self.identifier + "_ssl.txt" sslfile = writeHomeFile(HOMEFOLDER, sslfile, certPem + "\n" + privateKeyPem) self.c.ssl_start(sslfile, sslfile) self.paired = True return True
def pair(self): self.DevicePublicKey = self.getValue("", "DevicePublicKey") if self.DevicePublicKey == '': print("Unable to retreive DevicePublicKey") return False print("Creating host key & certificate") certPem, privateKeyPem, DeviceCertificate = ca_do_everything( self.DevicePublicKey) pair_record = {"DevicePublicKey": plistlib.Data(self.DevicePublicKey), "DeviceCertificate": plistlib.Data(DeviceCertificate), "HostCertificate": plistlib.Data(certPem), "HostID": self.hostID, "RootCertificate": plistlib.Data(certPem), "SystemBUID": "30142955-444094379208051516"} pair = {"Label": self.label, "Request": "Pair", "PairRecord": pair_record} self.c = PlistService(62078, self.udid) self.c.sendPlist(pair) pair = self.c.recvPlist() if pair and pair.get("Result") == "Success" or "EscrowBag" in pair: pair_record["HostPrivateKey"] = plistlib.Data(privateKeyPem) pair_record["EscrowBag"] = pair.get("EscrowBag") writeHomeFile(HOMEFOLDER, "%s.plist" % self.identifier, plistlib.dumps(pair_record)) self.paired = True return True elif pair and pair.get("Error") == "PasswordProtected": self.c.close() raise NotTrustedError else: print(pair.get("Error")) self.c.close() raise PairingError
def validate_pairing(self): pair_record = None certPem = None privateKeyPem = None pair_record = self.get_pair_record() if PY3: certPem = pair_record["HostCertificate"] privateKeyPem = pair_record["HostPrivateKey"] else: certPem = pair_record["HostCertificate"].data privateKeyPem = pair_record["HostPrivateKey"].data if int(self.ios_version.split('.')[0]) < 11: ValidatePair = { "Label": self.label, "Request": "ValidatePair", "PairRecord": pair_record } self.c.sendPlist(ValidatePair) r = self.c.recvPlist() if not r or "Error" in r: pair_record = None self.logger.error("ValidatePair fail: %s", ValidatePair) return False self.hostID = pair_record.get("HostID", self.hostID) self.SystemBUID = pair_record.get("SystemBUID", self.SystemBUID) d = { "Label": self.label, "Request": "StartSession", "HostID": self.hostID, 'SystemBUID': self.SystemBUID } self.c.sendPlist(d) startsession = self.c.recvPlist() self.SessionID = startsession.get("SessionID") if startsession.get("EnableSessionSSL"): sslfile = self.identifier + "_ssl.txt" lf = "\n" if PY3: lf = b"\n" sslfile = writeHomeFile(HOMEFOLDER, sslfile, certPem + lf + privateKeyPem) self.c.ssl_start(sslfile, sslfile) self.paired = True return True
def validate_pairing(self): pair_record = None certPem = None privateKeyPem = None pair_record = self.get_pair_record() if PY3: certPem = pair_record["HostCertificate"] privateKeyPem = pair_record["HostPrivateKey"] else: certPem = pair_record["HostCertificate"].data privateKeyPem = pair_record["HostPrivateKey"].data if int(self.ios_version.split('.')[0]) < 11: ValidatePair = {"Label": self.label, "Request": "ValidatePair", "PairRecord": pair_record} self.c.sendPlist(ValidatePair) r = self.c.recvPlist() if not r or r.has_key("Error"): pair_record = None self.logger.error("ValidatePair fail: %s", ValidatePair) return False self.hostID = pair_record.get("HostID", self.hostID) self.SystemBUID = pair_record.get("SystemBUID", self.SystemBUID) d = {"Label": self.label, "Request": "StartSession", "HostID": self.hostID, 'SystemBUID': self.SystemBUID} self.c.sendPlist(d) startsession = self.c.recvPlist() self.SessionID = startsession.get("SessionID") if startsession.get("EnableSessionSSL"): sslfile = self.identifier + "_ssl.txt" lf = "\n" if PY3: lf = b"\n" sslfile = writeHomeFile(HOMEFOLDER, sslfile, certPem + lf + privateKeyPem) self.c.ssl_start(sslfile, sslfile) self.paired = True return True
if (not escrowBag): escrowBag = self.record['EscrowBag'] self.c.sendPlist({ "Label": self.label, "Request": "StartService", "Service": name, 'EscrowBag': escrowBag }) StartService = self.c.recvPlist() if not StartService or StartService.get("Error"): if StartService.get("Error", "") == 'PasswordProtected': raise StartServiceError( 'your device is protected with password, please enter password in device and try again' ) raise StartServiceError(StartService.get("Error")) return PlistService(StartService.get("Port"), self.udid) if __name__ == "__main__": logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) l = LockdownClient() if l: n = writeHomeFile(HOMEFOLDER, "%s_infos.plist" % l.udid, plistlib.writePlistToString(l.allValues)) logger.info("Wrote infos to %s", n) else: logger.error("Unable to connect to device")
def validate_pairing(self): pair_record = None certPem = None privateKeyPem = None if sys.platform == "win32": folder = os.environ["ALLUSERSPROFILE"] + "/Apple/Lockdown/" elif sys.platform == "darwin": folder = "/var/db/lockdown/" elif len(sys.platform) >= 5: if sys.platform[0:5] == "linux": folder = "/var/lib/lockdown/" try: pair_record = plistlib.readPlist(folder + "%s.plist" % self.identifier) except: pair_record = None if pair_record: print("Using iTunes pair record: %s.plist" % self.identifier) certPem = pair_record["HostCertificate"].data privateKeyPem = pair_record["HostPrivateKey"].data else: # LucaV 05.09.2018: se la data del file non corrisponde alla data odierna, richiede il pairing device_data_file = os.path.join(os.path.expanduser('~'), HOMEFOLDER, "%s.plist" % self.identifier) if os.path.isfile(device_data_file): from datetime import datetime, timedelta file_date = datetime.fromtimestamp( os.path.getmtime(device_data_file)) file_date = file_date.replace(hour=0, minute=0, second=0, microsecond=0) today = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) if today - file_date > timedelta(days=1): try: os.remove(device_data_file) except: pass print("No iTunes pairing record found for device %s" % self.identifier) print("Looking for pymobiledevice pairing record") record = readHomeFile(HOMEFOLDER, "%s.plist" % self.identifier) if record: # pair_record = plistlib.loads(record) pair_record = plistlib.readPlistFromBytes(record) print("Found pymobiledevice pairing record for device %s" % self.udid) certPem = pair_record["HostCertificate"].data privateKeyPem = pair_record["HostPrivateKey"].data else: print("No pymobiledevice pairing record found for device %s" % self.identifier) return False self.record = pair_record try: ios_major_version = int(self.ios_version.split('.')[0]) except: print("Unable to parse ProductVersion string: %s" % self.ios_version) ios_major_version = 0 if ios_major_version < 11: ValidatePair = { "Label": self.label, "Request": "ValidatePair", "PairRecord": pair_record } self.c.sendPlist(ValidatePair) r = self.c.recvPlist() if not r or "Error" in r: pair_record = None print("ValidatePair fail", ValidatePair) return False self.hostID = pair_record.get("HostID", self.hostID) self.SystemBUID = pair_record.get("SystemBUID", self.SystemBUID) d = { "Label": self.label, "Request": "StartSession", "HostID": self.hostID, 'SystemBUID': self.SystemBUID } self.c.sendPlist(d) startsession = self.c.recvPlist() self.SessionID = startsession.get("SessionID") if startsession.get("EnableSessionSSL"): sslfile = self.identifier + "_ssl.txt" sslfile = writeHomeFile(HOMEFOLDER, sslfile, certPem + b"\n" + privateKeyPem) self.c.ssl_start(sslfile, sslfile) self.paired = True return True
print("NotPaired") raise NotPairedError if (not escrowBag): escrowBag = self.record['EscrowBag'] self.c.sendPlist({ "Label": self.label, "Request": "StartService", "Service": name, 'EscrowBag': escrowBag }) StartService = self.c.recvPlist() if not StartService or StartService.get("Error"): if StartService.get("Error", "") == 'PasswordProtected': raise StartServiceError( 'your device is protected with password, please enter password in device and try again' ) raise StartServiceError(StartService.get("Error")) return PlistService(StartService.get("Port"), self.udid) if __name__ == "__main__": l = LockdownClient() if l: n = writeHomeFile(HOMEFOLDER, "%s_infos.plist" % l.udid, plistlib.dumps(l.allValues)) print("Wrote infos to %s" % n) else: print("Unable to connect to device")
StartService = self.c.recvPlist() if not StartService or StartService.get("Error"): raise StartServiceError(StartService.get("Error")) return PlistService(StartService.get("Port"), self.udid) def startServiceWithEscrowBag(self, name, escrowBag=None): if not self.paired: print("NotPaired") raise NotPairedError if (not escrowBag): escrowBag = self.record['EscrowBag'] self.c.sendPlist({ "Label": self.label, "Request": "StartService", "Service": name, 'EscrowBag': plistlib.Data(escrowBag)}) StartService = self.c.recvPlist() if not StartService or StartService.get("Error"): raise StartServiceError(StartService.get("Error")) return PlistService(StartService.get("Port"), self.udid) if __name__ == "__main__": l = LockdownClient() if l: n = writeHomeFile(HOMEFOLDER, "%s_infos.plist" % l.udid, plistlib.dumps(l.allValues)) print("Wrote infos to %s" % n) else: print("Unable to connect to device")
return PlistService(StartService.get("Port"), self.udid) def startServiceWithEscrowBag(self, name, escrowBag = None): if not self.paired: self.logger.info("NotPaired") raise NotPairedError if (not escrowBag): escrowBag = self.record['EscrowBag'] self.c.sendPlist({"Label": self.label, "Request": "StartService", "Service": name, 'EscrowBag':escrowBag}) StartService = self.c.recvPlist() if not StartService or StartService.get("Error"): if StartService.get("Error", "") == 'PasswordProtected': raise StartServiceError('your device is protected with password, please enter password in device and try again') raise StartServiceError(StartService.get("Error")) return PlistService(StartService.get("Port"), self.udid) if __name__ == "__main__": logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) l = LockdownClient() if l: n = writeHomeFile(HOMEFOLDER, "%s_infos.plist" % l.udid, plistlib.writePlistToString(l.allValues)) logger.info("Wrote infos to %s",n) else: logger.error("Unable to connect to device")
def get_itunes_record_path(self): folder = None if sys.platform == "win32": folder = os.environ["ALLUSERSPROFILE"] + "/Apple/Lockdown/" elif sys.platform == "darwin": folder = "/var/db/lockdown/" elif len(sys.platform) >= 5: if sys.platform[0:5] == "linux": folder = "/var/lib/lockdown/" try: pair_record = plistlib.readPlist(folder + "%s.plist" % self.identifier) print("Using iTunes pair record: %s.plist" % self.identifier) except: print("No iTunes pairing record found for device %s" % self.identifier) if self.compare_ios_version("13.0") >= 0: print("Getting pair record from usbmuxd") client = usbmux.UsbmuxdClient() pair_record = client.get_pair_record(self.udid) else: print("Looking for pymobiledevice pairing record") record = readHomeFile(HOMEFOLDER, "%s.plist" % self.identifier) if record: pair_record = plistlib.readPlistFromString(record) print("Found pymobiledevice pairing record for device %s" % self.udid) else: print( "No pymobiledevice pairing record found for device %s" % self.identifier) return False self.record = pair_record if PY3: certPem = pair_record["HostCertificate"] privateKeyPem = pair_record["HostPrivateKey"] else: certPem = pair_record["HostCertificate"].data privateKeyPem = pair_record["HostPrivateKey"].data if self.compare_ios_version("11.0") < 0: ValidatePair = { "Label": self.label, "Request": "ValidatePair", "PairRecord": pair_record } self.c.sendPlist(ValidatePair) r = self.c.recvPlist() if not r or "Error" in r: pair_record = None self.logger.error("ValidatePair fail: %s", ValidatePair) return False self.hostID = pair_record.get("HostID", self.hostID) self.SystemBUID = pair_record.get("SystemBUID", self.SystemBUID) d = { "Label": self.label, "Request": "StartSession", "HostID": self.hostID, 'SystemBUID': self.SystemBUID } self.c.sendPlist(d) startsession = self.c.recvPlist() self.SessionID = startsession.get("SessionID") if startsession.get("EnableSessionSSL"): self.sslfile = self.identifier + "_ssl.txt" lf = "\n" if PY3: lf = b"\n" self.sslfile = writeHomeFile(HOMEFOLDER, self.sslfile, certPem + lf + privateKeyPem) self.c.ssl_start(self.sslfile, self.sslfile) self.paired = True return True