├── .gitattributes ├── .gitignore ├── README.md ├── SaveMe-Dumper ├── SaveMe-Dumper.py ├── img4tool_192_iphoneos-arm.deb ├── libgeneral_31_iphoneos-arm.deb ├── libimg4tool0_192_iphoneos-arm.deb ├── libplist3_2.2.0_iphoneos-arm.deb ├── libssl1.1_1.1.1g_iphoneos-arm.deb └── requirements.txt ├── macOS ├── .spec ├── README.md ├── SaveMe-Devices ├── SaveMe.py ├── SaveMe.spec ├── SaveMeCompileCommand.md ├── Screenshots │ ├── Screenshot 2020-06-13 at 12.20.21.png │ ├── Screenshot 2020-06-13 at 12.42.03.png │ └── Screenshot 2020-06-13 at 12.42.29.png └── dist │ └── SaveMe └── windows ├── SaveMe.py └── SupportFiles ├── SaveMe-Devices ├── idevice_id.exe ├── idevicebackup2.exe ├── idevicecrashreport.exe ├── idevicedate.exe ├── idevicedebug.exe ├── idevicedebugserverproxy.exe ├── idevicediagnostics.exe ├── ideviceenterrecovery.exe ├── ideviceimagemounter.exe ├── ideviceinfo.exe ├── ideviceinstaller.exe ├── idevicename.exe ├── idevicenotificationproxy.exe ├── idevicepair.exe ├── ideviceprovision.exe ├── idevicerestore.exe ├── idevicescreenshot.exe ├── idevicesyslog.exe ├── img4tool_192_iphoneos-arm.deb ├── ios_webkit_debug_proxy.exe ├── iproxy.exe ├── irecovery.exe ├── libgeneral_31_iphoneos-arm.deb ├── libimg4tool0_192_iphoneos-arm.deb ├── libplist3_2.2.0_iphoneos-arm.deb ├── libssl1.1_1.1.1g_iphoneos-arm.deb ├── plist_cmp.exe ├── plist_test.exe ├── tsschecker.exe └── usbmuxd.exe /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | igetnonce 3 | tsschecker 4 | build/SaveMe/xref-SaveMe.html 5 | build/SaveMe/warn-SaveMe.txt 6 | build/SaveMe/PYZ-00.toc 7 | build/SaveMe/PYZ-00.pyz 8 | build/SaveMe/PKG-00.toc 9 | build/SaveMe/PKG-00.pkg 10 | build/SaveMe/EXE-00.toc 11 | build/SaveMe/base_library.zip 12 | build/SaveMe/Analysis-00.toc 13 | __pycache__/SaveMe.cpython-37.pyc 14 | .DS_Store 15 | *.dll 16 | macOS/build/SaveMe/xref-SaveMe.html 17 | macOS/build/SaveMe/warn-SaveMe.txt 18 | macOS/build/SaveMe/PYZ-00.toc 19 | macOS/build/SaveMe/PYZ-00.pyz 20 | macOS/build/SaveMe/PKG-00.toc 21 | macOS/build/SaveMe/PKG-00.pkg 22 | macOS/build/SaveMe/EXE-00.toc 23 | macOS/build/SaveMe/base_library.zip 24 | macOS/build/SaveMe/Analysis-00.toc 25 | macOS/__pycache__/SaveMe.cpython-37.pyc 26 | v1.0/__pycache__/SaveMe.cpython-37.pyc 27 | v1.0/build/SaveMe/Analysis-00.toc 28 | v1.0/build/SaveMe/base_library.zip 29 | v1.0/build/SaveMe/EXE-00.toc 30 | v1.0/build/SaveMe/PKG-00.pkg 31 | v1.0/build/SaveMe/PKG-00.toc 32 | v1.0/build/SaveMe/PYZ-00.pyz 33 | v1.0/build/SaveMe/PYZ-00.toc 34 | v1.0/build/SaveMe/warn-SaveMe.txt 35 | v1.0/build/SaveMe/xref-SaveMe.html 36 | v1.0/__pycache__/SaveMe.cpython-36.pyc 37 | *.pyc -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Windows version now includes latest tsschecker with A14 support from here: https://github.com/DanTheMann15/tsschecker/releases 2 | macOS version is still outdated at the time of writing. 3 | 4 | UPDATE v1.3 (Windows) - SaveMe The Easiest SHSH saver for macOS and Windows! 5 | 6 | - New Features 7 | 1. Fetches device info and saves it to a cached device list 8 | 2. Set version to save ticket for saving 9 | 3. Allows setting path for saving tickets too 10 | 4. Print Cached Devices 11 | 5. Print currently signed firmwares 12 | 6. Specify a generator, must be already set on device! (expects unc0ver's 0x1111111111111111) 13 | 7. Save currently signed firmwares from cached device list! (device does not need to be connected) 14 | 8. Dump ticket from iOS device (requires device to be jailbroken) 15 | 16 | - Planned Features 17 | 1. Print currently signed BETA iOS versions 18 | 2. Add ticket checking with imgtool4 19 | 3. Add FutureRestore support automating restoring if device is connected and SHSH2 file exists! 20 | 4. IPSW downloader for device when connected (and arg set) 21 | 5. Downloading of SEP and BBFW (if needed) for FutureRestore restores 22 | 23 | - Tested 24 | 1. iPhone11,2 25 | 2. iPad7,3 26 | 3. AppleTV 4K 27 | 28 | - Video Demo 29 | link (https://www.youtube.com/watch?v=RZzXPi1cncE) 30 | 31 | - Screenshots 32 | 33 | - Compiled win64 bins https://github.com/kasiimh1/libimobiledevice-vs/releases/tag/v0.1 34 | 35 | 1. (https://github.com/kasiimh1/SaveMe/blob/master/macOS/Screenshots/Screenshot%202020-06-13%20at%2012.20.21.png) 36 | 2. (https://github.com/kasiimh1/SaveMe/blob/master/macOS/Screenshots/Screenshot%202020-06-13%20at%2012.42.03.png) 37 | 3. (https://github.com/kasiimh1/SaveMe/blob/master/macOS/Screenshots/Screenshot%202020-06-13%20at%2012.42.29.png) 38 | 39 | Uses the following tools 40 | - libimobiledevice - ideviceenterrecovery, ideviceinfo, irecovery https://github.com/libimobiledevice https://github.com/libimobiledevice-win32/libimobiledevice-vs 41 | - tsschecker https://github.com/tihmstar/tsschecker (macOS) and https://github.com/DanTheMann15/tsschecker/releases (Windows) 42 | -------------------------------------------------------------------------------- /SaveMe-Dumper/SaveMe-Dumper.py: -------------------------------------------------------------------------------- 1 | import paramiko, os, getpass 2 | 3 | ssh = paramiko.SSHClient() 4 | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 5 | ip = input("Enter Devices IP: ") 6 | password = getpass.getpass("root@" + ip + "'s password: ") 7 | 8 | ssh.connect(ip, port=22, username='root', password = password) 9 | print("Installing Dependancies") 10 | os.system("scp img4tool_192_iphoneos-arm.deb root@"+ ip + ":img4tool_192_iphoneos-arm.deb") 11 | os.system("scp libssl1.1_1.1.1g_iphoneos-arm.deb root@"+ ip + ":libssl1.1_1.1.1g_iphoneos-arm.deb") 12 | os.system("scp libgeneral_31_iphoneos-arm.deb root@"+ ip + ":libgeneral_31_iphoneos-arm.deb") 13 | os.system("scp libimg4tool0_192_iphoneos-arm.deb root@"+ ip + ":libimg4tool0_192_iphoneos-arm.deb") 14 | os.system("scp libplist3_2.2.0_iphoneos-arm.deb root@"+ ip + ":libplist3_2.2.0_iphoneos-arm.deb") 15 | os.system("ssh root@"+ ip + " dpkg -i libplist3_2.2.0_iphoneos-arm.deb") 16 | os.system("ssh root@"+ ip + " dpkg -i libssl1.1_1.1.1g_iphoneos-arm.deb") 17 | os.system("ssh root@"+ ip + " dpkg -i libgeneral_31_iphoneos-arm.deb") 18 | os.system("ssh root@"+ ip + " dpkg -i libimg4tool0_192_iphoneos-arm.deb") 19 | os.system("ssh root@"+ ip + " dpkg -i img4tool_192_iphoneos-arm.deb") 20 | print("Dumping Ticket from iOS FileSystem") 21 | stdin, stdout, stderr = ssh.exec_command("cat /dev/rdisk1 | dd of=dump.raw bs=256 count=$((0x4000)) &> /dev/null") 22 | print("Converting Dump to Ticket") 23 | os.system("ssh root@"+ ip + " img4tool --convert -s dumped.shsh dump.raw") 24 | print("Copying Dump to machine") 25 | os.system("scp root@"+ ip + ":dumped.shsh dumped.shsh") 26 | -------------------------------------------------------------------------------- /SaveMe-Dumper/img4tool_192_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/SaveMe-Dumper/img4tool_192_iphoneos-arm.deb -------------------------------------------------------------------------------- /SaveMe-Dumper/libgeneral_31_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/SaveMe-Dumper/libgeneral_31_iphoneos-arm.deb -------------------------------------------------------------------------------- /SaveMe-Dumper/libimg4tool0_192_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/SaveMe-Dumper/libimg4tool0_192_iphoneos-arm.deb -------------------------------------------------------------------------------- /SaveMe-Dumper/libplist3_2.2.0_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/SaveMe-Dumper/libplist3_2.2.0_iphoneos-arm.deb -------------------------------------------------------------------------------- /SaveMe-Dumper/libssl1.1_1.1.1g_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/SaveMe-Dumper/libssl1.1_1.1.1g_iphoneos-arm.deb -------------------------------------------------------------------------------- /SaveMe-Dumper/requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/SaveMe-Dumper/requirements.txt -------------------------------------------------------------------------------- /macOS/.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | 3 | block_cipher = None 4 | 5 | 6 | a = Analysis(['irecovery:/SupportFiles', 'SaveMe.py'], 7 | pathex=['/Users/kasiim/Documents/GitHub/SaveMe/macOS'], 8 | binaries=[], 9 | datas=[('tsschecker', '/SupportFiles/'), ('ideviceinfo', '/SupportFiles/'), ('ideviceenterrecovery', '/SupportFiles/'), ('igetnonce', '/SupportFiles/'), ('futurerestore', '/SupportFiles/')], 10 | hiddenimports=[], 11 | hookspath=[], 12 | runtime_hooks=[], 13 | excludes=[], 14 | win_no_prefer_redirects=False, 15 | win_private_assemblies=False, 16 | cipher=block_cipher, 17 | noarchive=False) 18 | pyz = PYZ(a.pure, a.zipped_data, 19 | cipher=block_cipher) 20 | exe = EXE(pyz, 21 | a.scripts, 22 | a.binaries, 23 | a.zipfiles, 24 | a.datas, 25 | [], 26 | name='', 27 | debug=False, 28 | bootloader_ignore_signals=False, 29 | strip=False, 30 | upx=True, 31 | upx_exclude=[], 32 | runtime_tmpdir=None, 33 | console=True ) 34 | -------------------------------------------------------------------------------- /macOS/README.md: -------------------------------------------------------------------------------- 1 | Windows version now includes latest tsschecker with A14 support from here: https://github.com/DanTheMann15/tsschecker/releases 2 | macOS version is still outdated at the time of writing. 3 | 4 | UPDATE v1.3 (Windows) - SaveMe The Easiest SHSH saver for macOS and Windows! 5 | 6 | - New Features 7 | 1. Fetches device info and saves it to a cached device list 8 | 2. Set version to save ticket for saving 9 | 3. Allows setting path for saving tickets too 10 | 4. Print Cached Devices 11 | 5. Print currently signed firmwares 12 | 6. Specify a generator, must be already set on device! (expects unc0ver's 0x1111111111111111) 13 | 7. Save currently signed firmwares from cached device list! (device does not need to be connected) 14 | 8. Dump ticket from iOS device (requires device to be jailbroken) 15 | 16 | - Planned Features 17 | 1. Print currently signed BETA iOS versions 18 | 2. Add ticket checking with imgtool4 19 | 3. Add FutureRestore support automating restoring if device is connected and SHSH2 file exists! 20 | 4. IPSW downloader for device when connected (and arg set) 21 | 5. Downloading of SEP and BBFW (if needed) for FutureRestore restores 22 | 23 | - Tested 24 | 1. iPhone11,2 25 | 2. iPad7,3 26 | 3. AppleTV 4K 27 | 28 | - Video Demo 29 | link (https://www.youtube.com/watch?v=RZzXPi1cncE) 30 | 31 | - Screenshots 32 | 33 | 1. (https://github.com/kasiimh1/SaveMe/blob/master/macOS/Screenshots/Screenshot%202020-06-13%20at%2012.20.21.png) 34 | 2. (https://github.com/kasiimh1/SaveMe/blob/master/macOS/Screenshots/Screenshot%202020-06-13%20at%2012.42.03.png) 35 | 3. (https://github.com/kasiimh1/SaveMe/blob/master/macOS/Screenshots/Screenshot%202020-06-13%20at%2012.42.29.png) 36 | 37 | Uses the following tools 38 | - libimobiledevice - ideviceenterrecovery, ideviceinfo, irecovery https://github.com/libimobiledevice 39 | - tsschecker https://github.com/tihmstar/tsschecker (macOS) and https://github.com/DanTheMann15/tsschecker/releases (Windows) 40 | -------------------------------------------------------------------------------- /macOS/SaveMe-Devices: -------------------------------------------------------------------------------- 1 | "name","boardid","model","generator","ecid","udid","platform","apnonce" -------------------------------------------------------------------------------- /macOS/SaveMe.py: -------------------------------------------------------------------------------- 1 | import sys, os, argparse, subprocess, json, csv, requests 2 | 3 | frozen = 'not' 4 | if getattr(sys, 'frozen', False): 5 | # we are running in a bundle 6 | frozen = 'ever so' 7 | bundle_dir = sys._MEIPASS 8 | else: 9 | # we are running in a normal Python environment 10 | bundle_dir = os.path.dirname(os.path.abspath(__file__)) 11 | 12 | replace = False 13 | exit = False 14 | 15 | def installDependencies(): 16 | print('[I] Installing Brew.sh') 17 | os.system('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"') 18 | print('[I] Installing usbmuxd') 19 | os.system('brew install --HEAD usbmuxd') 20 | print('[I] Installing liblist') 21 | os.system('brew install --HEAD libplist') 22 | print('[I] Installing libimobiledevice') 23 | os.system('brew install --HEAD libimobiledevice') 24 | print('[I] Installing ideviceinstaller') 25 | os.system('brew install --HEAD ideviceinstaller') 26 | print('[I] Finished Installing Dependencies, Exiting....') 27 | sys.exit(-1) 28 | 29 | def requestDeviceTicket(d_id, d_ecid, d_boardid, d_ios, d_apnonce, d_save): 30 | tsscheckerArgs = './tsschecker -d %s' %d_id + ' -e %s' %d_ecid + ' --boardconfig %s' %d_boardid + ' --ios %s' %d_ios + ' --apnonce %s' %d_apnonce + ' -s --save-path %s' %d_save 31 | print(tsscheckerArgs) 32 | subprocess.Popen([tsscheckerArgs], shell = True, stdout=subprocess.PIPE,stderr=subprocess.PIPE, encoding='utf8') 33 | 34 | def deviceExtractionTool(binaryName, stripValue, grepValue, replace): 35 | command = './' + binaryName + ' | grep ' + grepValue 36 | process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf8') 37 | output = process.communicate() 38 | stdOutput, stdErrValue = output 39 | stdOutput = stdOutput.strip() 40 | stdOutput = stdOutput[stripValue:] 41 | if replace == True: 42 | stdOutput = stdOutput.replace(' ', '') 43 | return dataReturn(stdOutput, stdErrValue) 44 | 45 | def deviceEnterRecMode(udid): 46 | command = './ideviceenterrecovery ' + udid 47 | process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf8') 48 | output = process.communicate() 49 | stdOutput, stdErrValue = output 50 | stdOutput = stdOutput.strip() 51 | return dataReturn(stdOutput, stdErrValue) 52 | 53 | def deviceExtractApNonce(): 54 | process = subprocess.Popen('./igetnonce', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf8') 55 | output = process.communicate() 56 | stdOutput, stdErrValue = output 57 | stdOutput = stdOutput.split('\n') 58 | data = dataReturn(stdOutput, stdErrValue) 59 | for s in data: 60 | if s.startswith('ApNonce='): 61 | data = s 62 | data = data.replace('ApNonce=','') 63 | return data 64 | 65 | def dataReturn(output, error): 66 | ret = None 67 | if error != None: 68 | ret = error 69 | if output != None: 70 | ret = output 71 | return ret 72 | 73 | def printCachedDevices(): 74 | file = os.path.expanduser(args.s + '/SaveMe-Tickets/SaveMe-Devices') 75 | with open(file, mode='r') as csv_file: 76 | csv_reader = csv.DictReader(csv_file) 77 | for i in csv_reader: 78 | print("------------------------------------------------------------------------") 79 | print("-- Found Device --") 80 | print("[D] Name: " + i['name']) 81 | print("[D] Model: " + i['model']) 82 | print("[D] UDID: " + i['udid']) 83 | print("[D] ECID: " + i['ecid']) 84 | print("[D] BoardID: " + i['boardid']) 85 | print("[D] Platform: " + i['platform']) 86 | print("[D] Generator: " + i['generator']) 87 | print("[D] APNonce: " + i['apnonce']) 88 | print("------------------------------------------------------------------------") 89 | 90 | def createSavePath(ecid, version): 91 | path = args.s + 'SaveMe-Tickets/' + ecid + '/' 92 | file = os.path.expanduser(path) 93 | if os.path.isdir(file) is False: 94 | try: 95 | os.mkdir(file) 96 | except FileExistsError: 97 | print('[*] Skipping creating ECID folder as %s it already exists' %ecid) 98 | 99 | if os.path.isdir(file + version) is False: 100 | try: 101 | os.mkdir(file + version) 102 | except FileExistsError: 103 | print('[*] Skipping creating iOS version folder as %s it already exists' %ecid) 104 | 105 | def saveTicketsForCachedDevices(version): 106 | file = os.path.expanduser(args.s + 'SaveMe-Tickets/SaveMe-Devices') 107 | with open(file, mode='r') as csv_file: 108 | csv_reader = csv.DictReader(csv_file) 109 | for i in csv_reader: 110 | print("------------------------------------------------------------------------") 111 | print("-- Found Device --") 112 | print("[D] Name: " + i['name']) 113 | print("[D] Model: " + i['model']) 114 | print("[D] UDID: " + i['udid']) 115 | print("[D] ECID: " + i['ecid']) 116 | print("[D] BoardID: " + i['boardid']) 117 | print("[D] Platform: " + i['platform']) 118 | print("[D] Generator: " + i['generator']) 119 | print("[D] APNonce: " + i['apnonce']) 120 | print("-- Saving Ticket For Cached Device -- ") 121 | createSavePath(i['ecid'], version) 122 | requestDeviceTicket(i['model'], i['ecid'], i['boardid'], version, i['apnonce'], args.s + 'SaveMe-Tickets/' + i['ecid'] + '/' + version + '/') 123 | openFolder(args.s + 'SaveMe-Tickets/' + i['ecid'] + '/' + version + '/') 124 | print("------------------------------------------------------------------------") 125 | 126 | def signedVersionChecker(model): 127 | ret = None 128 | signedReq = requests.get("https://api.ipsw.me/v4/device/" + model + "?type=ipsw") 129 | print("-- Checking Currently Signed iOS Versions --") 130 | print("[A] IPSW.me API Response Code: ["+ str(signedReq.status_code) + "]") 131 | if signedReq.status_code == 200: 132 | print("-- Server Response --") 133 | api = json.loads(signedReq.text) 134 | apiLength = len(api['firmwares']) 135 | for i in range(apiLength): 136 | if args.c == True and api['firmwares'][i]['signed'] == True or args.v == None and api['firmwares'][i]['signed'] == True: 137 | print("[V] iOS", api['firmwares'][i]['version'], "is currently being signed for the:", api['identifier']) 138 | if args.f == True: 139 | saveTicketsForCachedDevices(api['firmwares'][i]['version']) 140 | if args.t == True: 141 | ret = api['firmwares'][i]['version'] 142 | 143 | if api['firmwares'][i]['version'] == args.v and api['firmwares'][i]['signed'] == True: 144 | print("[V] iOS", api['firmwares'][i]['version'], "is currently being signed for the:", api['identifier']) 145 | break 146 | 147 | if api['firmwares'][i]['version'] == args.v and api['firmwares'][i]['signed'] != True: 148 | print("[V] iOS", api['firmwares'][i]['version'], "is currently NOT being signed for the:", api['identifier']) 149 | break 150 | return ret 151 | 152 | def writeDevicesToOutput(data, path): 153 | f = open(path + "/SaveMe-Devices", "a") 154 | f.write(data) 155 | f.close() 156 | 157 | def openFolder(savePath): 158 | print('[*] File should be in:', savePath) 159 | os.system('open ' + savePath) 160 | 161 | def fetchAPNonce(udid): 162 | print('-- Fetching APNonce From Recovery Mode --') 163 | deviceEnterRecMode(udid) 164 | input('[*] Press ENTER when Device is in Recovery Mode > ') 165 | APNonce = deviceExtractApNonce() 166 | print('[*] Found APNonce in Recovery Mode:', APNonce) 167 | print('[*] Exiting Recovery Mode') 168 | os.system('./irecovery -n') 169 | return APNonce 170 | 171 | # defaultHashes = '27325c8258be46e69d9ee57fa9a8fbc28b873df434e5e702a8b27999551138ae','3a88b7c3802f2f0510abc432104a15ebd8bd7154', 172 | # '15400076bc4c35a7c8caefdcae5bda69c140a11bce870548f0862aac28c194cc','603be133ff0bdfa0f83f21e74191cf6770ea43bb' 173 | 174 | parser = argparse.ArgumentParser(description='SaveMe: SHSH saver for macOS by Kasiimh1') 175 | parser.add_argument('-a', help='Add Device To Cache List (-d needed)', action='store_true') 176 | parser.add_argument('-c', help='Check Currently Signed iOS Versions', action='store_true') 177 | parser.add_argument('-d', help='Fetch Information From Device', action='store_true') 178 | parser.add_argument('-f', help='Save SHSH2 Tickets For Cached Devices (-c needed)', action='store_true') 179 | parser.add_argument('-g', help='Specifiy Custom Generator') 180 | parser.add_argument('-i', help='Install SaveMe Dependencies', action='store_true') 181 | parser.add_argument('-p', help='Print Cached Devices', action='store_true') 182 | parser.add_argument('-s', help='Set Custom SHSH2 Save Path', default='~/Desktop/') 183 | parser.add_argument('-t', help='Save SHSH2 Ticket', action='store_true') 184 | parser.add_argument('-v', help='Set iOS Version For Saving Tickets') 185 | 186 | args = parser.parse_args() 187 | print('\nSaveMe v1.0 by Kasiimh1') 188 | 189 | if args.i == True: 190 | installDependencies() 191 | sys.exit(-1) 192 | if args.p == True: 193 | if os.path.isfile(os.path.expanduser(args.s) + '/SaveMe-Tickets/SaveMe-Devices'): 194 | printCachedDevices() 195 | else: 196 | print('-- No Cached Device File Found, use -a -d to add device!') 197 | sys.exit(-1) 198 | if args.c == True: 199 | if os.path.isfile(os.path.expanduser(args.s) + '/SaveMe-Tickets/SaveMe-Devices'): 200 | signedVersionChecker("iPhone11,2") 201 | else: 202 | print('-- No Cached Device File Found, use -a -d to add device!') 203 | sys.exit(-1) 204 | 205 | args.output = os.path.expanduser(args.s) 206 | savePath = args.output 207 | 208 | if (os.path.isdir(savePath) is False): 209 | try: 210 | os.mkdir(savePath) 211 | except FileExistsError: 212 | print('\n\n[*] Skipping creating save path folder as it already exists') 213 | 214 | if (os.path.isdir(savePath + 'SaveMe-Tickets') is False): 215 | try: 216 | os.mkdir(savePath + 'SaveMe-Tickets') 217 | except FileExistsError: 218 | print('\n\n[*] Skipping creating SaveMe folder as it already exists') 219 | 220 | savePath = savePath + 'SaveMe-Tickets' 221 | os.chdir(bundle_dir) 222 | input('[*] Press ENTER when Device is connected > ') 223 | os.chdir(os.getcwd() + '/SupportFiles/') 224 | udid = deviceExtractionTool('ideviceinfo', 16, 'UniqueDeviceID: ', False) 225 | ecid = deviceExtractionTool('ideviceinfo', 13, 'UniqueChipID: ', True) 226 | platform = deviceExtractionTool('ideviceinfo', 18, 'HardwarePlatform: ', False) 227 | product = deviceExtractionTool('ideviceinfo', 13, 'ProductType: ', False) 228 | user = deviceExtractionTool('ideviceinfo', 12, 'DeviceName: ', False) 229 | boardid = deviceExtractionTool('ideviceinfo', 15, 'HardwareModel: ', False) 230 | APNonce = None 231 | generator = None 232 | 233 | if udid != None and args.d == True: 234 | print("[*] Fetching Infromation From Device") 235 | print("-- Device Information --") 236 | print('[D] Found ' + user) 237 | print('[D] Device is:', product) 238 | print('[D] BoardID is:', boardid) 239 | print('[D] Found Device: UDID:', udid) 240 | print('[D] ECID:', ecid) 241 | print('[D] Device Platform:', platform) 242 | 243 | if args.a == True: 244 | print("-- Adding Device To Cached List --") 245 | if not os.path.isfile(os.path.expanduser(args.s) + '/SaveMe-Tickets/SaveMe-Devices'): 246 | try: 247 | os.system('cp ./SaveMe-Devices %s' %savePath + '/SaveMe-Devices') 248 | except FileExistsError: 249 | print('\n\n[*] Skipping creating SaveMe-Devices file as it already exists') 250 | if args.g == None: 251 | print("[*] Using Unc0ver's Generator!") 252 | generator = "0x1111111111111111" 253 | else: 254 | print("[*] User Using Custom Generator!") 255 | generator = args.g 256 | 257 | APNonce = fetchAPNonce(udid) 258 | data = '\n"' + user + '","' + boardid + '","' + product + '","' + generator + '","' + ecid + '","' + udid + '","' + platform + '","' + APNonce + '"' 259 | writeDevicesToOutput(data, savePath) 260 | print('[*] Thanks for using SaveMe v1.0, Exiting Program') 261 | sys.exit(-1) 262 | 263 | if args.t == True: 264 | print("-- Saving SHSH2 Ticket --") 265 | signedOS = signedVersionChecker(product) 266 | 267 | if (signedOS) != None: 268 | if args.v == None: 269 | print("-- No iOS Version Set, Defaulting To Latest iOS Version Being Signed! --") 270 | print("-- iOS " + signedOS + " is Signed, Defaulting To That Versions --") 271 | else: 272 | print('[*] iOS Version Saving SHSH2 Ticket For', args.v) 273 | APNonce = fetchAPNonce(udid) 274 | createSavePath(ecid, signedOS) 275 | savePath = savePath + '/' + ecid + '/' + signedOS + '/' 276 | requestDeviceTicket(product, ecid, boardid, signedOS, APNonce, savePath) 277 | openFolder(savePath) 278 | print('[*] Thanks for using SaveMe v1.0, Exiting Program') 279 | else: 280 | print("-- Error iOS Version Not Signed --") 281 | sys.exit(-1) -------------------------------------------------------------------------------- /macOS/SaveMe.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python ; coding: utf-8 -*- 2 | 3 | block_cipher = None 4 | 5 | 6 | a = Analysis(['SaveMe.py'], 7 | pathex=['/Users/kasiim/Documents/GitHub/SaveMe/macOS'], 8 | binaries=[], 9 | datas=[('tsschecker', '/SupportFiles/'), ('ideviceinfo', '/SupportFiles/'), ('ideviceenterrecovery', '/SupportFiles/'), ('igetnonce', '/SupportFiles/'), ('irecovery', '/SupportFiles/'), ('SaveMe-Devices', '/SupportFiles/')], 10 | hiddenimports=['requests'], 11 | hookspath=[], 12 | runtime_hooks=[], 13 | excludes=[], 14 | win_no_prefer_redirects=False, 15 | win_private_assemblies=False, 16 | cipher=block_cipher, 17 | noarchive=False) 18 | pyz = PYZ(a.pure, a.zipped_data, 19 | cipher=block_cipher) 20 | exe = EXE(pyz, 21 | a.scripts, 22 | a.binaries, 23 | a.zipfiles, 24 | a.datas, 25 | [], 26 | name='SaveMe', 27 | debug=False, 28 | bootloader_ignore_signals=False, 29 | strip=False, 30 | upx=True, 31 | upx_exclude=[], 32 | runtime_tmpdir=None, 33 | console=True ) 34 | -------------------------------------------------------------------------------- /macOS/SaveMeCompileCommand.md: -------------------------------------------------------------------------------- 1 | pyinstaller --onefile --add-data 'tsschecker':'/SupportFiles/' --add-data 'ideviceinfo':'/SupportFiles/' --add-data 'ideviceenterrecovery':'/SupportFiles/' --add-data 'igetnonce':'/SupportFiles/' --add-data 'irecovery':'/SupportFiles/' --add-data 'SaveMe-Devices':'/SupportFiles/' SaveMe.py --hidden-import=requests --clean -------------------------------------------------------------------------------- /macOS/Screenshots/Screenshot 2020-06-13 at 12.20.21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/macOS/Screenshots/Screenshot 2020-06-13 at 12.20.21.png -------------------------------------------------------------------------------- /macOS/Screenshots/Screenshot 2020-06-13 at 12.42.03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/macOS/Screenshots/Screenshot 2020-06-13 at 12.42.03.png -------------------------------------------------------------------------------- /macOS/Screenshots/Screenshot 2020-06-13 at 12.42.29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/macOS/Screenshots/Screenshot 2020-06-13 at 12.42.29.png -------------------------------------------------------------------------------- /macOS/dist/SaveMe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/macOS/dist/SaveMe -------------------------------------------------------------------------------- /windows/SaveMe.py: -------------------------------------------------------------------------------- 1 | import sys, os, argparse, subprocess, json, csv, requests, webbrowser, paramiko, getpass 2 | from shutil import copyfile 3 | 4 | frozen = 'not' 5 | if getattr(sys, 'frozen', False): 6 | # we are running in a bundle 7 | frozen = 'ever so' 8 | bundle_dir = sys._MEIPASS 9 | else: 10 | # we are running in a normal Python environment 11 | bundle_dir = os.path.dirname(os.path.abspath(__file__)) 12 | 13 | replace = False 14 | 15 | def dumpDeviceTicket(saveTicketPath): 16 | print("[*] Saving to: %s" %saveTicketPath) 17 | ssh = paramiko.SSHClient() 18 | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 19 | ip = input("Enter Devices IP: ") 20 | password = getpass.getpass("root@" + ip + "'s password: ") 21 | ssh.connect(ip, port=22, username='root', password = password) 22 | print("Installing Dependancies") 23 | os.system("scp img4tool_192_iphoneos-arm.deb root@"+ ip + ":img4tool_192_iphoneos-arm.deb") 24 | os.system("scp libssl1.1_1.1.1g_iphoneos-arm.deb root@"+ ip + ":libssl1.1_1.1.1g_iphoneos-arm.deb") 25 | os.system("scp libgeneral_31_iphoneos-arm.deb root@"+ ip + ":libgeneral_31_iphoneos-arm.deb") 26 | os.system("scp libimg4tool0_192_iphoneos-arm.deb root@"+ ip + ":libimg4tool0_192_iphoneos-arm.deb") 27 | os.system("scp libplist3_2.2.0_iphoneos-arm.deb root@"+ ip + ":libplist3_2.2.0_iphoneos-arm.deb") 28 | os.system("ssh root@"+ ip + " dpkg -i libplist3_2.2.0_iphoneos-arm.deb") 29 | os.system("ssh root@"+ ip + " dpkg -i libssl1.1_1.1.1g_iphoneos-arm.deb") 30 | os.system("ssh root@"+ ip + " dpkg -i libgeneral_31_iphoneos-arm.deb") 31 | os.system("ssh root@"+ ip + " dpkg -i libimg4tool0_192_iphoneos-arm.deb") 32 | os.system("ssh root@"+ ip + " dpkg -i img4tool_192_iphoneos-arm.deb") 33 | print("Dumping Ticket from iOS FileSystem") 34 | stdin, stdout, stderr = ssh.exec_command("cat /dev/rdisk1 | dd of=dump.raw bs=256 count=$((0x4000)) &> /dev/null") 35 | print("Converting Dump to Ticket") 36 | os.system("ssh root@"+ ip + " img4tool --convert -s dumped.shsh dump.raw") 37 | print("Copying Dump to machine") 38 | os.system("scp root@"+ ip + ":dumped.shsh %s/dumped.shsh" %saveTicketPath) 39 | if args.open: 40 | subprocess.run(['explorer', os.path.realpath('%s/dumped.shsh' %saveTicketPath)]) 41 | 42 | def requestDeviceTicket(d_id, d_ecid, d_boardid, d_ios, d_apnonce, d_save, d_ota): 43 | process = subprocess.Popen('tsschecker.exe -d %s' %d_id + ' -e %s' %d_ecid + ' --boardconfig %s' %d_boardid + ' --ios %s' %d_ios + ' --apnonce %s' %d_apnonce + ' -s --save-path %s' %d_save + ' %s' %d_ota, shell = True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf8') 44 | if args.log: 45 | output = process.communicate() 46 | stdOutput, stdErrValue = output 47 | stdOutput = stdOutput.strip() 48 | print(stdErrValue) 49 | print(stdOutput) 50 | 51 | def deviceExtractionTool(binaryName, stripValue, grepValue, replace): 52 | command = binaryName + ' | findstr ' + grepValue 53 | process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf8') 54 | output = process.communicate() 55 | stdOutput, stdErrValue = output 56 | stdOutput = stdOutput.strip() 57 | stdOutput = stdOutput[stripValue:] 58 | if replace == True: 59 | stdOutput = stdOutput.replace(' ', '') 60 | return dataReturn(stdOutput, stdErrValue) 61 | 62 | def deviceEnterRecMode(udid): 63 | command = 'ideviceenterrecovery.exe ' + udid 64 | process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf8') 65 | output = process.communicate() 66 | stdOutput, stdErrValue = output 67 | stdOutput = stdOutput.strip() 68 | return dataReturn(stdOutput, stdErrValue) 69 | 70 | def deviceExtractApNonce(): 71 | process = subprocess.Popen('irecovery.exe -q | findstr NONC', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf8') 72 | output = process.communicate() 73 | stdOutput, stdErrValue = output 74 | stdOutput = stdOutput.split('\n') 75 | data = dataReturn(stdOutput, stdErrValue) 76 | for s in data: 77 | if s.startswith('NONC: '): 78 | data = s 79 | data = data.replace('NONC: ','') 80 | return data 81 | 82 | def dataReturn(output, error): 83 | ret = None 84 | if error != None: 85 | ret = error 86 | if output != None: 87 | ret = output 88 | return ret 89 | 90 | def printCachedDevices(): 91 | file = os.path.expanduser(args.path + '/SaveMe-Tickets/SaveMe-Devices') 92 | with open(file, mode='r') as csv_file: 93 | csv_reader = csv.DictReader(csv_file) 94 | for i in csv_reader: 95 | print("------------------------------------------------------------------------") 96 | print("-- Found Device --") 97 | print("[D] Name: " + i['name']) 98 | print("[D] Model: " + i['model']) 99 | print("[D] UDID: " + i['udid']) 100 | print("[D] ECID: " + i['ecid']) 101 | print("[D] BoardID: " + i['boardid']) 102 | print("[D] Platform: " + i['platform']) 103 | print("[D] Generator: " + i['generator']) 104 | print("[D] APNonce: " + i['apnonce']) 105 | print("------------------------------------------------------------------------") 106 | 107 | def createSavePath(ecid, version): 108 | path = args.path + 'SaveMe-Tickets/' + ecid + '/' 109 | file = os.path.expanduser(path) 110 | if os.path.isdir(file) is False: 111 | try: 112 | os.mkdir(file) 113 | except FileExistsError: 114 | print('[*] Skipping creating ECID folder as %s it already exists' %ecid) 115 | 116 | if os.path.isdir(file + version) is False: 117 | try: 118 | os.mkdir(file + version) 119 | except FileExistsError: 120 | print('[*] Skipping creating iOS version folder as %s it already exists' %ecid) 121 | 122 | def saveTicketsForCachedDevices(version): 123 | file = os.path.expanduser(args.path + 'SaveMe-Tickets/SaveMe-Devices') 124 | with open(file, mode='r') as csv_file: 125 | csv_reader = csv.DictReader(csv_file) 126 | for i in csv_reader: 127 | print("------------------------------------------------------------------------") 128 | print("-- Found Device --") 129 | print("[D] Name: " + i['name']) 130 | print("[D] Model: " + i['model']) 131 | print("[D] UDID: " + i['udid']) 132 | print("[D] ECID: " + i['ecid']) 133 | print("[D] BoardID: " + i['boardid']) 134 | print("[D] Platform: " + i['platform']) 135 | print("[D] Generator: " + i['generator']) 136 | print("[D] APNonce: " + i['apnonce']) 137 | print("-- Saving Ticket For Cached Device -- ") 138 | createSavePath(i['ecid'], version) 139 | if i['boardid'].find("J105AAP") == 0 or i['boardid'].find("J42DAP") == 0 or i['boardid'].find("K66AP") == 0 or i['boardid'].find("J33IAP") == 0 or i['boardid'].find("J33AP") == 0: 140 | print("[*] REQUESTING OTA TICKETS") 141 | ota = ' -o' 142 | requestDeviceTicket(i['model'], i['ecid'], i['boardid'], version, i['apnonce'], args.path + 'SaveMe-Tickets/' + i['ecid'] + '/' + version + '/', ota) 143 | else: 144 | print("[*] REQUESTING REGULAR TICKETS") 145 | ota = '' 146 | requestDeviceTicket(i['model'], i['ecid'], i['boardid'], version, i['apnonce'], args.path + 'SaveMe-Tickets/' + i['ecid'] + '/' + version + '/', ota) 147 | if args.open: 148 | subprocess.run(['explorer', os.path.realpath(args.path + 'SaveMe-Tickets/' + i['ecid'] + '/' + version + '/' )]) 149 | print("------------------------------------------------------------------------") 150 | 151 | def signedVersionChecker(model): 152 | ret = None 153 | signedReq = requests.get("https://api.ipsw.me/v4/device/" + model + "?type=ipsw") 154 | print("-- Checking Currently Signed iOS Versions --") 155 | print("[A] IPSW.me API Response Code: ["+ str(signedReq.status_code) + "]") 156 | if signedReq.status_code == 200: 157 | print("-- Server Response --") 158 | api = json.loads(signedReq.text) 159 | apiLength = len(api['firmwares']) 160 | for i in range(apiLength): 161 | if args.check == True and api['firmwares'][i]['signed'] == True or args.version == None and api['firmwares'][i]['signed'] == True: 162 | print("[V] iOS", api['firmwares'][i]['version'], "is currently being signed for the:", api['identifier']) 163 | if args.savecached == True: 164 | saveTicketsForCachedDevices(api['firmwares'][i]['version']) 165 | if args.save == True: 166 | ret = api['firmwares'][i]['version'] 167 | 168 | if api['firmwares'][i]['version'] == args.version and api['firmwares'][i]['signed'] == True: 169 | print("[V] iOS", api['firmwares'][i]['version'], "is currently being signed for the:", api['identifier']) 170 | break 171 | 172 | if api['firmwares'][i]['version'] == args.version and api['firmwares'][i]['signed'] != True: 173 | print("[V] iOS", api['firmwares'][i]['version'], "is currently NOT being signed for the:", api['identifier']) 174 | break 175 | return ret 176 | 177 | def writeDevicesToOutput(data, path): 178 | f = open(path + "/SaveMe-Devices", "a") 179 | f.write(data) 180 | f.close() 181 | 182 | def openFolder(savePath): 183 | print('[*] File should be in:', savePath) 184 | os.system('open ' + savePath) 185 | 186 | def fetchAPNonce(udid): 187 | print('-- Fetching APNonce From Recovery Mode --') 188 | deviceEnterRecMode(udid) 189 | input('[*] Press ENTER when Device is in Recovery Mode > ') 190 | APNonce = deviceExtractApNonce() 191 | print('[*] Found APNonce in Recovery Mode:', APNonce) 192 | print('[*] Exiting Recovery Mode') 193 | os.system('irecovery.exe -n') 194 | return APNonce 195 | 196 | # defaultHashes = '27325c8258be46e69d9ee57fa9a8fbc28b873df434e5e702a8b27999551138ae','3a88b7c3802f2f0510abc432104a15ebd8bd7154', 197 | # '15400076bc4c35a7c8caefdcae5bda69c140a11bce870548f0862aac28c194cc','603be133ff0bdfa0f83f21e74191cf6770ea43bb' 198 | 199 | parser = argparse.ArgumentParser(description='SaveMe: SHSH saver for Windows and macOS by Kasiimh1') 200 | parser.add_argument('-add', help='Add Device To Cache List (-info needed)', action='store_true') 201 | parser.add_argument('-check', help='Check Currently Signed iOS Versions (uses iPhone11,2 by default) or use -model to specify model', action='store_true') 202 | parser.add_argument('-info', help='Fetch Information From Device', action='store_true') 203 | parser.add_argument('-savecached', help='Save SHSH2 Tickets For Cached Devices (-check needed)', action='store_true') 204 | parser.add_argument('-generator', help='Specifiy Custom Generator') 205 | parser.add_argument('-log', help='Debug Log for TSSChecker', action='store_true') 206 | parser.add_argument('-open', help='Open Folder after Tickets are Saved', action='store_true') 207 | parser.add_argument('-ota', help='Request OTA Tickets to be Saved', action='store_true') 208 | parser.add_argument('-print', help='Print Cached Devices', action='store_true') 209 | parser.add_argument('-model', help='Set Device Model e.g. iPhone11,2 (used with -check)') 210 | parser.add_argument('-path', help='Set Custom SHSH2 Save Path', default=os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop/')) 211 | parser.add_argument('-save', help='Save SHSH2 Ticket', action='store_true') 212 | parser.add_argument('-version', help='Set iOS Version For Saving Tickets') 213 | parser.add_argument('-extract', help='Dump Ticket from Device', action='store_true') 214 | 215 | args = parser.parse_args() 216 | print('\nSaveMe v1.3 by Kasiimh1') 217 | 218 | os.chdir(bundle_dir) 219 | os.chdir(os.getcwd() + '/SupportFiles/') 220 | 221 | if args.print == True: 222 | if os.path.isfile(os.path.expanduser(args.path) + '/SaveMe-Tickets/SaveMe-Devices'): 223 | printCachedDevices() 224 | else: 225 | print('-- No Cached Device File Found, use -a -d to add device!') 226 | sys.exit(-1) 227 | if args.check == True: 228 | if args.model: 229 | signedVersionChecker(args.model) 230 | else: 231 | signedVersionChecker("iPhone11,2") 232 | sys.exit(-1) 233 | 234 | args.output = os.path.expanduser(args.path) 235 | savePath = args.output 236 | 237 | if (os.path.isdir(savePath) is False): 238 | try: 239 | os.mkdir(savePath) 240 | except FileExistsError: 241 | print('\n\n[*] Skipping creating save path folder as it already exists') 242 | 243 | if (os.path.isdir(savePath + 'SaveMe-Tickets') is False): 244 | try: 245 | os.mkdir(savePath + 'SaveMe-Tickets') 246 | except FileExistsError: 247 | print('\n\n[*] Skipping creating SaveMe folder as it already exists') 248 | 249 | savePath = savePath + 'SaveMe-Tickets' 250 | 251 | if args.extract: 252 | print("[*] Dumping Ticket from Device!") 253 | dumpDeviceTicket(savePath) 254 | 255 | if args.add and args.info: 256 | input('[*] Press ENTER when Device is connected > ') 257 | udid = deviceExtractionTool('ideviceinfo.exe', 16, 'UniqueDeviceID: ', False) 258 | ecid = deviceExtractionTool('ideviceinfo.exe', 13, 'UniqueChipID: ', True) 259 | platform = deviceExtractionTool('ideviceinfo.exe', 18, 'HardwarePlatform: ', False) 260 | product = deviceExtractionTool('ideviceinfo.exe', 13, 'ProductType: ', False) 261 | user = deviceExtractionTool('ideviceinfo.exe', 12, 'DeviceName: ', False) 262 | boardid = deviceExtractionTool('ideviceinfo.exe', 15, 'HardwareModel: ', False) 263 | APNonce = None 264 | generator = None 265 | 266 | if udid != None and args.info == True: 267 | print("[*] Fetching Infromation From Device") 268 | print("-- Device Information --") 269 | print('[D] Found ' + user) 270 | print('[D] Device is:', product) 271 | print('[D] BoardID is:', boardid) 272 | print('[D] Found Device: UDID:', udid) 273 | print('[D] ECID:', ecid) 274 | print('[D] Device Platform:', platform) 275 | 276 | if args.add == True: 277 | print("-- Adding Device To Cached List --") 278 | if not os.path.isfile(os.path.expanduser(args.path) + '/SaveMe-Tickets/SaveMe-Devices'): 279 | try: 280 | copyfile('SaveMe-Devices', '%s' %savePath + '/SaveMe-Devices') 281 | except FileExistsError: 282 | print('\n\n[*] Skipping creating SaveMe-Devices file as it already exists') 283 | if args.generator == None: 284 | print("[*] Using Unc0ver's Generator!") 285 | generator = "0x1111111111111111" 286 | else: 287 | print("[*] User Using Custom Generator!") 288 | generator = args.generator 289 | 290 | APNonce = fetchAPNonce(udid) 291 | data = '\n"%s","' %user + '%s","' %boardid +'%s","' %product +'%s","' %generator+'%s","' %ecid + '%s","' %udid + '%s","' %platform + '%s"' %APNonce 292 | writeDevicesToOutput(data, savePath) 293 | print('[*] Thanks for using SaveMe v1.0, Exiting Program') 294 | sys.exit(-1) 295 | 296 | if args.save == True: 297 | print("-- Saving SHSH2 Ticket --") 298 | signedOS = signedVersionChecker(product) 299 | 300 | if (signedOS) != None: 301 | if args.version == None: 302 | print("-- No iOS Version Set, Defaulting To Latest iOS Version Being Signed! --") 303 | print("-- iOS " + signedOS + " is Signed, Defaulting To That Versions --") 304 | else: 305 | print('[*] iOS Version Saving SHSH2 Ticket For', args.version) 306 | APNonce = fetchAPNonce(udid) 307 | createSavePath(ecid, signedOS) 308 | savePath = savePath + '/' + ecid + '/' + signedOS + '/' 309 | if args.ota: 310 | ota = '-o' 311 | requestDeviceTicket(product, ecid, boardid, signedOS, APNonce, savePath, ota) 312 | if args.open: 313 | subprocess.run(['explorer', os.path.realpath(savePath)]) 314 | print('[*] Thanks for using SaveMe v1.0, Exiting Program') 315 | else: 316 | print("-- Error iOS Version Not Signed --") 317 | sys.exit(-1) 318 | 319 | if not args.add and not args.check and not args.info and not args.savecached and not args.log and not args.print and not args.save and not args.extract and not args.ota: 320 | parser.print_help() 321 | sys.exit(-1) -------------------------------------------------------------------------------- /windows/SupportFiles/SaveMe-Devices: -------------------------------------------------------------------------------- 1 | "name","boardid","model","generator","ecid","udid","platform","apnonce" 2 | -------------------------------------------------------------------------------- /windows/SupportFiles/idevice_id.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevice_id.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicebackup2.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicebackup2.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicecrashreport.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicecrashreport.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicedate.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicedate.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicedebug.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicedebug.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicedebugserverproxy.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicedebugserverproxy.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicediagnostics.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicediagnostics.exe -------------------------------------------------------------------------------- /windows/SupportFiles/ideviceenterrecovery.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/ideviceenterrecovery.exe -------------------------------------------------------------------------------- /windows/SupportFiles/ideviceimagemounter.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/ideviceimagemounter.exe -------------------------------------------------------------------------------- /windows/SupportFiles/ideviceinfo.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/ideviceinfo.exe -------------------------------------------------------------------------------- /windows/SupportFiles/ideviceinstaller.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/ideviceinstaller.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicename.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicename.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicenotificationproxy.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicenotificationproxy.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicepair.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicepair.exe -------------------------------------------------------------------------------- /windows/SupportFiles/ideviceprovision.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/ideviceprovision.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicerestore.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicerestore.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicescreenshot.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicescreenshot.exe -------------------------------------------------------------------------------- /windows/SupportFiles/idevicesyslog.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/idevicesyslog.exe -------------------------------------------------------------------------------- /windows/SupportFiles/img4tool_192_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/img4tool_192_iphoneos-arm.deb -------------------------------------------------------------------------------- /windows/SupportFiles/ios_webkit_debug_proxy.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/ios_webkit_debug_proxy.exe -------------------------------------------------------------------------------- /windows/SupportFiles/iproxy.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/iproxy.exe -------------------------------------------------------------------------------- /windows/SupportFiles/irecovery.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/irecovery.exe -------------------------------------------------------------------------------- /windows/SupportFiles/libgeneral_31_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/libgeneral_31_iphoneos-arm.deb -------------------------------------------------------------------------------- /windows/SupportFiles/libimg4tool0_192_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/libimg4tool0_192_iphoneos-arm.deb -------------------------------------------------------------------------------- /windows/SupportFiles/libplist3_2.2.0_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/libplist3_2.2.0_iphoneos-arm.deb -------------------------------------------------------------------------------- /windows/SupportFiles/libssl1.1_1.1.1g_iphoneos-arm.deb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/libssl1.1_1.1.1g_iphoneos-arm.deb -------------------------------------------------------------------------------- /windows/SupportFiles/plist_cmp.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/plist_cmp.exe -------------------------------------------------------------------------------- /windows/SupportFiles/plist_test.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/plist_test.exe -------------------------------------------------------------------------------- /windows/SupportFiles/tsschecker.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/tsschecker.exe -------------------------------------------------------------------------------- /windows/SupportFiles/usbmuxd.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kasiimh1/SaveMe/5b4115cbe22714280ce58faaf4d2074ca5de314f/windows/SupportFiles/usbmuxd.exe --------------------------------------------------------------------------------