├── .github └── workflows │ ├── mac.yml │ └── win.yml ├── .gitignore ├── assets ├── CydiaSubstrate.zip ├── addons │ ├── FLEX_Jailed.dylib │ └── dlgmemor.dylib ├── libloader.dylib └── libsubstrate.dylib ├── icon.ico ├── make.py ├── ppsideloader.app └── Contents │ ├── Info.plist │ ├── MacOS │ └── placeholder.txt │ └── Resources │ └── ppsideloader.icns ├── ppsideloader_py.py ├── requirements.txt └── zsign.exe /.github/workflows/mac.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests and lint with a variety of Python versions 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions 3 | 4 | name: MacOS_Build 5 | 6 | on: 7 | push: 8 | branches: [ ppsideloader/2.x ] 9 | pull_request: 10 | branches: [ ppsideloader/2.x ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: macos-latest 16 | strategy: 17 | matrix: 18 | python-version: [3.8] 19 | 20 | steps: 21 | - uses: actions/checkout@v2 22 | - name: Set up Python ${{ matrix.python-version }} 23 | uses: actions/setup-python@v2 24 | with: 25 | python-version: ${{ matrix.python-version }} 26 | - name: Install dependencies 27 | run: | 28 | pip install pyinstaller 29 | pip install -r requirements.txt 30 | - name: Build && Packaging 31 | run: | 32 | pyinstaller --onefile -i icon.icon ppsideloader_py.py 33 | mv ./dist/ppsideloader_py ./ppsideloader.app/Contents/MacOS/ppsideloader_py 34 | mv ./assets ./ppsideloader.app/Contents/MacOS/assets 35 | chmod -R +x ./ppsideloader.app 36 | mv ./ppsideloader.app ./dist/ppsideloader.app 37 | - name: Upload a Build Artifact 38 | uses: actions/upload-artifact@v2 39 | with: 40 | name: output_macos 41 | path: dist 42 | -------------------------------------------------------------------------------- /.github/workflows/win.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests and lint with a variety of Python versions 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions 3 | 4 | name: Windows_Build 5 | 6 | on: 7 | push: 8 | branches: [ ppsideloader/2.x ] 9 | pull_request: 10 | branches: [ ppsideloader/2.x ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: windows-latest 16 | strategy: 17 | matrix: 18 | python-version: [3.8] 19 | 20 | steps: 21 | - uses: actions/checkout@v2 22 | - name: Set up Python ${{ matrix.python-version }} 23 | uses: actions/setup-python@v2 24 | with: 25 | python-version: ${{ matrix.python-version }} 26 | - name: Install dependencies 27 | run: | 28 | pip install pyinstaller 29 | pip install -r requirements.txt 30 | - name: Build && Packaging 31 | run: | 32 | pyinstaller --onefile -i icon.ico ppsideloader_py.py 33 | mv ./assets ./dist/assets 34 | mv ./icon.ico ./dist/icon.ico 35 | mv ./zsign.exe ./dist/zsign.exe 36 | - name: Upload a Build Artifact 37 | uses: actions/upload-artifact@v2 38 | with: 39 | name: output_windows 40 | path: dist 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /assets/CydiaSubstrate.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrafterPika/ppsideloader_py/9da1e8b8cdfac7aed50e0e965f61f8df1b91067f/assets/CydiaSubstrate.zip -------------------------------------------------------------------------------- /assets/addons/FLEX_Jailed.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrafterPika/ppsideloader_py/9da1e8b8cdfac7aed50e0e965f61f8df1b91067f/assets/addons/FLEX_Jailed.dylib -------------------------------------------------------------------------------- /assets/addons/dlgmemor.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrafterPika/ppsideloader_py/9da1e8b8cdfac7aed50e0e965f61f8df1b91067f/assets/addons/dlgmemor.dylib -------------------------------------------------------------------------------- /assets/libloader.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrafterPika/ppsideloader_py/9da1e8b8cdfac7aed50e0e965f61f8df1b91067f/assets/libloader.dylib -------------------------------------------------------------------------------- /assets/libsubstrate.dylib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrafterPika/ppsideloader_py/9da1e8b8cdfac7aed50e0e965f61f8df1b91067f/assets/libsubstrate.dylib -------------------------------------------------------------------------------- /icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrafterPika/ppsideloader_py/9da1e8b8cdfac7aed50e0e965f61f8df1b91067f/icon.ico -------------------------------------------------------------------------------- /make.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from cx_Freeze import setup, Executable 3 | 4 | base = None 5 | if sys.platform == "win32": 6 | base = "Win32GUI" 7 | 8 | required_packages = ['os', 'requests', 'tkinter', 'webbrowser', 'shutil', 'zipfile', 'glob', 'plistlib', 'threading', 'time'] 9 | excluded_packages = ['numpy'] 10 | executables_settings = [ 11 | Executable( 12 | "ppsideloader_py.py", 13 | base=base, 14 | icon = 'icon.ico', 15 | #shortcutName='ppsideloader_py', 16 | #shortcutDir='DesktopFolder', 17 | ) 18 | ] 19 | build_options = { 20 | "build_exe": { 21 | 'packages': required_packages, 22 | 'excludes': excluded_packages, 23 | 'include_files': ['icon.ico', 'zsign.exe'], 24 | }, 25 | 'bdist_msi': { 26 | 'upgrade_code': "{f3a5eb20-7045-4937-aad2-61be50141b85}", 27 | 'add_to_path': True, 28 | #'environment_variables': [ 29 | #("E_MYAPP_VAR", "=-*MYAPP_VAR", "1", "TARGETDIR") 30 | #] 31 | } 32 | } 33 | 34 | setup( name = "PPSideloaderPy", 35 | version = "2.1", 36 | description = "Tweak apps easily", 37 | options = build_options, 38 | executables = executables_settings 39 | ) 40 | -------------------------------------------------------------------------------- /ppsideloader.app/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleExecutable 6 | ppsideloader_py 7 | CFBundleIconFile 8 | ppsideloader.icns 9 | CFBundleInfoDictionaryVersion 10 | 1.0 11 | CFBundlePackageType 12 | APPL 13 | CFBundleSignature 14 | ???? 15 | CFBundleVersion 16 | 1.0 17 | 18 | 19 | -------------------------------------------------------------------------------- /ppsideloader.app/Contents/MacOS/placeholder.txt: -------------------------------------------------------------------------------- 1 | 69 -------------------------------------------------------------------------------- /ppsideloader.app/Contents/Resources/ppsideloader.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrafterPika/ppsideloader_py/9da1e8b8cdfac7aed50e0e965f61f8df1b91067f/ppsideloader.app/Contents/Resources/ppsideloader.icns -------------------------------------------------------------------------------- /ppsideloader_py.py: -------------------------------------------------------------------------------- 1 | #tkinter 2 | from tkinter import ttk, Button, Label, Entry, Tk, Menu, filedialog, messagebox, OptionMenu 3 | from tkinter import * 4 | import tkinter 5 | from tkinter.ttk import * 6 | import tkinter as tk 7 | import tkinter.ttk as ttk 8 | 9 | #modules 10 | import webbrowser 11 | import shutil 12 | import zipfile 13 | import os 14 | import glob 15 | import plistlib 16 | import threading 17 | import time 18 | import requests 19 | import random 20 | import json 21 | import shlex 22 | import subprocess 23 | from pathlib import Path 24 | import sys 25 | 26 | 27 | #Hotel Trivago 28 | abc = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "w", "x", "y", "z"] 29 | cap_abc = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "W", "X", "Y", "Z"] 30 | number = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] 31 | 32 | 33 | # determine if application is a script file or frozen exe 34 | if getattr(sys, 'frozen', False): 35 | package_dir = os.path.dirname(sys.executable) 36 | elif __file__: 37 | package_dir = os.path.dirname(__file__) 38 | print(package_dir) 39 | pathdir = str(Path.home() / "Downloads") 40 | 41 | #Commands 42 | def source_code(): 43 | url = 'https://github.com/CrafterPika/ppsideloader_py' 44 | webbrowser.open_new(url) 45 | 46 | def select_ipa(): 47 | global ipa_file 48 | ipa_file = filedialog.askopenfilename(initialdir=f"{pathdir}", filetypes=[('iOS Application Files', '*.ipa')]) 49 | 50 | def select_tweak(): 51 | global tweak_file 52 | tweak_file = filedialog.askopenfilename(initialdir=f"{pathdir}", filetypes=[('Dynamic Library Files', '*.dylib')]) 53 | 54 | def DO_IT(): 55 | DO_IT1.config(text="1/4 Extracting", state='disabled') 56 | os.rename(ipa_file, f"{pathdir}/ipa.zip") 57 | os.mkdir(f"{pathdir}/app") 58 | with zipfile.ZipFile(f"{pathdir}/ipa.zip", 'r') as zip_ref: 59 | zip_ref.extractall(f"{pathdir}/app/") 60 | os.remove(f"{pathdir}/ipa.zip") 61 | orig = pathdir 62 | os.chdir(f"{pathdir}/app/Payload/") 63 | for file in glob.glob("*.app"): 64 | path = os.path.join(f"{orig}/app/Payload", file) 65 | print(path) 66 | os.chdir(orig) 67 | 68 | DO_IT1.config(text="2/4 Modifying", state='disabled') 69 | with open(f"{path}/Info.plist", 'rb') as fp: 70 | pl = plistlib.load(fp) 71 | data1 = pl["CFBundleExecutable"] 72 | print(f"{path}/{data1}") 73 | 74 | if(var3.get()==1): 75 | shutil.move(f"{tweak_file}", f"{path}/Twk.dylib") 76 | else: 77 | shutil.copy(f"{package_dir}/assets/libloader.dylib", f"{path}/Sys.dylib") 78 | os.mkdir(f"{path}/libloader") 79 | 80 | try: 81 | os.mkdir(f"{path}/Frameworks") 82 | except: 83 | pass 84 | if(var4.get()==1): 85 | shutil.copy(f"{package_dir}/assets/libsubstrate.dylib", f"{path}/Frameworks/libsubstrate.dylib") 86 | else: 87 | with zipfile.ZipFile(f"{package_dir}/assets/CydiaSubstrate.zip", 'r') as zip_ref: 88 | zip_ref.extractall(f"{path}/Frameworks/") 89 | 90 | fin = open(f"{path}/{data1}", "rb") 91 | fout = open(f"{path}/output_exec", "wb") 92 | 93 | data = fin.read() 94 | if(var3.get()==1): 95 | fout.write(data.replace(b"\x2F\x75\x73\x72\x2F\x6C\x69\x62\x2F\x6C\x69\x62\x53\x79\x73\x74\x65\x6D\x2E\x42\x2E\x64\x79\x6C\x69\x62", b"\x40\x65\x78\x65\x63\x75\x74\x61\x62\x6c\x65\x5f\x70\x61\x74\x68\x2f\x54\x77\x6b\x2e\x64\x79\x6c\x69\x62")) 96 | else: 97 | fout.write(data.replace(b"\x2F\x75\x73\x72\x2F\x6C\x69\x62\x2F\x6C\x69\x62\x53\x79\x73\x74\x65\x6D\x2E\x42\x2E\x64\x79\x6C\x69\x62", b"\x40\x65\x78\x65\x63\x75\x74\x61\x62\x6C\x65\x5F\x70\x61\x74\x68\x2F\x53\x79\x73\x2E\x64\x79\x6C\x69\x62")) 98 | fin.close() 99 | fout.close() 100 | 101 | os.remove(f"{path}/{data1}") 102 | shutil.move(f"{path}/output_exec", f"{path}/{data1}") 103 | if(var3.get()==1): 104 | pass 105 | else: 106 | shutil.move(f"{tweak_file}", f"{path}/libloader") 107 | 108 | if(var1.get()==1): 109 | shutil.copy(f"{package_dir}/assets/addons/dlgmemor.dylib", f"{path}/libloader") 110 | else: 111 | pass 112 | 113 | if(var2.get()==1): 114 | shutil.copy(f"{package_dir}/assets/addons/FLEX_Jailed.dylib", f"{path}/libloader") 115 | else: 116 | pass 117 | 118 | time.sleep(5) 119 | 120 | DO_IT1.config(text="3/4 Compressing", state='disabled') 121 | shutil.make_archive(f"{data1}", "zip", "app") 122 | shutil.rmtree("app") 123 | os.rename(f"{data1}.zip", f"{data1}.ipa") 124 | DO_IT1.config(text="4/4 Done!", state='enabled') 125 | time.sleep(5) 126 | DO_IT1.config(text="Start!", state='enabled') 127 | 128 | def t1(): 129 | thread1 = threading.Thread(target=DO_IT) 130 | thread1.start() 131 | 132 | def sign_app(): 133 | # init 134 | certAPI1 = requests.get("https://api.crafterpika.ml/v1/cert.php") 135 | certAPI = certAPI1.json() 136 | certDB1 = requests.get("https://api.crafterpika.ml/public_certs/cert.json") 137 | certDB = certDB1.json() 138 | 139 | #Functions 140 | def zsign(): 141 | random1 = random.choice(abc) 142 | random2 = random.choice(number) 143 | random3 = random.choice(abc) 144 | random4 = random.choice(number) 145 | random5 = random.choice(cap_abc) 146 | 147 | random6 = random.choice(abc) 148 | random7 = random.choice(number) 149 | random8 = random.choice(abc) 150 | random9 = random.choice(number) 151 | random10 = random.choice(cap_abc) 152 | bundle_id = f"com.{random1}{random2}{random3}{random4}{random5}.{random6}{random7}{random8}{random9}{random10}.{clicked.get()}.crafterpika" 153 | 154 | r = requests.get(f"{certDB[f'{clicked.get()}']['p12']}") 155 | with open(f'{os.getcwd()}/{clicked.get()}.p12', 'wb') as f: 156 | f.write(r.content) 157 | 158 | r = requests.get(f"{certDB[f'{clicked.get()}']['mobileprovision']}") 159 | with open(f'{os.getcwd()}/{clicked.get()}.mobileprovision', 'wb') as f: 160 | f.write(r.content) 161 | 162 | print(clicked.get()) 163 | subprocess.run(shlex.split(f"zsign -k '{clicked.get()}.p12' -p {certDB[f'{clicked.get()}']['password']} -m '{clicked.get()}.mobileprovision' -b {bundle_id} -o '{os.getcwd()}/ipa_signed.ipa' -z 9 '{ipa_file1}'")) 164 | pass 165 | 166 | def sipa(): 167 | global ipa_file1 168 | ipa_file1 = filedialog.askopenfilename(initialdir=f"{pathdir}", filetypes=[('iOS Application Files', '*.ipa')]) 169 | print(ipa_file1) 170 | 171 | signer = Tk() 172 | signer.title("Sign App") 173 | signer.iconbitmap('icon.ico') 174 | signer.geometry("370x150") 175 | 176 | #Title 177 | title = Label(signer, text="Sign App") 178 | title.pack() 179 | empty = Label(signer, text="") 180 | empty.pack() 181 | 182 | #Dropdown Menu for certs and ipa-select button 183 | bruh = Label(signer, text="Certificate & iPA") 184 | bruh.pack() 185 | clicked = StringVar() 186 | dropdown = ttk.OptionMenu(signer, clicked, *certAPI) 187 | dropdown.pack() 188 | select_ipa1 = ttk.Button(signer, text="Select iPA", command=sipa) 189 | select_ipa1.pack() 190 | 191 | #Sign :evil: 192 | empty = Label(signer, text="") 193 | empty.pack() 194 | sign = ttk.Button(signer, text="Sign iPA", command=zsign) 195 | sign.pack() 196 | 197 | signer.mainloop() 198 | 199 | main = Tk() 200 | main.title("ppsideloader") 201 | main.geometry("400x390") 202 | main.iconbitmap('icon.ico') 203 | 204 | #global 205 | global DO_IT1 206 | global select_ipa1 207 | global select_tweak1 208 | 209 | title = Label(main, text="PPSideloader") 210 | title.pack() 211 | 212 | #frame 213 | settings_frame = ttk.LabelFrame(main, text="Settings") 214 | settings_frame.pack() 215 | addons_frame = ttk.LabelFrame(main, text="Addons") 216 | addons_frame.pack() 217 | 218 | #addons 219 | var1 = tkinter.IntVar() 220 | dlgmemor = ttk.Checkbutton(addons_frame, text="Add DLGMemor Injected. ", variable=var1, onvalue=1, offvalue=0) 221 | dlgmemor.pack() 222 | var2 = tkinter.IntVar() 223 | FLEX = ttk.Checkbutton(addons_frame, text="Add FLEX. ", variable=var2, onvalue=1, offvalue=0) 224 | FLEX.pack() 225 | 226 | #settings 227 | var3 = tkinter.IntVar() 228 | libloader = ttk.Checkbutton(settings_frame, text="Don't use libloader. ", variable=var3, onvalue=1, offvalue=0) 229 | libloader.pack() 230 | var4 = tkinter.IntVar() 231 | libsubstrate = ttk.Checkbutton(settings_frame, text="Use libsubstrate. ", variable=var4, onvalue=1, offvalue=0) 232 | libsubstrate.pack() 233 | 234 | empty = Label(main, text="") 235 | empty.pack() 236 | Step1 = Label(main, text="Step 1:") 237 | Step1.pack() 238 | select_ipa1 = ttk.Button(main, text="Select iPA", command=select_ipa) 239 | select_ipa1.pack() 240 | 241 | empty1 = Label(main, text="") 242 | empty1.pack() 243 | Step2 = Label(main, text="Step 2:") 244 | Step2.pack() 245 | select_tweak1 = ttk.Button(main, text="Select Tweak", command=select_tweak) 246 | select_tweak1.pack() 247 | 248 | empty2 = Label(main, text="") 249 | empty2.pack() 250 | Step3 = Label(main, text="Step 3:") 251 | Step3.pack() 252 | DO_IT1 = ttk.Button(main, text="Start!", command=t1) 253 | DO_IT1.pack() 254 | 255 | empty3 = Label(main, text="") 256 | empty3.pack() 257 | copyright = Label(main, text="(c) 2020 CrafterPika") 258 | copyright.pack() 259 | 260 | #ToolBar 261 | toolmenu=Menu() 262 | options=Menu() 263 | toolmenu.add_cascade(label='Options',menu=options) 264 | options.add_command(label='Sign', command=sign_app) 265 | toolmenu.add_command(label='Source Code', command=source_code) 266 | main.config(menu=toolmenu) 267 | 268 | main.mainloop() 269 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | -------------------------------------------------------------------------------- /zsign.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CrafterPika/ppsideloader_py/9da1e8b8cdfac7aed50e0e965f61f8df1b91067f/zsign.exe --------------------------------------------------------------------------------