From 19347caeaa10cc3b31675239b7639343ea2288a7 Mon Sep 17 00:00:00 2001 From: khcrysalis <97859147+khcrysalis@users.noreply.github.com> Date: Thu, 5 Feb 2026 00:42:57 -0800 Subject: [PATCH] init --- .editorconfig | 16 + .github/ISSUE_TEMPLATE/basic.yml | 12 - .github/ISSUE_TEMPLATE/config.yml | 5 - .github/ISSUE_TEMPLATE/feature.yml | 21 - .github/ISSUE_TEMPLATE/problem.yml | 52 - .github/workflows/build.yml | 906 ------------------ .gitignore | 31 +- CMakeLists.txt | 62 ++ Makefile | 112 +-- README.md | 134 +-- assets/image-1.png | Bin 293729 -> 0 bytes dep_root/.keep | 0 docs/Makefile | 9 - docs/mandoc.css | 269 ------ docs/p1ctl.8 | 109 --- docs/palera1n.1 | 396 -------- include/ANSI-color-codes.h | 85 -- include/palerain.h | 226 ----- include/tui.h | 184 ---- include/xxd-embedded.h | 30 - packaging/control | 22 - packaging/control.macosx | 16 - patches/gpm/001_missing_V_option.patch | 23 - patches/gpm/014_has_mouse_control.patch | 39 - patches/gpm/031_max_consoles.patch | 107 --- patches/gpm/080_cross-compile.patch | 13 - ...ring-literal-and-no-format-arguments.patch | 16 - patches/gpm/093_fix-typos.patch | 133 --- patches/gpm/094_gpm-1.20.7-glibc-2.26-1.patch | 63 -- .../gpm/095_fix-compilation-with-gcc-10.patch | 20 - ...96_fix-compilation-against-musl-libc.patch | 69 -- .../0001-Allow-empty-x509-cert-issuer.patch | 34 - payloads/Pongo.bin | Bin 0 -> 254224 bytes payloads/shellcode.bin | Bin 0 -> 512 bytes payloads/yolo_s8000.bin | Bin 0 -> 2852 bytes payloads/yolo_s8001.bin | Bin 0 -> 4164 bytes payloads/yolo_s8003.bin | Bin 0 -> 2852 bytes payloads/yolo_t7000.bin | Bin 0 -> 2888 bytes payloads/yolo_t7001.bin | Bin 0 -> 2888 bytes payloads/yolo_t8010.bin | Bin 0 -> 4836 bytes payloads/yolo_t8011.bin | Bin 0 -> 4828 bytes payloads/yolo_t8015.bin | Bin 0 -> 4784 bytes resources/Info.plist | 16 + resources/ios-entitlements.xml | 14 + resources/main.exe.manifest | 9 + src/Makefile | 197 ---- src/boyermoore_memmem.c | 59 -- src/chkstk.S | 65 -- src/credits.c | 25 - src/devhelper.c | 405 -------- src/dfuhelper.c | 364 ------- src/exec_checkra1n.c | 206 ---- src/fake_embedded.c | 31 - src/gen/.gitignore | 1 - src/gen/resources | 1 - src/lock_vars.c | 85 -- src/log.c | 107 --- src/main.c | 190 ---- src/main.cpp | 165 ++++ src/obj/.gitignore | 1 - src/obj/gen | 1 - src/optparse.c | 467 --------- src/override_file.c | 50 - src/pongo_helper.c | 283 ------ src/resources/.gitignore | 2 - src/tui_devhelper.c | 220 ----- src/tui_input.c | 166 ---- src/tui_main.c | 256 ----- src/tui_screen_enter_dfu.c | 473 --------- src/tui_screen_enter_recovery.c | 209 ---- src/tui_screen_jailbreak.c | 176 ---- src/tui_screen_main.c | 380 -------- src/tui_screen_options.c | 349 ------- src/ui/app.cpp | 23 + src/ui/app.hpp | 10 + src/usb.xml | 13 - src/usb_iokit.c | 257 ----- src/usb_libusb.c | 269 ------ src/utils/constants.cpp | 3 + src/utils/constants.h | 10 + src/utils/log.h | 17 + {include => src/utils}/paleinfo.h | 4 +- 82 files changed, 374 insertions(+), 8419 deletions(-) create mode 100644 .editorconfig delete mode 100644 .github/ISSUE_TEMPLATE/basic.yml delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature.yml delete mode 100644 .github/ISSUE_TEMPLATE/problem.yml delete mode 100644 .github/workflows/build.yml create mode 100644 CMakeLists.txt delete mode 100644 assets/image-1.png delete mode 100644 dep_root/.keep delete mode 100644 docs/Makefile delete mode 100644 docs/mandoc.css delete mode 100644 docs/p1ctl.8 delete mode 100644 docs/palera1n.1 delete mode 100644 include/ANSI-color-codes.h delete mode 100644 include/palerain.h delete mode 100644 include/tui.h delete mode 100644 include/xxd-embedded.h delete mode 100644 packaging/control delete mode 100644 packaging/control.macosx delete mode 100644 patches/gpm/001_missing_V_option.patch delete mode 100644 patches/gpm/014_has_mouse_control.patch delete mode 100644 patches/gpm/031_max_consoles.patch delete mode 100644 patches/gpm/080_cross-compile.patch delete mode 100644 patches/gpm/092_fix-format-not-a-string-literal-and-no-format-arguments.patch delete mode 100644 patches/gpm/093_fix-typos.patch delete mode 100644 patches/gpm/094_gpm-1.20.7-glibc-2.26-1.patch delete mode 100644 patches/gpm/095_fix-compilation-with-gcc-10.patch delete mode 100644 patches/gpm/096_fix-compilation-against-musl-libc.patch delete mode 100644 patches/mbedtls/0001-Allow-empty-x509-cert-issuer.patch create mode 100644 payloads/Pongo.bin create mode 100644 payloads/shellcode.bin create mode 100644 payloads/yolo_s8000.bin create mode 100644 payloads/yolo_s8001.bin create mode 100644 payloads/yolo_s8003.bin create mode 100644 payloads/yolo_t7000.bin create mode 100644 payloads/yolo_t7001.bin create mode 100644 payloads/yolo_t8010.bin create mode 100644 payloads/yolo_t8011.bin create mode 100644 payloads/yolo_t8015.bin create mode 100644 resources/Info.plist create mode 100644 resources/ios-entitlements.xml create mode 100644 resources/main.exe.manifest delete mode 100644 src/Makefile delete mode 100644 src/boyermoore_memmem.c delete mode 100644 src/chkstk.S delete mode 100644 src/credits.c delete mode 100644 src/devhelper.c delete mode 100644 src/dfuhelper.c delete mode 100644 src/exec_checkra1n.c delete mode 100644 src/fake_embedded.c delete mode 100644 src/gen/.gitignore delete mode 120000 src/gen/resources delete mode 100644 src/lock_vars.c delete mode 100644 src/log.c delete mode 100644 src/main.c create mode 100644 src/main.cpp delete mode 100644 src/obj/.gitignore delete mode 120000 src/obj/gen delete mode 100644 src/optparse.c delete mode 100644 src/override_file.c delete mode 100644 src/pongo_helper.c delete mode 100644 src/resources/.gitignore delete mode 100644 src/tui_devhelper.c delete mode 100644 src/tui_input.c delete mode 100644 src/tui_main.c delete mode 100644 src/tui_screen_enter_dfu.c delete mode 100644 src/tui_screen_enter_recovery.c delete mode 100644 src/tui_screen_jailbreak.c delete mode 100644 src/tui_screen_main.c delete mode 100644 src/tui_screen_options.c create mode 100644 src/ui/app.cpp create mode 100644 src/ui/app.hpp delete mode 100644 src/usb.xml delete mode 100644 src/usb_iokit.c delete mode 100644 src/usb_libusb.c create mode 100644 src/utils/constants.cpp create mode 100644 src/utils/constants.h create mode 100644 src/utils/log.h rename {include => src/utils}/paleinfo.h (98%) diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..deda242 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[Makefile] +indent_style = tab +indent_size = 4 + +[*] + diff --git a/.github/ISSUE_TEMPLATE/basic.yml b/.github/ISSUE_TEMPLATE/basic.yml deleted file mode 100644 index c643bba..0000000 --- a/.github/ISSUE_TEMPLATE/basic.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: No Template -description: Create a standard issue, no template involved. -labels: [palera1n help] -body: - - type: textarea - id: description - attributes: - label: Description - description: - placeholder: Anyone else has issues with ...? If so, I found a solution. - validations: - required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 58ff25e..0000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Mention us on X (formerly known as Twitter) - url: https://twitter.com/palera1n - about: Mention us about your issue if you're not comfortable with using Github issues. diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml deleted file mode 100644 index eb5ecd0..0000000 --- a/.github/ISSUE_TEMPLATE/feature.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Feature Request -description: Request a feature in palera1n! -labels: [enhancement] -body: - - type: textarea - id: feature-request - attributes: - label: Feature Description - description: - placeholder: I want ... to be added to palera1n, because ... - validations: - required: true - - type: textarea - id: detailed-description - attributes: - label: Start going into detail.. - description: - placeholder: I think it should also include ..., because of convenience. - validations: - required: false - \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/problem.yml b/.github/ISSUE_TEMPLATE/problem.yml deleted file mode 100644 index d88762b..0000000 --- a/.github/ISSUE_TEMPLATE/problem.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Create Issue -description: Ask help for palera1n regarding support or generally how it works! -labels: [palera1n help] -body: - - type: input - id: device - attributes: - label: Device - description: What is the device that you're using with palera1n? (iPhone, iPad, iPod Touch, appleTV, iBridge (T2)) - placeholder: iPhone X - validations: - required: true - - type: input - id: version - attributes: - label: Version - description: What is version you're running? (i.e. iOS, iPadOS, tvOS, bridgeOS) - placeholder: iOS 15.6 - validations: - required: true - - type: checkboxes - id: passcode-enabled - attributes: - label: Passcode? - description: Is your passcode enabled? - options: - - label: Passcode is enabled. - required: false - - type: textarea - id: detailed-description - attributes: - label: Start going into detail.. - description: - placeholder: My device couldn't boot jailbroken. I have checked ... using ..., none of the solutions I've been given are working for me. I don't know what to do. - validations: - required: true - - type: checkboxes - id: familiarity - attributes: - label: Familiarity with palera1n - description: Are you familiar with palera1n and how to use it? - options: - - label: I am familiar with palera1n and how to use it! - required: false - - type: checkboxes - id: familiarity-command-line - attributes: - label: Familiarity with CLI - description: Are you familiar with the command-line in anyway? (i.e. Terminal.app, Konsole) - options: - - label: I am familiar with the command-line! - required: false diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 03a9f05..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,906 +0,0 @@ -name: Build palera1n - -on: - push: - paths: - - 'src/**' - - 'docs/**' - - 'patches/**' - - 'include/**' - - 'Makefile' - - 'CMakeLists.txt' - - '.github/workflows/build.yml' - pull_request: - paths: - - 'src/**' - - 'docs/**' - - 'patches/**' - - 'include/**' - - 'Makefile' - - 'CMakeLists.txt' - - '.github/workflows/build.yml' - workflow_dispatch: - -jobs: - build-docs: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install dependencies (packages) - run: | - sudo apt-get -y update - sudo apt-get -y install mandoc make - - - name: Build Documentation - run: | - make -j$(nproc) docs - mkdir -p ready/docs - cp docs/*.html docs/mandoc.css docs/palera1n.1 ready/docs - - - name: Get branch name - id: branch-name - uses: tj-actions/branch-names@v9 - - - name: Upload artifact - if: ${{ github.event_name != 'pull_request' }} - uses: wangyucode/sftp-upload-action@v1.4.8 - with: - host: ${{ secrets.NICKCHAN_FTP_HOST }} - port: ${{ secrets.NICKCHAN_FTP_PORT }} - username: palera1n - password: ${{ secrets.NICKCHAN_FTP_PASS }} - forceUpload: true - dryRun: false - localDir: 'ready/' - remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref_name }}/${{ github.run_number }}" - - build-darwin: - strategy: - matrix: - include: - - arch: x86_64 - gnu_triple: x86_64-apple-darwin - os: macosx - minos: 10.8 - - arch: arm64 - gnu_triple: aarch64-apple-darwin - os: macosx - minos: 11.0 - - arch: arm64 - gnu_triple: aarch64-apple-darwin - os: iphoneos - minos: 7.0 - runs-on: macos-15 - env: - MBEDTLS_VERSION: 3.5.2 - READLINE_VERSION: 8.2 - LIBIMOBILEDEVICE_COMMIT: ed0d66d0341562731bb19928dfe48155509fa7a7 - LIBIRECOVERY_COMMIT: 7ce02c347b7c26e59498e6af31c9da51018d0fa1 - LIBIMOBILEDEVICE_GLUE_COMMIT: 362f7848ac89b74d9dd113b38b51ecb601f76094 - LIBPLIST_COMMIT: 2117b8fdb6b4096455bd2041a63e59a028120136 - LIBUSBMUXD_COMMIT: a7f0543fb1ecb20ac7121c0fd77297200e0e43fc - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Install dependencies (packages) - run: | - sudo /usr/local/bin/pip3 install jsonschema jinja2 - brew install make autoconf automake pkg-config gnu-sed gettext libtool - sudo rm -rf /usr/local/Frameworks/Python* - curl -LO https://github.com/ProcursusTeam/ldid/releases/download/v2.1.5-procursus7/ldid_macosx_x86_64 - sudo install -m755 ldid_macosx_x86_64 /usr/local/bin/ldid - - - name: Download dependencies (embedded binaries) - run: | - echo "SDK=$(xcrun -sdk ${{ matrix.os }} --show-sdk-path)" >> $GITHUB_ENV - - - name: Select correct Xcode - run: | - sudo xcode-select -s /Applications/Xcode_16.2.app - - - name: Setup environment - run: | - mkdir sysroot - echo "DESTDIR=$(pwd)/sysroot" >> $GITHUB_ENV - echo "PREFIX=/usr/local" >> $GITHUB_ENV - echo "PKG_CONFIG_PATH=$(pwd)/sysroot/usr/local/lib/pkgconfig" >> $GITHUB_ENV - echo "CONFIGURE_ARGS=--prefix=/usr/local --disable-shared --enable-static --build=x86_64-apple-darwin --host=${{ matrix.gnu_triple }}" >> $GITHUB_ENV - echo "CC=$(xcrun --find cc)" >> $GITHUB_ENV - echo "CXX=$(xcrun --find c++)" >> $GITHUB_ENV - echo "CPP=$(xcrun --find cc) -E" >> $GITHUB_ENV - echo "CFLAGS=-g -Os -isystem ${{ env.SDK }}/usr/include/c++/v1 -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isysroot ${{ env.SDK }} -isystem $(pwd)/sysroot/usr/local/include -Os -g -flto=full -Wl,-object_path_lto,lto.o -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64" >> $GITHUB_ENV - echo "CPPFLAGS=-g -Os -isystem ${{ env.SDK }}/usr/include/c++/v1 -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isysroot ${{ env.SDK }} -isystem $(pwd)/sysroot/usr/local/include -Wno-error-implicit-function-declaration -Os -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64" >> $GITHUB_ENV - echo "CXXFLAGS=-stdlib=libc++ -g -Os -isystem$(TARGET_SYSROOT)/usr/include/c++/v1 -isysroot ${{ env.SDK }} -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isystem $(pwd)/sysroot/usr/local/include -Os -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64" >> $GITHUB_ENV - echo "LDFLAGS=-g -Wl,-dead_strip -arch ${{ matrix.arch }} -isysroot ${{ env.SDK }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -L$(pwd)/sysroot/usr/local/lib" >> $GITHUB_ENV - echo "CFLAGS_FOR_BUILD=-arch $(uname -m) -isysroot $(xcrun -sdk macosx --show-sdk-path) -Os" >> $GITHUB_ENV - echo "CXXFLAGS_FOR_BUILD=-stdlib=libc++ -arch $(uname -m) -isysroot $(xcrun -sdk macosx --show-sdk-path) -Os" >> $GITHUB_ENV - echo "CPPFLAGS_FOR_BUILD=-arch $(uname -m) -isysroot $(xcrun -sdk macosx --show-sdk-path) -Wno-error-implicit-function-declaration -Os" >> $GITHUB_ENV - echo "LDFLAGS_FOR_BUILD=-Wl,-dead_strip" >> $GITHUB_ENV - - - name: Prepare iPhoneOS environment - if: matrix.os == 'iphoneos' - run: | - echo "FAKE_PLATFORM=2" >> $GITHUB_ENV - echo "FAKE_SDK=7.0" >> $GITHUB_ENV - echo "FAKE_MINOS=7.0" >> $GITHUB_ENV - - - name: Prepare headers - if: matrix.os != 'macosx' - run: | - mkdir -p sysroot/{{,System}/Library/Frameworks,/usr/{local/include/{bsm,objc,os/internal,sys,firehose,CoreFoundation,FSEvents,IOKit/kext,libkern,kern,arm,{mach/,}machine,CommonCrypto,Security,CoreSymbolication,Kernel/{kern,IOKit,libkern},rpc,rpcsvc,xpc/private,ktrace,mach-o,dispatch},lib/pkgconfig,/local/lib}} - MACOSX_SYSROOT=$(xcrun -sdk macosx --show-sdk-path) - TARGET_SYSROOT=$(xcrun -sdk ${{ matrix.os }} --show-sdk-path) - cp -af ${MACOSX_SYSROOT}/usr/include/{arpa,bsm,hfs,net,xpc,netinet,servers,timeconv.h,launch.h} sysroot/usr/local/include - cp -af ${MACOSX_SYSROOT}/usr/include/objc/objc-runtime.h sysroot/usr/local/include/objc - cp -af ${MACOSX_SYSROOT}/usr/include/libkern/{OSDebug.h,OSKextLib.h,OSReturn.h,OSThermalNotification.h,OSTypes.h,machine} sysroot/usr/local/include/libkern - cp -af ${MACOSX_SYSROOT}/usr/include/kern sysroot/usr/local/include - cp -af ${MACOSX_SYSROOT}/usr/include/sys/{tty*,ptrace,kern*,random,reboot,user,vnode,disk,vmmeter,conf}.h sysroot/usr/local/include/sys - cp -af ${MACOSX_SYSROOT}/System/Library/Frameworks/Kernel.framework/Versions/Current/Headers/sys/disklabel.h sysroot/usr/local/include/sys - cp -af ${MACOSX_SYSROOT}/System/Library/Frameworks/IOKit.framework/Headers/{AppleConvergedIPCKeys.h,IOBSD.h,IOCFBundle.h,IOCFPlugIn.h,IOCFURLAccess.h,IOKitServer.h,IORPC.h,IOSharedLock.h,IOUserServer.h,audio,avc,firewire,graphics,hid,hidsystem,i2c,iokitmig.h,kext,ndrvsupport,network,ps,pwr_mgt,sbp2,scsi,serial,storage,stream,usb,video} sysroot/usr/local/include/IOKit - cp -af ${MACOSX_SYSROOT}/System/Library/Frameworks/Security.framework/Headers/{mds_schema,oidsalg,SecKeychainSearch,certextensions,Authorization,eisl,SecDigestTransform,SecKeychainItem,oidscrl,cssmcspi,CSCommon,cssmaci,SecCode,CMSDecoder,oidscert,SecRequirement,AuthSession,SecReadTransform,oids,cssmconfig,cssmkrapi,SecPolicySearch,SecAccess,cssmtpi,SecACL,SecEncryptTransform,cssmapi,cssmcli,mds,x509defs,oidsbase,SecSignVerifyTransform,cssmspi,cssmkrspi,SecTask,cssmdli,SecAsn1Coder,cssm,SecTrustedApplication,SecCodeHost,SecCustomTransform,oidsattr,SecIdentitySearch,cssmtype,SecAsn1Types,emmtype,SecTransform,SecTrustSettings,SecStaticCode,emmspi,SecTransformReadTransform,SecKeychain,SecDecodeTransform,CodeSigning,AuthorizationPlugin,cssmerr,AuthorizationTags,CMSEncoder,SecEncodeTransform,SecureDownload,SecAsn1Templates,AuthorizationDB,SecCertificateOIDs,cssmapple}.h sysroot/usr/local/include/Security - cp -af ${MACOSX_SYSROOT}/usr/include/{ar,bootstrap,launch,libc,libcharset,localcharset,nlist,NSSystemDirectories,tzfile,vproc}.h sysroot/usr/local/include - cp -af ${MACOSX_SYSROOT}/usr/include/mach/{*.defs,{mach_vm,shared_region}.h} sysroot/usr/local/include/mach - cp -af ${MACOSX_SYSROOT}/usr/include/mach/machine/*.defs sysroot/usr/local/include/mach/machine - cp -af ${MACOSX_SYSROOT}/usr/include/rpc/pmap_clnt.h sysroot/usr/local/include/rpc - cp -af ${MACOSX_SYSROOT}/usr/include/rpcsvc/yp{_prot,clnt}.h sysroot/usr/local/include/rpcsvc - cp -af ${TARGET_SYSROOT}/usr/include/mach/machine/thread_state.h sysroot/usr/local/include/mach/machine - cp -af ${TARGET_SYSROOT}/usr/include/mach/arm sysroot/usr/local/include/mach - cp -af ${MACOSX_SYSROOT}/System/Library/Frameworks/IOKit.framework/Headers/* sysroot/usr/local/include/IOKit - gsed -E s/'__IOS_PROHIBITED|__TVOS_PROHIBITED|__WATCHOS_PROHIBITED'//g < ${TARGET_SYSROOT}/usr/include/stdlib.h > sysroot/usr/local/include/stdlib.h - gsed -E s/'__IOS_PROHIBITED|__TVOS_PROHIBITED|__WATCHOS_PROHIBITED'//g < ${TARGET_SYSROOT}/usr/include/time.h > sysroot/usr/local/include/time.h - gsed -E s/'__IOS_PROHIBITED|__TVOS_PROHIBITED|__WATCHOS_PROHIBITED'//g < ${TARGET_SYSROOT}/usr/include/unistd.h > sysroot/usr/local/include/unistd.h - gsed -E s/'__IOS_PROHIBITED|__TVOS_PROHIBITED|__WATCHOS_PROHIBITED'//g < ${TARGET_SYSROOT}/usr/include/mach/task.h > sysroot/usr/local/include/mach/task.h - gsed -E s/'__IOS_PROHIBITED|__TVOS_PROHIBITED|__WATCHOS_PROHIBITED'//g < ${TARGET_SYSROOT}/usr/include/mach/mach_host.h > sysroot/usr/local/include/mach/mach_host.h - gsed -E s/'__IOS_PROHIBITED|__TVOS_PROHIBITED|__WATCHOS_PROHIBITED'//g < ${TARGET_SYSROOT}/usr/include/ucontext.h > sysroot/usr/local/include/ucontext.h - gsed -E s/'__IOS_PROHIBITED|__TVOS_PROHIBITED|__WATCHOS_PROHIBITED'//g < ${TARGET_SYSROOT}/usr/include/signal.h > sysroot/usr/local/include/signal.h - gsed -E /'__API_UNAVAILABLE'/d < ${TARGET_SYSROOT}/usr/include/pthread.h > sysroot/usr/local/include/pthread.h - gsed -i -E s/'__API_UNAVAILABLE\(.*\)'// sysroot/usr/local/include/IOKit/IOKitLib.h - - - name: Check dependencies cache - run: | - echo "target: ${{ matrix.os }}-${{ matrix.arch }}" > cache.txt - echo "mbedtls ${{ env.MBEDTLS_VERSION }}" >> cache.txt - echo "readline: ${{ env.READLINE_VERSION }}" >> cache.txt - echo "libimobiledevice: ${{ env.LIBIMOBILEDEVICE_COMMIT }}" >> cache.txt - echo "libirecovery: ${{ env.LIBIRECOVERY_COMMIT }}" >> cache.txt - echo "libimobiledevice-glue: ${{ env.LIBIMOBILEDEVICE_GLUE_COMMIT }}" >> cache.txt - echo "libplist: ${{ env.LIBPLIST_COMMIT }}" >> cache.txt - echo "libusbmuxd: ${{ env.LIBUSBMUXD_COMMIT }}" >> cache.txt - echo "cc: $($(xcrun --find cc) --version)" >> cache.txt - echo "CACHE_TXT_CHECKSUM=sysroot-$(shasum -a 512 cache.txt | cut -d' ' -f1)" >> $GITHUB_ENV - - - name: Download cached sysroot - id: sysroot_cache - uses: actions/cache@v3 - with: - path: sysroot-${{ env.CACHE_TXT_CHECKSUM }}.txz - key: sysroot-${{ env.CACHE_TXT_CHECKSUM }} - - - name: Extract cached sysroot - if: steps.sysroot_cache.outputs.cache-hit == 'true' - run: | - xz -dcT0 sysroot-${{ env.CACHE_TXT_CHECKSUM }}.txz | tar -x - - - name: Setup sysroot - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - mkdir -p $(pwd)/sysroot/usr/local/lib - ln -sf $(pwd)/sysroot/usr/local/lib{,64} - - - name: Download dependencies (source code) - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - curl -LOOOOOO \ - https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v${{ env.MBEDTLS_VERSION }}.tar.gz \ - https://mirror-hk.koddos.net/gnu/readline/readline-${{ env.READLINE_VERSION }}.tar.gz - - tar -xf v${{ env.MBEDTLS_VERSION }}.tar.gz - tar -xf readline-${{ env.READLINE_VERSION }}.tar.gz - git clone --depth=1 https://github.com/libimobiledevice/libplist - git clone --depth=1 https://github.com/libimobiledevice/libimobiledevice-glue - git clone --depth=1 https://github.com/libimobiledevice/libirecovery - git clone --depth=1 https://github.com/libimobiledevice/libusbmuxd - git clone --depth=1 https://github.com/libimobiledevice/libimobiledevice - cd libplist && git fetch origin ${{ env.LIBPLIST_COMMIT }} && git reset --hard ${{ env.LIBPLIST_COMMIT }} && cd .. - cd libirecovery && git fetch origin ${{ env.LIBIRECOVERY_COMMIT }} && git reset --hard ${{ env.LIBIRECOVERY_COMMIT }} && cd .. - cd libimobiledevice-glue && git fetch origin ${{ env.LIBIMOBILEDEVICE_GLUE_COMMIT }} && git reset --hard ${{ env.LIBIMOBILEDEVICE_GLUE_COMMIT }} && cd .. - cd libimobiledevice && git fetch origin ${{ env.LIBIMOBILEDEVICE_COMMIT }} && git reset --hard ${{ env.LIBIMOBILEDEVICE_COMMIT }} && cd .. - cd libusbmuxd && git fetch origin ${{ env.LIBUSBMUXD_COMMIT }} && git reset --hard ${{ env.LIBUSBMUXD_COMMIT }} && cd .. - - - name: Build Mbed TLS - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd mbedtls-${{ env.MBEDTLS_VERSION }} - cat ../patches/mbedtls/0001-Allow-empty-x509-cert-issuer.patch | patch -sN -d . -p1 - mkdir build - cd build - SDKROOT="${{ env.SDK }}" cmake .. \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_CROSSCOMPILING=true \ - -DCMAKE_SYSTEM_NAME=Darwin \ - -DCMAKE_C_COMPILER="${{ env.CC }}" \ - -DCMAKE_C_FLAGS='${{ env.CFLAGS }}' \ - -DCMAKE_FIND_ROOT_PATH="${{ env.DESTDIR }}" \ - -DCMAKE_INSTALL_PREFIX="${{ env.PREFIX }}" \ - -DMBEDTLS_PYTHON_EXECUTABLE="/usr/local/bin/python3" \ - -DENABLE_TESTING=OFF \ - -DENABLE_PROGRAMS=OFF \ - -DMBEDTLS_FATAL_WARNINGS=OFF \ - -DCMAKE_INSTALL_SYSCONFDIR="/etc" - gmake -j$(sysctl -n hw.ncpu) \ - SDKROOT="${{ env.SDK }}" - gmake -j$(sysctl -n hw.ncpu) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build readline - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd readline-${{ env.READLINE_VERSION }} - CC=clang CXX=clang++ ./configure ${{ env.CONFIGURE_ARGS }} ac_cv_type_sig_atomic_t=no - gmake -j$(sysctl -n hw.ncpu) - gmake -j$(sysctl -n hw.ncpu) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build libplist - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd libplist - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} --without-cython - gmake -j$(sysctl -n hw.ncpu) - gmake -j$(sysctl -n hw.ncpu) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build libimobiledevice-glue - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd libimobiledevice-glue - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} - gmake -j$(sysctl -n hw.ncpu) - gmake -j$(sysctl -n hw.ncpu) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build libirecovery - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - sudo cp -a sysroot/usr/local/* /usr/local - cd libirecovery - autoreconf -fiv - if [ "${{ matrix.os }}" != "macosx" ]; then - gsed -i '/case kIOUSBTransactionTimeout/d' src/libirecovery.c - fi - ./configure ${{ env.CONFIGURE_ARGS }} - echo -e 'all:\ninstall:' > tools/Makefile - make -j$(sysctl -n hw.ncpu) LIBS="-lncurses" - make -j$(sysctl -n hw.ncpu) install DESTDIR=${{ env.DESTDIR }} - install -m644 src/.libs/libirecovery-1.0.a ${{ env.DESTDIR }}${{ env.PREFIX }}/lib - cd .. - - - name: Build libusbmuxd - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd libusbmuxd - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} - gmake -j$(sysctl -n hw.ncpu) - gmake -j$(sysctl -n hw.ncpu) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build libimobiledevice - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd libimobiledevice - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} --with-mbedtls --disable-debug --disable-wireless-pairing - echo -e 'all:\ninstall:' > tools/Makefile - gmake -j$(sysctl -n hw.ncpu) - gmake -j$(sysctl -n hw.ncpu) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build palera1n - run: | - cp -a sysroot/${{ env.PREFIX }}/{include,lib} dep_root - find dep_root -name '*.dylib' -delete - find dep_root -name '*.la' -delete - gmake -j$(sysctl -n hw.ncpu) ROOTFUL=1 - cp src/palera1n palera1n-${{ matrix.os }}-${{ matrix.arch }} - dsymutil palera1n-${{ matrix.os }}-${{ matrix.arch }} - strip palera1n-${{ matrix.os }}-${{ matrix.arch }} - - - name: Build palera1n (Development) - run: | - gmake -j$(sysctl -n hw.ncpu) clean - gmake -j$(sysctl -n hw.ncpu) DEV_BUILD=1 TUI=1 ROOTFUL=1 - cp src/palera1n palera1n-${{ matrix.os }}-${{ matrix.arch }}.development - - - name: Prepare artifact - run: | - mkdir -p ready/build_depends - tar -zcf ready/build_depends/dep_root-${{ matrix.os }}-${{ matrix.arch }}.tgz dep_root - if [ "${{ matrix.os }}" == "macosx" ]; then - ldid -S palera1n-${{ matrix.os }}-${{ matrix.arch }}{,.development} - else - ldid -Ssrc/usb.xml palera1n-${{ matrix.os }}-${{ matrix.arch }}{,.development} - fi - - - name: Get branch name - id: branch-name - uses: tj-actions/branch-names@v9 - - - name: Upload artifact - if: ${{ github.event_name != 'pull_request' }} - uses: wangyucode/sftp-upload-action@v1.4.8 - with: - host: ${{ secrets.NICKCHAN_FTP_HOST }} - port: ${{ secrets.NICKCHAN_FTP_PORT }} - username: palera1n - password: ${{ secrets.NICKCHAN_FTP_PASS }} - forceUpload: true - dryRun: false - localDir: 'ready/' - remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref_name }}/${{ github.run_number }}" - - - name: Upload ${{ matrix.os }} thin ${{ matrix.arch }} build - if: ${{ github.event_name != 'pull_request' }} - uses: actions/upload-artifact@v4 - with: - name: palera1n-${{ matrix.os }}-${{ matrix.arch }} - path: palera1n-${{ matrix.os }}-${{ matrix.arch }} - retention-days: 1 - - - name: Upload ${{ matrix.os }} thin ${{ matrix.arch }} build (Development) - if: ${{ github.event_name != 'pull_request' }} - uses: actions/upload-artifact@v4 - with: - name: palera1n-${{ matrix.os }}-${{ matrix.arch }}.development - path: palera1n-${{ matrix.os }}-${{ matrix.arch }}.development - retention-days: 1 - - - - name: Upload ${{ matrix.os }} thin ${{ matrix.arch }} debug symbols - if: ${{ github.event_name != 'pull_request' }} - uses: actions/upload-artifact@v4 - with: - name: palera1n-${{ matrix.os }}-${{ matrix.arch }}.dSYM - path: palera1n-${{ matrix.os }}-${{ matrix.arch }}.dSYM - retention-days: 1 - - - name: Generate cached sysroot archive - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - tar -c sysroot | xz -zce9T 0 > sysroot-${{ env.CACHE_TXT_CHECKSUM }}.txz - - darwin-dist: - if: ${{ github.event_name != 'pull_request' }} - runs-on: macos-latest - needs: build-darwin - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Setup Procursus - uses: beerpiss/procursus-action@v2.0.2 - with: - packages: sed coreutils - cache: true - mirror: 'https://apt.procurs.us/' - - - name: Download all Darwin artifacts - uses: actions/download-artifact@v4 - - - name: Prepare artifact - run: | - lipo -create -arch arm64 ./palera1n-macosx-arm64/palera1n-macosx-arm64 -arch x86_64 ./palera1n-macosx-x86_64/palera1n-macosx-x86_64 -output palera1n-macos - lipo -create -arch arm64 ./palera1n-macosx-arm64.development/palera1n-macosx-arm64.development -arch x86_64 ./palera1n-macosx-x86_64.development/palera1n-macosx-x86_64.development -output palera1n-macos.development - mkdir -p palera1n-macos.dSYM/Contents/Resources/DWARF - cp ./palera1n-macosx-x86_64.dSYM/Contents/Info.plist palera1n-macos.dSYM/Contents - lipo -create -arch arm64 palera1n-macosx-arm64.dSYM/Contents/Resources/DWARF/palera1n-macosx-arm64 -arch x86_64 palera1n-macosx-x86_64.dSYM/Contents/Resources/DWARF/palera1n-macosx-x86_64 -output palera1n-macos.dSYM/Contents/Resources/DWARF/palera1n-macos - mkdir -p ready/{debian,binaries,debug_symbols,binaries_development} - cp palera1n-macos.development ready/binaries_development/palera1n-macos-universal.development - cp palera1n-macos ready/binaries/palera1n-macos-universal - cp ./palera1n-macosx-x86_64/palera1n-macosx-x86_64 ready/binaries/palera1n-macos-x86_64 - cp ./palera1n-macosx-arm64/palera1n-macosx-arm64 ready/binaries/palera1n-macos-arm64 - cp ./palera1n-iphoneos-arm64/palera1n-iphoneos-arm64 ready/binaries/palera1n-iphoneos-arm64 - cp ./palera1n-macosx-x86_64.development/palera1n-macosx-x86_64.development ready/binaries_development/palera1n-macos-x86_64.development - cp ./palera1n-macosx-arm64.development/palera1n-macosx-arm64.development ready/binaries_development/palera1n-macos-arm64.development - cp ./palera1n-iphoneos-arm64.development/palera1n-iphoneos-arm64.development ready/binaries_development/palera1n-iphoneos-arm64.development - zip -r9 ready/debug_symbols/palera1n-iphoneos-arm64.dSYM.zip palera1n-iphoneos-arm64.dSYM - zip -r9 ready/debug_symbols/palera1n-macosx-arm64.dSYM.zip palera1n-macosx-arm64.dSYM - zip -r9 ready/debug_symbols/palera1n-macosx-x86_64.dSYM.zip palera1n-macosx-x86_64.dSYM - zip -r9 ready/debug_symbols/palera1n-macos.dSYM.zip palera1n-macos.dSYM - - - name: Build debs - run: | - make -j$(sysctl -n hw.ncpu) docs - version=$(git describe --dirty --tags --abbrev=7 | sed 's|^v||' | sed 's|-beta|~beta|') - - # Darwin x86_64 - mkdir -p stage/DEBIAN - mkdir -p stage/opt/procursus/bin - mkdir -p stage/opt/procursus/usr/share/man/man1 - cp packaging/control.macosx stage/DEBIAN/control - - gsed 's|@DEB_ARCH@|darwin-amd64|g' -i stage/DEBIAN/control - gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control - - ginstall -Dm644 ready/binaries/palera1n-macos-x86_64 stage/opt/procursus/bin/palera1n - zstd -c19 docs/palera1n.1 > stage/opt/procursus/usr/share/man/man1/palera1n.1.zst - chmod 644 stage/opt/procursus/usr/share/man/man1/palera1n.1.zst - chmod 755 stage/opt/procursus/bin/palera1n - - dpkg-deb --root-owner-group -Zzstd -b stage palera1n_darwin-amd64.deb - rm -rf stage - - # Darwin arm64 - mkdir -p stage/DEBIAN - mkdir -p stage/opt/procursus/bin - mkdir -p stage/opt/procursus/usr/share/man/man1 - cp packaging/control.macosx stage/DEBIAN/control - - gsed 's|@DEB_ARCH@|darwin-arm64|g' -i stage/DEBIAN/control - gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control - - ginstall -Dm644 ready/binaries/palera1n-macos-arm64 stage/opt/procursus/bin/palera1n - zstd -c19 docs/palera1n.1 > stage/opt/procursus/usr/share/man/man1/palera1n.1.zst - chmod 644 stage/opt/procursus/usr/share/man/man1/palera1n.1.zst - chmod 755 stage/opt/procursus/bin/palera1n - - dpkg-deb --root-owner-group -Zzstd -b stage palera1n_darwin-arm64.deb - rm -rf stage - - # iPhoneOS - mkdir -p stage/DEBIAN - mkdir -p stage/usr/bin - mkdir -p stage/usr/share/man/man1 - cp packaging/control stage/DEBIAN/control - - gsed 's|@DEB_ARCH@|iphoneos-arm|g' -i stage/DEBIAN/control - gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control - - ginstall -Dm644 ready/binaries/palera1n-iphoneos-arm64 stage/usr/bin/palera1n - zstd -c19 docs/palera1n.1 > stage/usr/share/man/man1/palera1n.1.zst - chmod 644 stage/usr/share/man/man1/palera1n.1.zst - chmod 755 stage/usr/bin/palera1n - - dpkg-deb --root-owner-group -Zzstd -b stage palera1n_iphoneos-arm.deb - rm -rf stage - - # iPhoneOS (rootless) - mkdir -p stage/DEBIAN - mkdir -p stage/var/jb/usr/bin - mkdir -p stage/var/jb/usr/share/man/man1 - cp packaging/control stage/DEBIAN/control - - gsed 's|@DEB_ARCH@|iphoneos-arm64|g' -i stage/DEBIAN/control - gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control - - ginstall -Dm644 ready/binaries/palera1n-iphoneos-arm64 stage/var/jb/usr/bin/palera1n - zstd -c19 docs/palera1n.1 > stage/var/jb/usr/share/man/man1/palera1n.1.zst - chmod 644 stage/var/jb/usr/share/man/man1/palera1n.1.zst - chmod 755 stage/var/jb/usr/bin/palera1n - - dpkg-deb --root-owner-group -Zzstd -b stage palera1n_iphoneos-arm64.deb - rm -rf stage - - mv palera1n*.deb ready/debian - - - name: Save build tag - run: echo "$(git describe --dirty --tags --abbrev=7 | sed 's|-dirty||')" > build-tag.txt - - - name: Upload build tag - uses: actions/upload-artifact@v4 - with: - name: build-tag - path: build-tag.txt - - - name: Get branch name - id: branch-name - uses: tj-actions/branch-names@v9 - - - name: Upload artifact - if: ${{ github.event_name != 'pull_request' }} - uses: wangyucode/sftp-upload-action@v1.4.8 - with: - host: ${{ secrets.NICKCHAN_FTP_HOST }} - port: ${{ secrets.NICKCHAN_FTP_PORT }} - username: palera1n - password: ${{ secrets.NICKCHAN_FTP_PASS }} - forceUpload: true - dryRun: false - localDir: 'ready/' - remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref_name }}/${{ github.run_number }}" - - build-Linux: - strategy: - matrix: - triple: - - i486-linux-musl - - x86_64-linux-musl - - armel-linux-musleabi - - aarch64-linux-musl - runs-on: ubuntu-latest - env: - MBEDTLS_VERSION: 3.5.2 - LIBUSB_VERSION: 1.0.27 - READLINE_VERSION: 8.2 - GPM_VERSION: 1.20.7 - LIBIMOBILEDEVICE_COMMIT: ed0d66d0341562731bb19928dfe48155509fa7a7 - LIBIRECOVERY_COMMIT: 7ce02c347b7c26e59498e6af31c9da51018d0fa1 - LIBIMOBILEDEVICE_GLUE_COMMIT: 362f7848ac89b74d9dd113b38b51ecb601f76094 - USBMUXD_COMMIT: bc0b91ca856811f4393318dc83db6dc3c1ac326d - LIBPLIST_COMMIT: 2117b8fdb6b4096455bd2041a63e59a028120136 - LIBUSBMUXD_COMMIT: a7f0543fb1ecb20ac7121c0fd77297200e0e43fc - - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Install build dependencies (packages) - run: | - sudo apt-get remove -y libssl-dev libreadline-dev - sudo apt-get install -y pkg-config autoconf automake autopoint mandoc - sudo pip3 install jsonschema jinja2 - - - name: Download toolchain checksum - run: | - curl -u ${{ secrets.ACTIONS_RESOURCES_LOGIN }} -LO https://static.palera.in/action-resources/musl-cross/SHA512SUMS - echo "TOOLCHAIN_CHECKSUM="$(grep ${{ matrix.triple }}-cross.tar.zst SHA512SUMS | cut -d' ' -f1) >> $GITHUB_ENV - - - name: Download toolchain (cached) - id: toolchain_cache - uses: actions/cache@v3 - with: - path: ${{ matrix.triple }}-cross.tar.zst - key: ${{ matrix.triple }}-${{ env.TOOLCHAIN_CHECKSUM }}-toolchain - - - name: Download toolchain - if: steps.toolchain_cache.outputs.cache-hit != 'true' - run: | - curl -u ${{ secrets.ACTIONS_RESOURCES_LOGIN }} -LO https://static.palera.in/action-resources/musl-cross/${{ matrix.triple }}-cross.tar.zst - - - name: Setup environment - run: | - tar --zstd -xf ${{ matrix.triple }}-cross.tar.zst - mkdir sysroot - echo "$(pwd)/${{ matrix.triple }}-cross/bin" >> $GITHUB_PATH - case ${{ matrix.triple }} in - i486-linux-musl) - echo "CHECKRA1N_NAME=linux-x86" >> $GITHUB_ENV - echo "ARCH_NAME=i386" >> $GITHUB_ENV - ;; - x86_64-linux-musl) - echo "CHECKRA1N_NAME=linux-x86_64" >> $GITHUB_ENV - echo "ARCH_NAME=amd64" >> $GITHUB_ENV - ;; - armel-linux-musleabi) - echo "CHECKRA1N_NAME=linux-armel" >> $GITHUB_ENV - echo "ARCH_NAME=armel" >> $GITHUB_ENV - ;; - aarch64-linux-musl) - echo "CHECKRA1N_NAME=linux-arm64" >> $GITHUB_ENV - echo "ARCH_NAME=arm64" >> $GITHUB_ENV - ;; - esac - echo "PKG_CONFIG_PATH=$(pwd)/sysroot/usr/local/lib/pkgconfig" >> $GITHUB_ENV - echo "CFLAGS=-g -fdata-sections -ffunction-sections -I$(pwd)/sysroot/usr/local/include -L$(pwd)/sysroot/usr/local/lib -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64" >> $GITHUB_ENV - echo "CXXFLAGS=-g -fdata-sections -ffunction-sections -I$(pwd)/sysroot/usr/local/include -L$(pwd)/sysroot/usr/local/lib -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64" >> $GITHUB_ENV - echo "LDFLAGS=-g -Wl,--gc-sections -fdata-sections -ffunction-sections -I$(pwd)/sysroot/usr/local/include -L$(pwd)/sysroot/usr/local/lib" >> $GITHUB_ENV - echo "INSTALL=$(command -v install) --strip-program=${{ matrix.triple }}-strip" >> $GITHUB_ENV - echo "DESTDIR=$(pwd)/sysroot" >> $GITHUB_ENV - echo "PREFIX=/usr/local" >> $GITHUB_ENV - echo "CONFIGURE_ARGS=--build=x86_64-linux-gnu --host=${{ matrix.triple }} --prefix=/usr/local --disable-shared --enable-static" >> $GITHUB_ENV - echo "CROSS_COMPILE=${{ matrix.triple }}-" >> $GITHUB_ENV - - - name: Check dependencies cache - run: | - echo "target: ${{ matrix.triple }}" > cache.txt - echo "mbedtls ${{ env.MBEDTLS_VERSION }}" >> cache.txt - echo "readline: ${{ env.READLINE_VERSION }}" >> cache.txt - echo "libimobiledevice: ${{ env.LIBIMOBILEDEVICE_COMMIT }}" >> cache.txt - echo "libirecovery: ${{ env.LIBIRECOVERY_COMMIT }}" >> cache.txt - echo "libimobiledevice-glue: ${{ env.LIBIMOBILEDEVICE_GLUE_COMMIT }}" >> cache.txt - echo "libplist: ${{ env.LIBPLIST_COMMIT }}" >> cache.txt - echo "libusbmuxd: ${{ env.LIBUSBMUXD_COMMIT }}" >> cache.txt - echo "usbmuxd: ${{ env.USBMUXD_COMMIT }}" >> cache.txt - echo "cc: $(${{ env.CROSS_COMPILE }}gcc --version)" >> cache.txt - echo "CACHE_TXT_CHECKSUM=sysroot-$(sha512sum cache.txt | cut -d' ' -f1)" >> $GITHUB_ENV - - - name: Download cached sysroot - id: sysroot_cache - uses: actions/cache@v3 - with: - path: sysroot-${{ env.CACHE_TXT_CHECKSUM }}.txz - key: sysroot-${{ env.CACHE_TXT_CHECKSUM }} - - - name: Extract cached sysroot - if: steps.sysroot_cache.outputs.cache-hit == 'true' - run: | - xz -dcT0 sysroot-${{ env.CACHE_TXT_CHECKSUM }}.txz | tar -x - - - name: Setup sysroot - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - mkdir -p $(pwd)/sysroot/usr/local/lib - ln -sf $(pwd)/sysroot/usr/local/lib{,64} - - - name: Download dependencies (source code) - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - curl -LOOOOOOO \ - https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v${{ env.MBEDTLS_VERSION }}.tar.gz \ - https://github.com/libusb/libusb/releases/download/v${{ env.LIBUSB_VERSION }}/libusb-${{ env.LIBUSB_VERSION }}.tar.bz2 \ - https://mirror-hk.koddos.net/gnu/readline/readline-${{ env.READLINE_VERSION }}.tar.gz \ - https://github.com/telmich/gpm/archive/refs/tags/${{ env.GPM_VERSION }}.tar.gz - - tar -xf v${{ env.MBEDTLS_VERSION }}.tar.gz - tar -xjf libusb-${{ env.LIBUSB_VERSION }}.tar.bz2 - tar -xf readline-${{ env.READLINE_VERSION }}.tar.gz - tar -xf ${{ env.GPM_VERSION }}.tar.gz - git clone --depth=1 https://github.com/libimobiledevice/libplist - git clone --depth=1 https://github.com/libimobiledevice/libimobiledevice-glue - git clone --depth=1 https://github.com/libimobiledevice/libirecovery - git clone --depth=1 https://github.com/libimobiledevice/libusbmuxd - git clone --depth=1 https://github.com/libimobiledevice/libimobiledevice - git clone --depth=1 https://github.com/libimobiledevice/usbmuxd - cd libplist && git fetch origin ${{ env.LIBPLIST_COMMIT }} && git reset --hard ${{ env.LIBPLIST_COMMIT }} && cd .. - cd libirecovery && git fetch origin ${{ env.LIBIRECOVERY_COMMIT }} && git reset --hard ${{ env.LIBIRECOVERY_COMMIT }} && cd .. - cd libimobiledevice-glue && git fetch origin ${{ env.LIBIMOBILEDEVICE_GLUE_COMMIT }} && git reset --hard ${{ env.LIBIMOBILEDEVICE_GLUE_COMMIT }} && cd .. - cd usbmuxd && git fetch origin ${{ env.USBMUXD_COMMIT }} && git reset --hard ${{ env.USBMUXD_COMMIT }} && cd .. - cd libimobiledevice && git fetch origin ${{ env.LIBIMOBILEDEVICE_COMMIT }} && git reset --hard ${{ env.LIBIMOBILEDEVICE_COMMIT }} && cd .. - cd libusbmuxd && git fetch origin ${{ env.LIBUSBMUXD_COMMIT }} && git reset --hard ${{ env.LIBUSBMUXD_COMMIT }} && cd .. - - - name: Build Mbed TLS - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd mbedtls-${{ env.MBEDTLS_VERSION }} - cat ../patches/mbedtls/0001-Allow-empty-x509-cert-issuer.patch | patch -sN -d . -p1 - mkdir build - if [ "${{ matrix.triple }}" = "i486-linux-musl" ]; then sed -i '/define MBEDTLS_AESNI_C/d' include/mbedtls/mbedtls_config.h; fi - cd build - cmake .. \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_CROSSCOMPILING=true \ - -DCMAKE_SYSTEM_NAME=Linux \ - -DCMAKE_SYSTEM_PROCESSOR=$(echo ${{ matrix.triple }} | cut -d- -f1) \ - -DCMAKE_C_COMPILER='${{ env.CROSS_COMPILE }}gcc' \ - -DCMAKE_C_FLAGS='${{ env.CFLAGS }}' \ - -DCMAKE_CXX_FLAGS='${{ env.CXXFLAGS }}' \ - -DCMAKE_FIND_ROOT_PATH="${{ env.DESTDIR }}" \ - -DCMAKE_INSTALL_PREFIX="${{ env.PREFIX }}" \ - -DENABLE_TESTING=OFF \ - -DENABLE_PROGRAMS=OFF \ - -DCMAKE_INSTALL_SYSCONFDIR="/etc" - make -j$(nproc) - make -j$(nproc) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build libusb - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd libusb-${{ env.LIBUSB_VERSION }} - ./configure ${{ env.CONFIGURE_ARGS }} --disable-udev - make -j$(nproc) - make -j$(nproc) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build readline - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd readline-${{ env.READLINE_VERSION }} - ./configure ${{ env.CONFIGURE_ARGS }} - make -j$(nproc) - make -j$(nproc) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build GPM - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd gpm-${{ env.GPM_VERSION }} - cat ../patches/gpm/*.patch | patch -sN -d . -p1 - ./autogen.sh - ./configure \ - ${{ env.CONFIGURE_ARGS }} - gmake -j$(sysctl -n hw.ncpu) - gmake -j$(sysctl -n hw.ncpu) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build libplist - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd libplist - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} --without-cython - make -j$(nproc) - make -j$(nproc) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build libimobiledevice-glue - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd libimobiledevice-glue - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} - make -j$(nproc) - make -j$(nproc) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build libirecovery (sorta) - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - sudo mv /usr/local /usr/local.bak - sudo ln -s ${{ env.DESTDIR }}${{ env.PREFIX }} /usr/local - cd libirecovery - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} - echo -e 'all:\ninstall:' > tools/Makefile - make -ij$(nproc) - make -ij$(nproc) install DESTDIR=${{ env.DESTDIR }} - install -m644 src/.libs/libirecovery-1.0.a ${{ env.DESTDIR }}${{ env.PREFIX }}/lib - cd .. - - - name: Build libusbmuxd - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd libusbmuxd - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} - make -j$(nproc) - make -j$(nproc) install DESTDIR=${{ env.DESTDIR }} - cd .. - - - name: Build libimobiledevice - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd libimobiledevice - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} --with-mbedtls --disable-debug --disable-wireless-pairing - echo -e 'all:\ninstall:' > tools/Makefile - make -j$(nproc) - make -j$(nproc) install DESTDIR=${{ env.DESTDIR }} - cd .. - sudo rm /usr/local - sudo mv /usr/local.bak /usr/local - - - name: Build usbmuxd - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - cd usbmuxd - autoreconf -fiv - ./configure ${{ env.CONFIGURE_ARGS }} --without-systemd - ${{ matrix.triple }}-gcc ${{ env.CFLAGS }} -I${{ env.DESTDIR }}/${{ env.PREFIX }}/include/libusb-1.0 src/*.c \ - -DHAVE_CONFIG_H -no-pie \ - -I. -static ${{ env.LDFLAGS }}} -limobiledevice-1.0 -lusbmuxd-2.0 -limobiledevice-glue-1.0 \ - -lplist-2.0 -lusb-1.0 -lmbedtls -lmbedcrypto -lmbedx509 -lpthread -o usbmuxd - mkdir -p ${{ env.DESTDIR }}/${{ env.PREFIX }}/sbin - ${{ matrix.triple }}-objcopy --only-keep-debug usbmuxd usbmuxd.debug - ${{ matrix.triple }}-strip --strip-debug --strip-unneeded usbmuxd - ${{ matrix.triple }}-objcopy --add-gnu-debuglink=usbmuxd.debug usbmuxd - install -m755 usbmuxd usbmuxd.debug ${{ env.DESTDIR }}/${{ env.PREFIX }}/sbin - cd .. - - - name: Build palera1n - run: | - cp -a ${{ env.DESTDIR }}/${{ env.PREFIX }}/{include,lib} dep_root - find dep_root -name '*.so' -delete - find dep_root -name '*.la' -delete - CC="${{ matrix.triple }}-gcc" make -j$(nproc) ROOTFUL=1 - cp src/palera1n palera1n.release - - - name: Seperate debug symbols - run: | - ${{ matrix.triple }}-objcopy --only-keep-debug palera1n.release palera1n.debug - ${{ matrix.triple }}-strip --strip-debug --strip-unneeded palera1n.release - ${{ matrix.triple }}-objcopy --add-gnu-debuglink=palera1n.debug palera1n.release - chmod -x palera1n.debug - - - name: Build palera1n (Development) - run: | - CC="${{ matrix.triple }}-gcc" make -j$(nproc) clean - CC="${{ matrix.triple }}-gcc" make -j$(nproc) DEV_BUILD=1 ROOTFUL=1 - cp src/palera1n palera1n.development - - - name: Prepare artifact - run: | - mkdir -p ready/{binaries,debian,binaries_development,build_depends,debug_symbols} usbmuxd-static - mv palera1n.debug ready/debug_symbols/palera1n-${{ env.CHECKRA1N_NAME }}.debug - mv palera1n.release ready/binaries/palera1n-${{ env.CHECKRA1N_NAME }} - mv palera1n.development ready/binaries_development/palera1n-${{ env.CHECKRA1N_NAME }}.development - tar -zcf ready/build_depends/dep_root_${{ matrix.triple }}.tgz dep_root - install -m755 sysroot/${{ env.PREFIX }}/sbin/usbmuxd usbmuxd-static/usbmuxd-${{ env.CHECKRA1N_NAME }} - install -m755 sysroot/${{ env.PREFIX }}/sbin/usbmuxd.debug usbmuxd-static/usbmuxd-${{ env.CHECKRA1N_NAME }}.debug - - - name: Build debs - run: | - version=$(git describe --dirty --tags --abbrev=7 | sed 's|^v||' | sed 's|-beta|~beta|') - - make -j$(nproc) docs - mkdir -p stage/DEBIAN - mkdir -p stage/usr/bin - mkdir -p stage/usr/share/man/man1 - cp packaging/control stage/DEBIAN/control - - sed 's|@DEB_ARCH@|${{ env.ARCH_NAME }}|g' -i stage/DEBIAN/control - sed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control - - install -Dm644 ready/binaries/palera1n-${{ env.CHECKRA1N_NAME }} stage/usr/bin/palera1n - gzip -c9 docs/palera1n.1 > stage/usr/share/man/man1/palera1n.1.gz - chmod 755 stage/usr/bin/palera1n - chmod 644 stage/usr/share/man/man1/palera1n.1.gz - - dpkg-deb --root-owner-group -b stage palera1n_${{ env.ARCH_NAME }}.deb - mv palera1n*.deb ready/debian - rm -rf stage - - - name: Get branch name - id: branch-name - uses: tj-actions/branch-names@v9 - - - name: Upload artifact - if: ${{ github.event_name != 'pull_request' }} - uses: wangyucode/sftp-upload-action@v1.4.8 - with: - host: ${{ secrets.NICKCHAN_FTP_HOST }} - port: ${{ secrets.NICKCHAN_FTP_PORT }} - username: palera1n - password: ${{ secrets.NICKCHAN_FTP_PASS }} - forceUpload: true - dryRun: false - localDir: 'ready/' - remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref_name }}/${{ github.run_number }}" - - - name: Upload usbmuxd artifact - if: ${{ github.event_name != 'pull_request' }} - uses: wangyucode/sftp-upload-action@v1.4.8 - with: - host: ${{ secrets.NICKCHAN_FTP_HOST }} - port: ${{ secrets.NICKCHAN_FTP_PORT }} - username: palera1n - password: ${{ secrets.NICKCHAN_FTP_PASS }} - forceUpload: true - dryRun: false - localDir: 'usbmuxd-static/' - remoteDir: "/palera1n/artifacts/usbmuxd-static" - - - name: Generate cached sysroot archive - if: steps.sysroot_cache.outputs.cache-hit != 'true' - run: | - tar -c sysroot | xz -zce9T 0 > sysroot-${{ env.CACHE_TXT_CHECKSUM }}.txz - - finish-build: - runs-on: ubuntu-latest - if: ${{ github.event_name != 'pull_request' }} - needs: [build-docs, build-darwin, darwin-dist, build-Linux] - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Get branch name - id: branch-name - uses: tj-actions/branch-names@v9 - - - name: Download build tag - uses: actions/download-artifact@v4 - with: - name: build-tag - - - uses: geekyeggo/delete-artifact@v2 - with: - name: '*' - failOnError: false - - - name: Send Discord build message - run: | - COMMITMESSAGE=`git log --pretty=format:'- \`%h\` %s' -1 --reverse` && - (curl "${{ secrets.DISCORD_WEBHOOK }}" -sS -H "Content-Type:application/json" -X POST -d "{\"content\":null,\"embeds\":[{\"title\":\"[palera1n:${{ steps.branch-name.outputs.ref_branch }}] Nightly Build ${{ github.run_number }}\",\"url\":\"https://github.com/palera1n/palera1n/actions/runs/${GITHUB_RUN_ID}\",\"color\":2829617,\"fields\":[{\"name\":\"Build tag\",\"value\":\"- \`$(cat build-tag.txt | sed 's|\n||')\`\"},{\"name\":\"Destination\",\"value\":\"- https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}\"},{\"name\":\"Documentation\",\"value\":\"- [palera1n.1.html](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/docs/palera1n.1.html)\"},{\"name\":\"Main Artifacts\",\"value\":\"- [palera1n-iphoneos-arm64](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/binaries/palera1n-iphoneos-arm64)\n- [palera1n-linux-arm64](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/binaries/palera1n-linux-arm64)\n- [palera1n-linux-armel](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/binaries/palera1n-linux-armel)\n- [palera1n-linux-x86](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/binaries/palera1n-linux-x86)\n- [palera1n-linux-x86_64](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/binaries/palera1n-linux-x86_64)\n- [palera1n-macos-universal](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/binaries/palera1n-macos-universal)\"}],\"footer\":{\"text\":\"${{ github.actor }}\", \"icon_url\": \"https://github.com/${{ github.actor }}.png\",\"timestamp\":\"$(date -u +"%FT%TZ")\"}}],\"username\":\"GitHub Actions\",\"avatar_url\":\"https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png\"}") - diff --git a/.gitignore b/.gitignore index ee8e4ef..03d924b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,4 @@ -contrib/** -dep_root/** -!dep_root/.keep -!contrib/.keep -contrib/ -*.o -dep_root*.tgz -.vscode -checkra1n* -payload.c -src/palera1n -!xxd-embedded.h -src/binpack.dmg -src/ramdisk.dmg -src/ramdisk.dmg.lzma -src/xxd-*.c +build/ .DS_Store -!palera1n.1 -palera1n.1.html -Payload -docs/*.html -build -src/*.dmg.c -.idea -src/stage2/ -src/libcheckra1nhelper.dylib* -src/Pongo.bin -sysroot -compile.sh +src/exploit/payloads/ +src/exploit/userland/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..13c4532 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,62 @@ +# Project +cmake_minimum_required(VERSION 3.10) +project(palera1n VERSION 3.0) +include(FetchContent) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) +set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") +set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -Wextra -DWX_PRECOMP") + +# Option for GUI (wxWidgets) +option(WITH_GUI "Build with wxWidgets GUI" OFF) +option(WITH_STATIC "Build with static wxWidgets" OFF) + +# Architectures +set(CMAKE_OSX_ARCHITECTURES "arm64") +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13") + +# Deps +if(WITH_GUI) +if(WITH_STATIC) + set(wxBUILD_SHARED OFF) + FetchContent_Declare( + wxWidgets + GIT_REPOSITORY https://github.com/wxWidgets/wxWidgets.git + GIT_SHALLOW ON + ) + FetchContent_MakeAvailable(wxWidgets) + set(WX_LIBRARIES wxWidgets::core wxWidgets::base wxWidgets::net) +else() + find_package(wxWidgets REQUIRED COMPONENTS core base net) + include(${wxWidgets_USE_FILE}) + set(WX_LIBRARIES ${wxWidgets_LIBRARIES}) +endif() +endif() + +# Files +file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS "src/*.cpp" "src/*.c" "src/*.h" "src/*.hpp") + +if(APPLE AND WITH_GUI) + add_executable(palera1n MACOSX_BUNDLE ${SOURCES}) + set_target_properties(palera1n PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/resources/Info.plist) +elseif(APPLE) + add_executable(palera1n ${SOURCES}) +else() + add_executable(palera1n WIN32 ${SOURCES} resources/main.exe.manifest) +endif() + +if(APPLE) + find_library(IOKIT IOKit) + find_library(COREFOUNDATION CoreFoundation) + target_link_libraries(palera1n PRIVATE ${IOKIT} ${COREFOUNDATION}) +endif() + +if(WITH_GUI) +if(WITH_STATIC) + target_link_libraries(palera1n PRIVATE wxcore wxnet) +else() + target_link_libraries(palera1n PRIVATE ${wxWidgets_LIBRARIES}) +endif() +target_compile_definitions(palera1n PRIVATE WITH_GUI) +endif() diff --git a/Makefile b/Makefile index 37db306..d4b2925 100644 --- a/Makefile +++ b/Makefile @@ -1,95 +1,29 @@ -SRC = $(shell pwd) -DEP = $(SRC)/dep_root -STRIP = strip -CC ?= cc -CFLAGS += -isystem $(DEP)/include -I$(SRC)/include -I$(SRC) -D_XOPEN_SOURCE=500 -CFLAGS += -Wall -Wextra -Wno-unused-parameter -DPALERAIN_VERSION=\"2.1\" -DHAVE_LIBIMOBILEDEVICE -CFLAGS += -Wno-unused-variable -I$(SRC)/src -std=c99 -pedantic-errors -D_C99_SOURCE -D_POSIX_C_SOURCE=200112L -LIBS += $(DEP)/lib/libimobiledevice-1.0.a $(DEP)/lib/libirecovery-1.0.a $(DEP)/lib/libusbmuxd-2.0.a -LIBS += $(DEP)/lib/libimobiledevice-glue-1.0.a $(DEP)/lib/libplist-2.0.a -pthread -lm -ifeq ($(TARGET_OS),) -TARGET_OS = $(shell uname -s) -UNAME = $(TARGET_OS) -else -UNAME = $(shell uname -s) -endif -ifeq ($(TARGET_OS),Darwin) -CFLAGS += -Wno-nullability-extension -ifeq (,$(findstring version-min=, $(CFLAGS))) -CFLAGS += -mmacosx-version-min=10.8 -endif -LDFLAGS += -Wl,-dead_strip -LIBS += -framework CoreFoundation -framework IOKit -else -CFLAGS += -fdata-sections -ffunction-sections -LDFLAGS += -Wl,--gc-sections -endif -LIBS += $(DEP)/lib/libmbedtls.a $(DEP)/lib/libmbedcrypto.a $(DEP)/lib/libmbedx509.a $(DEP)/lib/libreadline.a +.PHONY: payloads palera1n palera1n_xcode clean -ifeq ($(TUI),1) -ifeq ($(TARGET_OS),Linux) -LIBS += $(DEP)/lib/libgpm.a -endif -endif +WITH_GUI ?= 0 +WITH_STATIC ?= 0 +BUILD_TYPE ?= Debug -ifeq ($(DEV_BUILD),1) -CFLAGS += -O0 -g -DDEV_BUILD -fno-omit-frame-pointer -ifeq ($(ASAN),1) -BUILD_STYLE=ASAN -CFLAGS += -fsanitize=address,undefined -fsanitize-address-use-after-return=runtime -else ifeq ($(TSAN),1) -BUILD_STYLE=TSAN -CFLAGS += -fsanitize=thread,undefined -else -BUILD_STYLE = DEVELOPMENT -endif -else -CFLAGS += -Os -g -BUILD_STYLE = RELEASE -endif -LIBS += -lc +payloads: + @mkdir -p src/exploit/payloads + @for file in payloads/*; do \ + echo " XXD $$file"; \ + xxd -i $$file > src/exploit/$$file.h; \ + done -ifeq ($(TARGET_OS),Linux) -ifneq ($(shell echo '$(BUILD_STYLE)' | grep -q '[A-Z]\+SAN' && echo 1),1) -LDFLAGS += -static -no-pie -endif -endif +palera1n: payloads + @cmake -S . -B build \ + -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) \ + -DWITH_GUI=$(WITH_GUI) \ + -DWITH_STATIC=$(WITH_STATIC) && \ + cmake --build build -- -j$(sysctl -n hw.ncpu) -ifneq ($(BAKERAIN_DEVELOPE_R),) -CFLAGS += -DBAKERAIN_DEVELOPE_R="\"$(BAKERAIN_DEVELOPE_R)\"" -endif - -BUILD_NUMBER := $(shell git rev-list --count HEAD) -BUILD_TAG := $(shell git describe --dirty --tags --abbrev=7) -BUILD_BRANCH := $(shell git rev-parse --abbrev-ref HEAD) -BUILD_COMMIT := $(shell git rev-parse HEAD) - -CFLAGS += -DBUILD_STYLE="\"$(BUILD_STYLE)\"" -DBUILD_TAG="\"$(BUILD_TAG)\"" -CFLAGS += -DBUILD_NUMBER="\"$(BUILD_NUMBER)\"" -DBUILD_BRANCH="\"$(BUILD_BRANCH)\"" -CFLAGS += -DBUILD_COMMIT="\"$(BUILD_COMMIT)\"" - -CPATH = -LIBRARY_PATH = - -export SRC DEP UNAME CC CFLAGS LDFLAGS LIBS SHELL TARGET_OS DEV_BUILD BUILD_DATE BUILD_TAG BUILD_WHOAMI BUILD_STYLE BUILD_NUMBER BUILD_BRANCH - -all: palera1n - -palera1n: download-deps - $(MAKE) -C src +palera1n_xcode: payloads + @cmake -S . -B build \ + -G Xcode \ + -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) \ + -DWITH_GUI=$(WITH_GUI) \ + -DWITH_STATIC=$(WITH_STATIC) clean: - $(MAKE) -C src clean - $(MAKE) -C docs clean - -download-deps: - $(MAKE) -C src $(patsubst %, resources/%, checkra1n-macos checkra1n-linux-arm64 checkra1n-linux-armel checkra1n-linux-x86 checkra1n-linux-x86_64 checkra1n-kpf-pongo ramdisk.dmg binpack.dmg Pongo.bin) - -docs: - $(MAKE) -C docs - -distclean: clean - $(MAKE) -C src distclean - -.PHONY: all palera1n clean docs distclean - + @rm -rf build diff --git a/README.md b/README.md index e82e73e..aef1c52 100644 --- a/README.md +++ b/README.md @@ -1,133 +1 @@ -# palera1n -[![GitHub Release](https://img.shields.io/github/v/release/palera1n/palera1n?include_prereleases)](https://github.com/palera1n/palera1n/releases) -[![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/palera1n/palera1n/total)](https://github.com/palera1n/palera1n/releases) -[![GitHub License](https://img.shields.io/github/license/palera1n/palera1n?color=%23C96FAD)](https://github.com/palera1n/palera1n/blob/main/LICENSE) - - -Jailbreak for A8 through A11, T2 devices, on iOS/iPadOS/tvOS 15.0, bridgeOS 5.0 and higher. - - - - -| ![Screenshot of macOS Terminal.app](assets/image-1.png) | -|:--: | -| A screenshot of palera1n being used in a Terminal | - -## Device Support - - - -| iPhone(s) | iPad(s) | iPod(s) | Apple TV(s) | -|- |- |- |- | -| iPhone 6s | iPad mini 4 | iPod Touch (7th generation) | Apple TV HD | -| iPhone 6s Plus | iPad (5th generation) | | Apple TV 4K (1st generation) | -| iPhone SE (2016) | iPad (6th generation) | | | -| iPhone 7 | iPad (7th generation) | | | -| iPhone 7 Plus | iPad Pro (9.7") | | | -| iPhone 8 | iPad Pro (12.9") (1st generation) | | | -| iPhone 8 Plus | iPad Pro (10.5") | | | -| iPhone X | iPad Pro (12.9") (2nd generation) | | | -| | iPad Air 2 | | | - - -> Note that on `A11` (iPhone X, 8, 8 Plus), **you must disable your passcode while in the jailbroken state** (on iOS 16, you need to **reset your device** before proceeding with palera1n). - - -
-Apple T2 Device Support (click to expand) - -| Apple T2 | -|- | -| Apple T2 iMac20,1 | -| Apple T2 iMac20,2 | -| | -| Apple T2 MacBookAir8,1 | -| Apple T2 MacBookAir8,2 | -| Apple T2 MacBookAir9,1 | -| | -| Apple T2 MacBookPro15,1 | -| Apple T2 MacBookPro15,2 | -| Apple T2 MacBookPro15,3 | -| Apple T2 MacBookPro15,4 | -| Apple T2 MacBookPro16,1 | -| Apple T2 MacBookPro16,2 | -| Apple T2 MacBookPro16,3 | -| Apple T2 MacBookPro16,4 | -| | -| Apple T2 iMacPro1,1 | -| Apple T2 Macmini8,1 | -| Apple T2 MacPro7,1 | -| | -| iBridge2,11 (Unknown Mac) | -| iBridge2,13 (Unknown Mac) | - - - -
- - -## Computer Requirements -1. **USB-A** cables are recommended to use, USB-C to may have issues with palera1n and getting into DFU mode. -> Due to USB-C cables having different accessory IDs, your device may not be able to be recognized when using USB-C due to not being able to assert to its USB voltage pin. - -2. **Linux or macOS computer** -> AMD CPUs (not AMD Mobile) have an issue where it causes them to have a very low success rate with checkm8 exploit. It is not recommended that you use them with palera1n. - -> USB-C port on Apple Silicon Macs *may* require manual unplugging and replugging of the lightning cable after checkm8 exploit. This problem may be solved by connecting via USB hub, though extensions can vary. - -## Usage -``` -Usage: palera1n [-DEhpvVdsSLRnPI] [-e boot arguments] [-k Pongo image] [-o overlay file] [-r ramdisk file] [-K KPF file] [-i checkra1n file] - - --version Print version - --force-revert Remove jailbreak - -d, --demote Demote - -D, --dfuhelper Exit after entering DFU - -e, --boot-args XNU boot arguments - -E, --enter-recovery Enter recovery mode - -h, --help Show this help - -i, --override-checkra1n Override checkra1n - -k, --override-pongo Override Pongo image - -K, --override-kpf Override kernel patchfinder - -L, --jbinit-log-to-file Make jbinit log to /cores/jbinit.log (can be read from sandbox while jailbroken) - -n, --exit-recovery Exit recovery mode - -I, --device-info Print info about the connected device - -o, --override-overlay Override overlay - -p, --pongo-shell Boots to PongoOS shell - -P, --pongo-full Boots to a PongoOS shell with default images already uploaded - -r, --override-ramdisk Override ramdisk - -R, --reboot-device Reboot connected device in normal mode - -s, --safe-mode Enter safe mode - -S, --no-colors Disable colors on the command line - -v, --debug-logging Enable debug logging - This option can be repeated for extra verbosity. - -V, --verbose-boot Verbose boot - -Environmental variables: - TMPDIR temporary diretory (path the built-in checkra1n will be extracted to) -``` - -## Installing -Visit https://palera.in - -## Disclaimers -We are **NOT** responsible for any data loss, or the result of a device being bricked. When using palera1n, the user should accept responsibility if anything happens to their device during the process. -- If your device is stuck in recovery, please run futurerestore `--exit-recovery`, or use `irecovery -n`, or `palera1n -n`. -- If you're unable to get out of recovery via these methods please restore with iTunes or Finder. -- palera1n **will not work** in VirtualBox, VMware or any virtual machine that doesn't support PCI passthrough. - -## Troubleshooting -Make sure you're following the guides provided [here](https://palera.in), also when asking for support make sure you provide full details on your device, such as: -- iPhone/iPad/iPod/Apple TV -- iOS Version -- Passcode enabled? -- Verbose from palera1n (specifying `-Vv` within palera1n) -- Panic logs, if panicked then send latest `panic-full` log from your device. - -Create an issue here: https://github.com/palera1n/palera1n/issues/new/choose - -## Credits - -[All credits for palera1n can be found here](https://palera.in/) - -If proper credit isn't shown please message us or create an issue. +read `Makefile` for build instructions diff --git a/assets/image-1.png b/assets/image-1.png deleted file mode 100644 index 2920da8a12fd47205d7e39af6aad298e735c41c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293729 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 z%0A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

$}Ck*#@s&p?^x(~RNCq! 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 diff --git a/dep_root/.keep b/dep_root/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 25b8e54..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -PAGES = palera1n.1.html p1ctl.8.html - -all: $(PAGES) - -%.html: % - mandoc -T html -O style=mandoc.css $< > $@ - -clean: - rm -f $(PAGES) diff --git a/docs/mandoc.css b/docs/mandoc.css deleted file mode 100644 index 6a315d8..0000000 --- a/docs/mandoc.css +++ /dev/null @@ -1,269 +0,0 @@ -/* $OpenBSD: mandoc.css,v 1.35 2021/03/30 19:23:50 schwarze Exp $ */ -/* - * Standard style sheet for mandoc(1) -Thtml and man.cgi(8). - * - * Written by Ingo Schwarze . - * I place this file into the public domain. - * Permission to use, copy, modify, and distribute it for any purpose - * with or without fee is hereby granted, without any conditions. - */ - -/* Global defaults. */ - -html { - --bg: #FFFFFF; - --fg: #000000; } -body { background: var(--bg); - color: var(--fg); - font-family: monospace,Helvetica,Arial,sans-serif; - max-width: 80ch; - margin: 1em auto; - padding: 0 1ch; - } -h1 { font-size: 110%; } -table { margin-top: 0em; - margin-bottom: 0em; - border-collapse: collapse; } -/* Some browsers set border-color in a browser style for tbody, - * but not for table, resulting in inconsistent border styling. */ -tbody { border-color: inherit; } -tr { border-color: inherit; } -td { vertical-align: top; - padding-left: 0.2em; - padding-right: 0.2em; - border-color: inherit; } -ul, ol, dl { margin-top: 0em; - margin-bottom: 0em; } -li, dt { margin-top: 1em; } -pre { font-family: inherit; } - -.permalink { border-bottom: thin dotted; - color: inherit; - font: inherit; - text-decoration: inherit; } -* { clear: both } - -/* Search form and search results. */ - -form { - position: sticky; - top: 0px; - background-color: var(--bg); - z-index: 1; -} - -fieldset { border: thin solid silver; - border-radius: 0.3em; - text-align: center; } -input[name=expr] { - width: 25%; } - -table.results { margin-top: 1em; - margin-left: 2em; - font-size: smaller; } - -/* Header and footer lines. */ - -table.head { width: 100%; - border-bottom: 1px dotted #808080; - margin-bottom: 1em; - font-size: smaller; - overflow-wrap: anywhere; } -td.head-vol { text-align: center; } -td.head-rtitle { - text-align: right; } - -table.foot { width: 100%; - border-top: 1px dotted #808080; - margin-top: 1em; - font-size: smaller; - overflow-wrap: anywhere; } -td.foot-os { text-align: right; } - -table.Nm { - overflow-wrap:anywhere; -} - -/* Sections and paragraphs. */ - -.manual-text { - margin-left: 3.8em; } -h1.Sh { margin-top: 1.2em; - margin-bottom: 0.6em; - margin-left: -3.2em; } -h2.Ss { margin-top: 1.2em; - margin-bottom: 0.6em; - margin-left: -1.2em; - font-size: 105%; } -.Pp { margin: 0.6em 0em; } - -/* Displays and lists. */ - -.Bd-indent { margin-left: 3.8em; } - -.Bl-bullet { list-style-type: disc; - padding-left: 1em; } -.Bl-dash { list-style-type: none; - padding-left: 0em; } -.Bl-dash > li:before { - content: "\2014 "; } -.Bl-item { list-style-type: none; - padding-left: 0em; } -.Bl-compact > li { - margin-top: 0em; } - -.Bl-enum { padding-left: 2em; } -.Bl-compact > li { - margin-top: 0em; } - -.Bl-diag > dt { - font-style: normal; - font-weight: bold; } -.Bl-diag > dd { - margin-left: 0em; } -.Bl-hang > dd { - margin-left: 5.5em; } -.Bl-inset > dd { - margin-left: 0em; } -.Bl-ohang > dd { - margin-left: 0em; } -.Bl-tag { margin-top: 0.6em; - margin-left: 5.5em; } -.Bl-tag > dt { - float: left; - margin-top: 0em; - margin-left: -5.5em; - padding-right: 0.5em; - vertical-align: top; } -.Bl-tag > dd { - clear: right; - column-count: 1; /* Force block formatting context. */ - width: 100%; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0.6em; - vertical-align: top; } -.Bl-compact { margin-top: 0em; } -.Bl-compact > dd { - margin-bottom: 0em; } -.Bl-compact > dt { - margin-top: 0em; } - -.Bl-column > tbody > tr > td { - margin-top: 1em; } -.Bl-compact > tbody > tr > td { - margin-top: 0em; } - -.Rs { font-style: normal; - font-weight: normal; } -.RsB { font-style: italic; - font-weight: normal; } -.RsI { font-style: italic; - font-weight: normal; } -.RsJ { font-style: italic; - font-weight: normal; } -.RsT { text-decoration: underline; } - -.tbl td { vertical-align: middle; } - -.HP { margin-left: 3.8em; - text-indent: -3.8em; } - -/* Semantic markup for command line utilities. */ - -code.Nm { font-style: normal; - font-weight: bold; - font-family: inherit; - overflow-wrap: normal; } -.Fl { font-style: normal; - font-weight: bold; - font-family: inherit; } -.Cm { font-style: normal; - font-weight: bold; - font-family: inherit; } -.Ar { font-style: italic; - font-weight: normal; } -.Op { display: inline; } -.Ic { font-style: normal; - font-weight: bold; - font-family: inherit; } -.Ev { font-style: normal; - font-weight: normal; - font-family: monospace; } -.Pa { font-style: italic; - font-weight: normal; } - -/* Semantic markup for function libraries. */ - -code.In { font-style: normal; - font-weight: bold; - font-family: inherit; } -.Fd { font-style: normal; - font-weight: bold; - font-family: inherit; } -.Ft { font-style: italic; - font-weight: normal; } -.Fn { font-style: normal; - font-weight: bold; - font-family: inherit; } -.Fa { font-style: italic; - font-weight: normal; } -.Vt { font-style: italic; - font-weight: normal; } -.Va { font-style: italic; - font-weight: normal; } -.Dv { font-style: normal; - font-weight: normal; - font-family: monospace; } -.Er { font-style: normal; - font-weight: normal; - font-family: monospace; } - -/* Various semantic markup. */ - -.Cd { font-style: normal; - font-weight: bold; - font-family: inherit; } -.Ad { font-style: italic; - font-weight: normal; } -.Ms { font-style: normal; - font-weight: bold; } - -/* Physical markup. */ - -.Bf { display: inline; } -.No { font-style: normal; - font-weight: normal; } -.Em { font-style: italic; - font-weight: normal; } -.Sy { font-style: normal; - font-weight: bold; } -.Li { font-style: normal; - font-weight: normal; - font-family: monospace; } - -/* Overrides to avoid excessive margins on small devices. */ - -@media (max-width: 37.5em) { -.manual-text { - margin-left: 0.5em; } -h1.Sh, h2.Ss { margin-left: 0em; } -.Bd-indent { margin-left: 2em; } -.Bl-hang > dd { - margin-left: 2em; } -.Bl-tag { margin-left: 2em; } -.Bl-tag > dt { - margin-left: -2em; } -.HP { margin-left: 2em; - text-indent: -2em; } -} - -/* Overrides for a dark color scheme for accessibility. */ - -@media (prefers-color-scheme: dark) { -html { --bg: #000000; - --fg: #FFFFFF; } -:link { color: #BAD7FF; } -:visited { color: #BAD7FF; } -} - diff --git a/docs/p1ctl.8 b/docs/p1ctl.8 deleted file mode 100644 index 1702d5f..0000000 --- a/docs/p1ctl.8 +++ /dev/null @@ -1,109 +0,0 @@ -.\"- -.\" Copyright (c.Xc 2024 Nick Chan -.\" SPDX-License-Identifier: MIT -.\" -.Dd "6 April 2024" -.Dt p1ctl 8 -.Sh NAME -.Nm p1ctl -.Nd command-line access to palera1n loader -.Sh SYNOPSIS -.Nm -.Ar subcommand -.Op subcommand options -.Op subcommand arguments -.Sh DESCRIPTION -.Nm -provide a command-line interface to the graphical palera1n loader. -.Pp -.Nm -interfaces with the palera1n daemon as well as palera1n's launchd hook. - -.Sh SUBCOMMANDS -.Bl -tag -width -indent -.It Xo Ar bootstrap Op Fl s -.Op Fl S Ar password -.Ar bootstrap-file -.Xc -Deploy a bootstrap from a zstd compressed tarball. With no additional options specified, -a new password for the mobile user will be prompted for. The bootstrap you are deploying -must match the jailbreak type (rootful or rootless) you are using. -.Bl -tag -width -indent -.It Fl s -Do not prompt for the password and do not set the mobile password. -.It Fl S Ar password -Do not prompt and set the mobile password to the password specified. -.El -.Pp -.Em NOTE: -Unlike the graphical palera1n loader, this command only deploys the bootstrap itself, -it does not add additional repositories nor install additional packages. -.It Xo Ar exitsafe -.Xc -Exit -.Nm palera1n -safe mode, and trigger a userspace reboot. This command will succeed -even if the device is not currently in safe mode. In this case, a userspace reboot -is still triggered. -.Pp -.Em NOTE: -Many tweak injection packages also provide their own safe mode, p1ctl does not -recognize and cannot control those safe modes. -.It Xo Ar help Op Ar subcommand -.Xc -Prints help text. If -.Ar subcommand -is specified, print help about the subcommand. -.It Xo Ar kbase -.Xc -Print a hexadecimal representation of the kernel base. -.It Xo Ar kslide -.Xc -Print a hexadecimal representation of the kernel slide. -.It Xo Ar palera1n_flags -.Xc -Print a representation of the palera1n flags, which corresponds to the options passed -to -.Xr palera1n 1 -as well as hints to the palera1n userspace stack set by -.Nm PongoOS -\[char46] -By default, a hexadecimal representation of the flags will be printed. -.Bl -tag -width -indent -.It Fl d -Read the flags from the ramdisk block device instead of getting them by interfacing with palera1n daemon. -.It Fl s -Print a string representation of the flags. Each line will contain one flag, and the strings always start -with palerain_option_, and unknown flags are represented as palerain_option_undefined. -.El -.It Xo Ar reboot-userspace -.Xc -Unmount /Developer if mounted and then reboot the userspace. -This command exists because the /Developer mount will be broken -after a plain userspace reboot, which breaks debugging in Xcode. -.Nm palera1n -also hooks the -.Xr reboot3 3 -call so that rebooting userspace using -.Xr launchctl 1 -does not break the /Developer mount. -.It Xo Ar reload -.Xc -Causes the -.Nm palera1n -launchd hook to re-probe the environment and update its internal state. -This will affect the internal environmental variables passed onto new processes, -and is typically used after bootstrapping or reverting installs. -.It Xo Ar revert-install -.Xc -Remove jailbreak files from the device. This command is not supported on rootful with fakefs. On rootful with realfs, the device will reboot after issuing this command. -.Pp -To remove jailbreak files on rootful with fakefs, use -.Xr palera1n 1 -on your computer with the -.Fl -force-revert -.Fl f -options instead. -.El -.Sh SEE ALSO -.Xr palera1n 1 diff --git a/docs/palera1n.1 b/docs/palera1n.1 deleted file mode 100644 index 9b209b4..0000000 --- a/docs/palera1n.1 +++ /dev/null @@ -1,396 +0,0 @@ -.\"- -.\" Copyright (c) 2024 Nick Chan -.\" SPDX-License-Identifier: MIT -.\" -.Dd "23 December 2024" -.Dt palera1n 1 -.Sh NAME -.Nm palera1n -.Nd arm64 iOS/iPadOS/tvOS 15.0-26.0, bridgeOS 5.0-10.0 jailbreaking tool -.Sh SYNOPSIS -.Nm -.Op Fl cCdDEfhIlLnpRsSTvV -.Op Fl e Ar Boot arguments -.Op Fl k Ar Pongo image -.Op Fl o Ar overlay file -.Op Fl r Ar ramdisk file -.Op Fl K Ar KPF file -.Op Fl i Ar checkra1n file -.Op Fl -version -.Op Fl -force-revert -.Sh DESCRIPTION -.Nm -jailbreaks an arm64 (arm64e excluded) iOS/iPadOS/tvOS 15.0-26.0, bridgeOS 5.0-10.0 device, -utilizing the -.Em checkm8 -bootROM exploit. -.Pp -.Nm -provides rootful and rootless jailbreak modes. -On iOS/iPadOS 15.0 and later and on tvOS 18.2 or later, -.Nm -is able to jailbreak the device in fakefs-rootful mode, where / -is writable, as well as rootless mode, where / cannot be written to. -On tvOS and bridgeOS, -only rootful is supported. On versions where fakefs-rootful is not -applicable, palera1n modifies the actual root filesystem instead -of making a fakefs. -.Pp -Due to the nature of the -.Em checkm8 -exploit, -.Nm -is semi-tethered. That is, you must run the -.Nm -tool after the device reboot in order to enter the jailbroken state. -However, it is not required for the device to boot. -.Pp -On A11 devices, that is, iPhone 8, iPhone 8 Plus and iPhone X, the passcode cannot -be used. -.Pp -On iOS 15, the passcode must be off while jailbroken. -.Pp -On iOS 16, the passcode must be off since restore, and -.Sy Reset All Contents and Settings -from settings app counts as a restore. -A backup may be used in this case. -.Pp -In the remainder of this document, the term "iOS" and "iPadOS" will be used interchangably -as the difference is negligible as far as the jailbreak is concerened. -.Pp -.Sh SUPPORTED DEVICES -As described above, arm64 iOS 15.0-18.0 devices are supported, here is an explicit -list of supported devicecs: - -.Bl -tag -compact -.It iPhone 6s -.It iPhone 6s Plus -.It iPhone SE (2016) -.It iPhone 7 -.It iPhone 7 Plus -.It iPhone 8 -.It iPhone 8 Plus -.It iPhone X -.El - -.Bl -tag -compact -.It iPad mini 4 -.It iPad Air 2 -.It iPad (5th generation) -.It iPad (6th generation) -.It iPad (7th generation) -.It iPad Pro (9.7") -.It iPad Pro (12.9") (1st generation) -.It iPad Pro (10.5") -.It iPad Pro (12.9") (2nd generation) -.El - -.Bl -tag -compact -.It iPod Touch (7th generation) -.El - -.Bl -tag -compact -.It Apple TV HD -.It Apple TV 4K (1st generation) -.El - -.Bl -tag -compact -.It Apple T2 iMacPro1,1 -.It Apple T2 MacBookPro15,1 -.It Apple T2 MacBookPro15,2 -.It Apple T2 Macmini8,1 -.It Apple T2 MacPro7,1 -.It Apple T2 MacBookPro15,3 -.It Apple T2 MacBookAir8,1 -.It Apple T2 MacBookPro15,4 -.It Apple T2 MacBookAir8,2 -.It Apple T2 MacBookPro16,1 -.It Apple T2 MacBookAir9,1 -.It Apple T2 MacBookPro16,2 -.It Apple T2 iMac20,1 -.It Apple T2 iMac20,2 -.It Apple T2 MacBookPro16,3 -.It Apple T2 MacBookPro16,4 -.El - -Support for the A8 HomePod on Darwin 21 and above could be added, -but it is currently unsupported. - -arm64e devices will NEVER be supported. - -.Sh OPTIONS -.Bl -tag -width -indent -.It Fl -version -Prints the program version and exit. -.It Fl -force-revert -Remove the jailbreak while keeping user data. Some jailbreak files may remain -after running this command. Additionally, jailbreak apps may remain on the -home screen on for a while even when the files are deleted as the icon cache -still has their icons. When used with -.Fl f , -fakefs , -this will actually boot the device in rootless mode then delete the jailbreak -files. As a result, using the loader app to install the jailbreak environment -is not supported when this option is used together with -.Fl f , -fakefs -\[char46] -.It Fl B , -setup-fakefs-partial -Like -.Fl c , -setup-fakefs -but the size of the created fakefs is smaller at the expense of having unwritable -parts in rarely-written paths. When jailbreaking 16 GB devices, this option must be used -when setting up fakefs for rootful, as they do not have enough storage for full fakefs. -This flag is supported on iOS/iPadOS 15.0 or later and tvOS 18.2 or later, as they -require fakefs for rootful. -.It Fl c , -setup-fakefs -When used with -.Fl f , -fakefs , -creates the new APFS volume required for rootful. Will fail if one already exists. -This flag is supported on iOS/iPadOS 15.0 or later and tvOS 18.2 or later, as they -require fakefs for rootful. -.It Fl C , -clean-fakefs -This option is not currently supported and is a no-operation in this version of -.Nm -\[char46] -.It Fl d , -demote -Set the effective production fuse to 0, so as to enable hardware debugging features. -.It Fl D , -dfuhelper -Execute the DFU helper to guide the user into putting the device into DFU mode -then exit. -.It Fl e , -boot-args Ar boot arguments -Specify custom XNU kernel command line. Additionally, the -.Em wdt=-1 -argument is used during fakefs setup. -.It Fl E , -enter-recovery -Exit after entering recovery mode. -.It Fl f , -fakefs -Proceed in rootful mode. Despite its name, this applies to both full, partial fakefs, as well as realfs, and it still applies even when trying to force revert. -.It Fl h , -help -Prints help text. -.It Fl i , -checkra1n-file Ar checkra1n file -Specify the path to a custom checkra1n file. -.It Fl k , -override-pongo Ar pongo file -Override PongoOS image. The raw image, named -.Em Pongo.bin -when built, should be used. PongoOS 2.6.0 or later is required. -.It Fl K , -override-kpf Ar KPF file -Override the kernel patchfinder PongoOS module. The module is required to support setting -root filesystem in paleinfo with -.Em rootfs -command. If in doubt, use -.Sy https://github.com/palera1n/PongoOS -iOS15 branch or your own fork of it. -.It Fl l , -rootless -Proceed in rootless mode. This option is only supported on iOS/iPadOS. -.It Fl n , -exit-recovery -Exit recovery mode and exit. -.It Fl o , -override-overlay Ar overlay file -Specify the path to a custom overlay file, which is then mounted onto /cores/binpack -during boot, if the default ramdisk is used. The default ramdisk expects the overlay -to contain a folder named -.Em Applications -at the root of it, as well as a dmg named -.Em loader.dmg -at the root of it. Otherwise, the device will not boot. It is also expected that it -contains a shell, a ssh server, and various command line utilities. -.It Fl p , -pongo-shell -Exit after booting into a clean PongoOS shell -.It Fl P , -pongo-full -Like -.Fl p , -pongo-shell -but default images and options have been uploaded and applied respectively. -.It Fl r , -override-ramdisk Ar ramdisk file -Override the ramdisk. At a very minimum, it should contain -.Em /cores/ploosh -as well as a fake dyld -.Em /usr/lib/dyld -where the logic is expected to be in. -.It Fl R , -reboot-device -Reboot device in normal mode and exit. -.It Fl s , -safe-mode -Enter safe mode. An alert will be displayed on iOS/iPadOS/tvOS. Jailbreak daemons nor early boot executable files -specified (see -.Sy FILES -section below) will be executed. The loader app and the built in SSH server can still be used, -as well as any jailbreak-specific apps you have installed. -.It Fl S , -no-colors -Disable colors on the command line. External programs like checkra1n clones may still output colors. -.It Fl T , -telnetd -Enable the TELNET daemon on port 46, all interfaces. Please note that there is no authentication and is therefore insecure. -.It Fl v , -debug-logging -Enable debug logging. The option may be repeated for extra verbosity. -.It Fl V , -verbose-boot -Boots the device in verbose mode, allowing boot logs to be seen. -.It Fl I , -device-info -Prints info about device and exits. -.El -.Sh ENVIRONMENTAL VARIABLES -.Bl -tag -width -indent -.It Ev TMPDIR -This environmental variable should contain the a directory for temporary -files. Without the -.Fl i , -override-checkra1n -option, files must be executable from it as the built-in checkra1n file -is extracted and executed here. When not set, /tmp is used. -.El -.Sh EXAMPLES -To (re-)jailbreak in rootless mode: -.Pp -.Dl "palera1n -l" -.Pp -To setup fakefs for rootful mode: -.Pp -.Dl "palera1n -fc" -.Pp -After the device has rebooted into recovery mode, follow the following example. -.Pp -To re-jailbreak in rootful mode: -.Pp -.Dl "palera1n -f" -.Pp -To remove the jailbreak in rootful mode: -.Pp -.Dl "palera1n --force-revert -f" -.Pp -To remove the jailbreak in rootless mode: -.Pp -.Dl "palera1n --force-revert" -.Pp -To verbose boot in rootful mode: -.Pp -.Dl "palera1n -Vf" -.Pp -To create a partial fakefs with bind mounts: -.Pp -.Dl "palera1n -Bf" -.Pp -To exit recovery mode: -.Pp -.Dl "palera1n -n" -.Pp -.Sh CAVEATS -.Pp -.Em -v -is not a real XNU boot argument. It is interpreted by iBoot. However, since XNU -boot arguments are set in PongoOS, which is ran after iBoot has ran, it does nothing. -To verbose boot, use the -.Fl V , -verbose-boot -option when jailbreaking. -.Pp -Fakefs takes up around 5-10 GB of storage, and takes up to 10 minutes to setup. -.Pp -iOS 15.0 requires DER entitlements, and iOS 15.1 requires hash agility in code signatures. -As a result, binaries with the old code signature format need to be resigned with a recent -version of the Procursus fork of -.Xr ldid 1 -before they can be ran on a device jailbroken with -.Nm -\[char46] -.Pp -When using rootful mode, the -.Fl f , -fakefs -flag must be specified at all times. It does not matter whether you want to create fakefs, -create partial fakefs, rejailbreak or remove jailbreak. -.Pp -Due to a stock bug, using the -.Fl V , -verbose-boot -option might cause some versions for tvOS to crash and not boot. -.Pp -Offical Apple USB-C cables as well as some other USB-C cables cannot be used to enter DFU mode. -USB-A cable with male USB-C to female USB-A adapter works fine. -.Sh POST INSTALLATION (iOS/iPadOS) -The palera1n loader app will take up to 1 minute to appear on the homescreen after the -device has booted. If it does not appear, you can try using the shortcut: -.Pp -.Lk https://www.icloud.com/shortcuts/8cd5f489c8854ee0ab9ee38f2e62f87d -.Pp -to open it. After opening the loader app, select a package manager to install. -This will also bootstrap your device. -.Pp -A built-in SSH server runs on port 44 on loopback interfaces. -.Sh POST INSTALLATION (tvOS) -.Pp -The palera1n loader app will appear on homescreen. Open the loader and select a package manager to install. -This will also bootstrap your device. -.Pp -A built-in SSH server runs on port 44 on all interfaces. -.Sh POST INSTALLATION (bridgeOS) -.Pp -A built-in SSH server runs on port 44 on all interfaces. -.Pp -Bootstrapping is currently not supported on this device. -.Sh FILES -During the jailbreak process, a temporary filesystem is mounted on /cores as a place -to stash jailbreak files needed during the boot process. No files are ever written -onto the actual disk if you do not use the SSH server to write files or using the -loader app to install additional jailbreak files. - -.Bl -tag -width "/var/jb/Library/LaunchDaemons" -.It Pa /cores -The location of the temporary filesystem where jailbreak files are stashed during boot. -.It Pa /Library/LaunchDaemons -The directory where jailbreak-specific -.Xr launchd.plist 5 -property list files should be placed on rootful. -.It Pa /var/jb/Library/LaunchDaemons -The directory where jailbreak-specific -.Xr launchd.plist 5 -property list files should be placed on rootless. -.It Pa /etc/rc.d -The directory where executable files that needs to be executed during boot, before -daemons are launched, are placed on rootful. They are executed after all filesystems -has been mounted. -.It Pa /var/jb/etc/rc.d -The directory where executable files that needs to be executed during boot, before -daemons are launched, are placed on rootless. They are executed after all filesystems -has been mounted. -.El -.Sh BUGS -.Nm -may crash if the machine it is running on has non-compliant USB devices plugged in. -.Pp -.Nm -will fail to initialize on Linux when there are no USB devices plugged in. -Usually this is not a problem on PCs since the built-in root hubs are also -USB devices. However, on platforms such as Apple Silicon Macs in Linux, since -there are no built-in USB hubs, at least one USB device needs to be manually -plugged in for palera1n to be initialized. -.Pp -The exploit may also work less reliably on some hosts, like AMD desktops, or some MediaTek devices. -.Pp -The built-in SSH server might be not accessible with password after bootstrapping rootful, -since the bootstrap uses a custom crypt() function that is not supported -by the built-in SSH server. -.Pp -There are no DFU instructions for iBridge T2 as there are no known ways to connect to the T2's USB -interface when macOS has been booted. -.Sh DEPRECATED AND REMOVED FUNCTIONALITY -There was an option in -.Nm -to force create the fakefs even when one already exists (which would overwrite -the existing fakefs), by setting the palerain_option_setup_rootful_forced flag -in palera1n flags. This option was removed because using -.Fl -force-revert -and -.Fl c -at the same time has exactly the same effect. -.Pp -The hook that enabled -.Sy launchctl runstats -has been removed, since it leaks memory in launchd. -.Sh SEE ALSO -.Xr launchd 8 -.Xr launchd.plist 5 -.Xr ldid 1 -.Xr p1ctl 8 -.Sh HISTORY -The -.Nm -jailbreak was first written by Nebula and Mineek on September 26, 2022, as a shell -script. Tweak support with DEVELOPMENT kernels are added on October 2, 2022. RELEASE -kernel support is added on November 14, 2022. iOS 16 Support is added on -December 13, 2022. Later, the first attempt to rewrite palera1n into C begins on January -01 2023. The -.Nm -utility described here is the second attempt, which first started on January 16, 2023, -using checkra1n 1337 and a custom KPF. -Something happened on August 15, 2023. diff --git a/include/ANSI-color-codes.h b/include/ANSI-color-codes.h deleted file mode 100644 index 09bab04..0000000 --- a/include/ANSI-color-codes.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This is free and unencumbered software released into the public domain. - * - * For more information, please refer to - */ - -#ifndef ANSI_COLOR_CODES_H -#define ANSI_COLOR_CODES_H - -//Regular text -#define BLK "\033[0;30m" -#define RED "\033[0;31m" -#define GRN "\033[0;32m" -#define YEL "\033[0;33m" -#define BLU "\033[0;34m" -#define MAG "\033[0;35m" -#define CYN "\033[0;36m" -#define WHT "\033[0;37m" - -//Regular bold text -#define BBLK "\033[1;30m" -#define BRED "\033[1;31m" -#define BGRN "\033[1;32m" -#define BYEL "\033[1;33m" -#define BBLU "\033[1;34m" -#define BMAG "\033[1;35m" -#define BCYN "\033[1;36m" -#define BWHT "\033[1;37m" - -//Regular underline text -#define UBLK "\033[4;30m" -#define URED "\033[4;31m" -#define UGRN "\033[4;32m" -#define UYEL "\033[4;33m" -#define UBLU "\033[4;34m" -#define UMAG "\033[4;35m" -#define UCYN "\033[4;36m" -#define UWHT "\033[4;37m" - -//Regular background -#define BLKB "\033[40m" -#define REDB "\033[41m" -#define GRNB "\033[42m" -#define YELB "\033[43m" -#define BLUB "\033[44m" -#define MAGB "\033[45m" -#define CYNB "\033[46m" -#define WHTB "\033[47m" - -//High intensty background -#define BLKHB "\033[0;100m" -#define REDHB "\033[0;101m" -#define GRNHB "\033[0;102m" -#define YELHB "\033[0;103m" -#define BLUHB "\033[0;104m" -#define MAGHB "\033[0;105m" -#define CYNHB "\033[0;106m" -#define WHTHB "\033[0;107m" - -//High intensty text -#define HBLK "\033[0;90m" -#define HRED "\033[0;91m" -#define HGRN "\033[0;92m" -#define HYEL "\033[0;93m" -#define HBLU "\033[0;94m" -#define HMAG "\033[0;95m" -#define HCYN "\033[0;96m" -#define HWHT "\033[0;97m" - -//Bold high intensity text -#define BHBLK "\033[1;90m" -#define BHRED "\033[1;91m" -#define BHGRN "\033[1;92m" -#define BHYEL "\033[1;93m" -#define BHBLU "\033[1;94m" -#define BHMAG "\033[1;95m" -#define BHCYN "\033[1;96m" -#define BHWHT "\033[1;97m" - -//Reset -#define reset "\033[0m" -#define CRESET "\033[0m" -#define COLOR_RESET "\033[0m" - -#endif diff --git a/include/palerain.h b/include/palerain.h deleted file mode 100644 index baf708b..0000000 --- a/include/palerain.h +++ /dev/null @@ -1,226 +0,0 @@ -#ifndef PALERAIN_H -#define PALERAIN_H - -#if defined(__APPLE__) -#define NSIG __DARWIN_NSIG -#endif - -#include "xxd-embedded.h" -#include "paleinfo.h" -#include -#include -#include -#include -#include -#include -#include - -#define LOG(loglevel, ...) p1_log(loglevel, __FILE__, __LINE__, __func__, __VA_ARGS__) -#define CLEAR() printf("\33[2K\r"); -#define palerain_option_case(x) (512 + x) -#define palerain_option_version 129 -#define CMD_LEN_MAX 512 -#define OVERRIDE_MAGIC 0xd803b376 - -#define palerain_option_case_version palerain_option_case(0) -#define palerain_option_case_force_revert palerain_option_case(1) -#define palerain_option_case_libcheckra1nhelper_path palerain_option_case(2) -#define palerain_option_case_cli palerain_option_case(3) - - -#ifdef USE_LIBUSB -#include - -#define USB_RET_SUCCESS LIBUSB_SUCCESS -#define USB_RET_NOT_RESPONDING LIBUSB_ERROR_OTHER -#define USB_RET_IO LIBUSB_ERROR_IO -#define USB_RET_NO_DEVICE LIBUSB_ERROR_NO_DEVICE -typedef int32_t usb_ret_t; -typedef libusb_device_handle *usb_device_handle_t; - -typedef struct stuff -{ - pthread_t th; - libusb_device *dev; - usb_device_handle_t handle; -} stuff_t; -usb_ret_t USBBulkUpload(usb_device_handle_t handle, void *data, int len); -#else -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpedantic" -#include -#include -#include -#pragma clang diagnostic pop - -#define USB_RET_SUCCESS KERN_SUCCESS -#define USB_RET_NOT_RESPONDING kIOReturnNotResponding -#define USB_RET_IO kIOReturnNotReady -#define USB_RET_NO_DEVICE kIOReturnNoDevice - -typedef IOReturn usb_ret_t; -typedef IOUSBInterfaceInterface245 **usb_device_handle_t; - -typedef struct -{ - pthread_t th; - volatile uint64_t regID; - IOUSBDeviceInterface245 **dev; - usb_device_handle_t handle; -} stuff_t; -usb_ret_t USBBulkUpload(usb_device_handle_t handle, void *data, uint32_t len); -#endif - -#ifndef PALERAIN_VERSION -#define PALERAIN_VERSION "2.2.1" -#endif - -#if defined(__APPLE__) -#include -#include -#else -#define MH_MAGIC_64 0xfeedfacf -#define MH_CIGAM_64 0xcffaedfe -#define MH_KEXT_BUNDLE 0xb - -typedef int32_t cpu_type_t; -typedef int32_t cpu_subtype_t; - -#define CPU_ARCH_ABI64 0x01000000 -#define CPU_TYPE_ARM ((cpu_type_t) 12) -#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64) - -struct mach_header_64 -{ - uint32_t magic; /* mach magic number identifier */ - cpu_type_t cputype; /* cpu specifier */ - cpu_subtype_t cpusubtype; /* machine specifier */ - uint32_t filetype; /* type of file */ - uint32_t ncmds; /* number of load commands */ - uint32_t sizeofcmds; /* the size of all the load commands */ - uint32_t flags; /* flags */ - uint32_t reserved; /* reserved */ -}; -#endif - -typedef void *(*pthread_start_t)(void *); - -// Keep in sync with Pongo -#define PONGO_USB_VENDOR 0x05ac -#define PONGO_USB_PRODUCT 0x4141 -#define CMD_LEN_MAX 512 -#define UPLOADSZ_MAX (1024 * 1024 * 128) - -typedef enum { - LOG_FATAL = 0, - LOG_ERROR = 1, - LOG_WARNING = 2, - LOG_INFO = 3, - LOG_VERBOSE = 4, - LOG_VERBOSE2 = 5, - LOG_VERBOSE3 = 6, - LOG_VERBOSE4 = 7, - LOG_VERBOSE5 = 8, -} log_level_t; - -typedef struct { - uint64_t ecid; - char* productType; - char* productVersion; - char* buildVersion; - char* CPUArchitecture; - const char* displayName; -} devinfo_t; - -typedef struct { - int mode; - int cpid; - char product_type[0x20]; - char display_name[0x20]; - char iboot_ver[0x20]; -} recvinfo_t; - -typedef struct { - uint32_t magic; /* 0xd803b376*/ - unsigned char* ptr; /* pointer to the override file in memory */ - uint32_t len; /* length of override file */ - unsigned char* orig_ptr; /* pointer to the overriden file */ - uint32_t orig_len; /* length of the overriden file */ - int fd; /* file descriptor of the override file */ -} override_file_t; - -typedef unsigned char niarelap_file_t[]; - -extern unsigned int verbose; - -extern char* pongo_path; -#ifdef TUI -extern bool tui_started; -#endif - -extern uint64_t palerain_flags; -extern uint64_t* palerain_flags_p; - -extern pthread_t dfuhelper_thread, pongo_thread; -extern int pongo_thr_running, dfuhelper_thr_running; - -extern niarelap_file_t *kpf_to_upload_1, *ramdisk_to_upload_1, *overlay_to_upload_1; -extern niarelap_file_t **kpf_to_upload, **ramdisk_to_upload, **overlay_to_upload; -extern override_file_t override_ramdisk, override_kpf, override_overlay; - -extern uint64_t palerain_flags; -extern pthread_mutex_t log_mutex; - -extern pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex; - -extern int pongo_thr_running, dfuhelper_thr_running; -extern bool device_has_booted; -extern char xargs_cmd[0x270]; -extern char palerain_flags_cmd[0x30]; -extern char* ext_checkra1n; - -void thr_cleanup(void* ptr); -void* dfuhelper(void* ptr); -int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxname, const char* __restrict format, ...); -/* devhelper helpers */ -void devinfo_free(devinfo_t *dev); -bool cpid_is_arm64(unsigned int cpid); -/* devhelper commands */ -int subscribe_cmd(usbmuxd_event_cb_t device_event_cb, irecv_device_event_cb_t irecv_event_cb); -int unsubscribe_cmd(void); -int devinfo_cmd(devinfo_t *dev, const char *udid); -int enter_recovery_cmd(const char* udid); -int reboot_cmd(const char* udid); -int passstat_cmd(unsigned char* status, const char* udid); -int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid); -int autoboot_cmd(const uint64_t ecid); -int exitrecv_cmd(const uint64_t ecid); - -int exec_checkra1n(void); -int override_file(override_file_t *finfo, niarelap_file_t** orig, unsigned int *orig_len, char *filename); -void* pongo_helper(void* ptr); -const unsigned char * -boyermoore_horspool_memmem(const unsigned char* haystack, size_t hlen, - const unsigned char* needle, size_t nlen); - - -usb_ret_t USBControlTransfer(usb_device_handle_t handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint32_t wLength, void *data, uint32_t *wLenDone); -const char *usb_strerror(usb_ret_t err); -int wait_for_pongo(void); -int tui(void); -int optparse(int argc, char* argv[]); - -bool get_spin(void); -bool set_spin(bool val); -bool get_found_pongo(void); -void* pongo_helper(void* _); -bool set_found_pongo(bool val); -uint64_t get_ecid_wait_for_dfu(void); -uint64_t set_ecid_wait_for_dfu(uint64_t ecid); - -void io_start(stuff_t *stuff); -void io_stop(stuff_t *stuff); - -void print_credits(void); - -#endif diff --git a/include/tui.h b/include/tui.h deleted file mode 100644 index fc5e944..0000000 --- a/include/tui.h +++ /dev/null @@ -1,184 +0,0 @@ -#ifndef TUI_H -#define TUI_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define WIDTH 76 -#define HEIGHT 19 - -#define CHECKBOX_STATE(flags, opt) (flags & opt) != 0 ? '*' : ' ' - -#define STR_HELPER(x) #x -#define STR(x) STR_HELPER(x) - -#define CLEAR_SCREEN printf("\033[2J") -#define RESETFONT printf("\x1b[0m") -#define PRINTAT(x, y, str) printf("\x1b[%d;%dH%s", y, x, str) -#define PRINTATT(x, y, str) PRINTAT(tui_x_offset + x, tui_y_offset + y, str) -#define PRINTATLEN(x, y, str, len) printf("\x1b[%d;%dH%." STR(len) "s", y, x, str) -#define PRINTATLENT(x, y, str, len) PRINTATLEN(tui_x_offset + x, tui_y_offset + y, str, len) -#define MOVETO(x, y) printf("\x1b[%d;%dH", y, x) -#define MOVETOT(x, y) MOVETO(tui_x_offset + x, tui_y_offset + y) -#define SETCOLOR(fg, bg) printf("\x1b[%d;%dm", fg, bg) -#define SETCOLORA(fg, bg, a) printf("\x1b[" STR(fg) ";" STR(bg) ";" STR(a) "m") -#define COLOR(fg, bg) "\x1b[" STR(fg) ";" STR(bg) "m" -#define FG_BLACK 30 -#define FG_YELLOW 33 -#define FG_BLUE 34 -#define FG_WHITE 37 -#define BG_BLACK 40 -#define BG_YELLOW 43 -#define BG_BLUE 44 -#define BG_WHITE 47 -#define NONE 0 -#define BOLD 1 -extern bool supports_bright_colors; -#define FG_BRIGHT_BLACK 90 -#define FG_BRIGHT_WHITE 97 -#define BG_BRIGHT_BLACK 100 -#define BG_BRIGHT_WHITE 107 -#define G1D4(set) printf("\x1b\x29%c", set) -#define DSGON putchar('\x0e'); G1D4('0') -#define DSGOFF putchar('\x0f'); G1D4('B') -#define MOUSEON printf("\x1b[?1003h") -#define MOUSEOFF printf("\x1b[?1003l") -#define CIVIS printf("\x1b[?25l") -#define CNORM printf("\x1b[?25h") -#define SMCUP printf("\x1b[?1049h") -#define RMCUP printf("\x1b[?1049l") -#define DRAWLINE(x, y, len) \ - MOVETO(x, y); \ - DSGON; \ - for (int i = 0; i < len; i++) { \ - putchar(0x71); \ - } \ - DSGOFF; -#define DRAWLINET(x, y, len) DRAWLINE(tui_x_offset + x, tui_y_offset + y, len) - -typedef enum tui_screens { - ERROR_SCREEN = -1, - EXIT_SCREEN = 0, - MAIN_SCREEN = 1, - OPTIONS_SCREEN = 2, - ENTER_DFU_SCREEN = 3, - JAILBREAK_SCREEN = 4, - ENTER_RECOVERY_SCREEN = 5 -} tui_screen_t; - -typedef struct bitfield_checkbox_info { - uint64_t* flags_p; - uint64_t opt; -} tui_bit_info_t; - -tui_screen_t tui_screen_main(void); -void tui_screen_main_redraw(void); -tui_screen_t tui_screen_options(void); -void tui_screen_options_redraw(void); -tui_screen_t tui_screen_enter_recovery(void); -void tui_screen_enter_recovery_redraw(void); -tui_screen_t tui_screen_enter_dfu(void); -void tui_screen_enter_dfu_redraw(void); -tui_screen_t tui_screen_jailbreak(void); -void tui_screen_jailbreak_redraw(void); - -int redraw_screen(void); - -void tui_draw_rectangle(int x1, int y1, int x2, int y2); - -#ifdef BUILD_TAG -#define TUI_VERSION BUILD_TAG -#else -#define TUI_VERSION "Unknown Version" -#endif - -extern int tui_x_offset; -extern int tui_y_offset; - -extern int tui_mouse_x; -extern int tui_mouse_y; - -enum { - TUI_INPUT_NONE, - TUI_INPUT_LEFT, - TUI_INPUT_RIGHT, - TUI_INPUT_UP, - TUI_INPUT_DOWN, - TUI_INPUT_MOUSE_MOVE, - TUI_INPUT_MOUSE_DOWN, - TUI_INPUT_MOUSE_UP, - TUI_INPUT_SELECT, - TUI_INPUT_TAB, - TUI_INPUT_TAB_BACK, - TUI_INPUT_BACKSPACE, - TUI_INPUT_ESCAPE, -}; - -enum { - TUI_EVENT_INPUT, - TUI_EVENT_CONNECTED_DEVICES_CHANGED, - TUI_EVENT_JAILBREAK_STATUS_CHANGED -}; - -int tui_get_input(void); -void *tui_input_thread(void *arg); -int tui_get_event(void); -int tui_try_get_event(void); - -extern int tui_last_event; -extern int tui_last_input; -extern sem_t *tui_event_semaphore; -extern char tui_last_key; - -void tui_devhelper(void); - -enum tui_device_mode { - TUI_DEVICE_MODE_NORMAL, - TUI_DEVICE_MODE_RECOVERY, - TUI_DEVICE_MODE_DFU -}; - -struct tui_connected_device { - uint64_t ecid; - char udid[44]; - char version[0x20]; - bool arm64; - enum tui_device_mode mode; - char product_type[0x20]; - char display_name[0x20]; - unsigned int cpid; - bool requires_passcode_disabled; - bool passcode_state; - struct tui_connected_device *next; -}; - -extern struct tui_connected_device *tui_connected_devices; - -void tui_jailbreak(void); -extern bool tui_is_jailbreaking; -extern int tui_jailbreak_stage; -extern char *tui_jailbreak_status; - -void tui_jailbreak_status_changed(void); - -extern bool tui_is_restarting; -void tui_terminate(int sig); - -extern bool tui_options_safe_mode; -extern bool tui_options_verbose_boot; -extern bool tui_options_force_revert; -extern bool tui_options_flower_chain; - -extern char tui_options_boot_args[0x1e0 + 1]; - -#endif diff --git a/include/xxd-embedded.h b/include/xxd-embedded.h deleted file mode 100644 index e63d671..0000000 --- a/include/xxd-embedded.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef XXD_EMBEDDED_H -#define XXD_EMBEDDED_H - -#if defined(__APPLE__) -#include -#endif - -#include - -extern uint8_t checkra1n[]; -extern uint32_t checkra1n_len; - -extern uint8_t checkra1n_kpf_pongo_lzma[]; -extern uint32_t checkra1n_kpf_pongo_lzma_len; - -extern uint8_t ramdisk_dmg_lzma[]; -extern uint32_t ramdisk_dmg_lzma_len; - -extern uint8_t binpack_dmg[]; -extern uint32_t binpack_dmg_len; - -extern uint8_t Pongo_bin[]; -extern uint32_t Pongo_bin_len; - -#if defined(__APPLE__) && (TARGET_OS_IPHONE || defined(DEV_BUILD) || defined(FORCE_HELPER)) -extern uint8_t libcheckra1nhelper_dylib[]; -extern uint32_t libcheckra1nhelper_dylib_len; -#endif - -#endif diff --git a/packaging/control b/packaging/control deleted file mode 100644 index 10bf74c..0000000 --- a/packaging/control +++ /dev/null @@ -1,22 +0,0 @@ -Package: palera1n -Name: palera1n -Version: @DEB_VERSION@ -Architecture: @DEB_ARCH@ -Maintainer: palera1n team -Author: palera1n team -Depends: usbmuxd -Section: Utilities -Priority: optional -Homepage: https://palera.in -Description: iOS 15.0+ semi-tethered checkm8 jailbreak - palera1n is an iOS/iPadOS 15.0+ semi tethered jailbreak - based on the checkm8 exploit. - . - palera1n is able to jailbreak the device in fakefs-rootful mode, - where / is writable, as well as rootless mode, where / cannot be - written to. - . - IMPORTANT: This does NOT make palera1n untethered or allow you to - jailbreak your current device without a computer. It just allows - you to jailbreak another iDevice using this device, given you have - an appropriate cable. Also, the success rate is likely to be bad. diff --git a/packaging/control.macosx b/packaging/control.macosx deleted file mode 100644 index f8b00e3..0000000 --- a/packaging/control.macosx +++ /dev/null @@ -1,16 +0,0 @@ -Package: palera1n -Name: palera1n -Version: @DEB_VERSION@ -Architecture: @DEB_ARCH@ -Maintainer: palera1n team -Author: palera1n team -Section: Utilities -Priority: optional -Homepage: https://palera.in -Description: iOS 15.0+ semi-tethered checkm8 jailbreak - palera1n is an iOS/iPadOS 15.0+ semi tethered jailbreak - based on the checkm8 exploit. - . - palera1n is able to jailbreak the device in fakefs-rootful mode, - where / is writable, as well as rootless mode, where / cannot be - written to. diff --git a/patches/gpm/001_missing_V_option.patch b/patches/gpm/001_missing_V_option.patch deleted file mode 100644 index cb35a27..0000000 --- a/patches/gpm/001_missing_V_option.patch +++ /dev/null @@ -1,23 +0,0 @@ -Description: Add no-op option -V for compatibility - -Index: b/src/daemon/cmdline.c -=================================================================== ---- a/src/daemon/cmdline.c 2008-05-29 02:26:08.000000000 +0300 -+++ b/src/daemon/cmdline.c 2008-06-11 05:46:23.000000000 +0300 -@@ -32,7 +32,7 @@ - void cmdline(int argc, char **argv) - { - extern struct options option; -- char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:Tuv23"; -+ char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TuvV23"; - int opt; - - /* initialize for the dual mouse */ -@@ -81,6 +81,7 @@ void cmdline(int argc, char **argv) - case 'u': option.autodetect = 1; break; - case 'T': opt_test++; break; - case 'v': printf(GPM_MESS_VERSION "\n"); exit(0); -+ case 'V': /* Compat code */ break; - case '2': (which_mouse->opt_three) = -1; break; - case '3': (which_mouse->opt_three) = 1; break; - default: exit(usage("commandline")); diff --git a/patches/gpm/014_has_mouse_control.patch b/patches/gpm/014_has_mouse_control.patch deleted file mode 100644 index a29ac54..0000000 --- a/patches/gpm/014_has_mouse_control.patch +++ /dev/null @@ -1,39 +0,0 @@ -Description: source code of gpm_has_mouse_control helper - -Index: b/contrib/control/gpm_has_mouse_control.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ b/contrib/control/gpm_has_mouse_control.c 2007-12-10 08:25:45.000000000 +0200 -@@ -0,0 +1,20 @@ -+#include -+#include -+#include -+#include -+#include -+ -+int main (int argc, char **argv) -+{ -+ int fd; -+ int mode; -+ fd = open ("/dev/tty0", O_RDONLY); -+ if (fd == -1) -+ fd = open ("/dev/vc/0", O_RDONLY); -+ if (fd == -1) -+ perror ("open"); -+ if (ioctl (fd, KDGETMODE, &mode) != 0) -+ perror ("ioctl"); -+ exit(mode); -+} -+ -Index: b/contrib/control/Makefile -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ b/contrib/control/Makefile 2007-12-10 08:25:45.000000000 +0200 -@@ -0,0 +1,7 @@ -+CC := gcc -+ -+all: gpm_has_mouse_control.c -+ $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o gpm_has_mouse_control -Wall gpm_has_mouse_control.c -+ -+clean: -+ -rm -f gpm_has_mouse_control diff --git a/patches/gpm/031_max_consoles.patch b/patches/gpm/031_max_consoles.patch deleted file mode 100644 index 26d7124..0000000 --- a/patches/gpm/031_max_consoles.patch +++ /dev/null @@ -1,107 +0,0 @@ -Description: Use MAX_NR_CONSOLES instead of MAX_VC - ---- a/src/daemon/gpm.c -+++ b/src/daemon/gpm.c -@@ -93,7 +93,7 @@ - int fifofd=-1; - - int eventFlag=0; --Gpm_Cinfo *cinfo[MAX_VC+1]; -+Gpm_Cinfo *cinfo[MAX_NR_CONSOLES+1]; - - time_t last_selection_time; - time_t opt_age_limit = 0; ---- a/src/daemon/old_main.c -+++ b/src/daemon/old_main.c -@@ -141,7 +141,7 @@ - signal(SIGWINCH,gpm_killed); /* reinstall handler */ - - /* and notify clients */ -- for(i=0; inext) kill(ci->data.pid,SIGWINCH); - } -@@ -214,7 +214,7 @@ - /*........................ got request */ - - /* itz 10-22-96 check _all_ clients, not just those on top! */ -- for (i=0; pending && (i<=MAX_VC); i++) { -+ for (i=0; pending && (i<=MAX_NR_CONSOLES); i++) { - Gpm_Cinfo* ci; - for (ci = cinfo[i]; pending && ci; ci = ci->next) { - if (FD_ISSET(ci->fd,&selSet)) { ---- a/src/daemon/processconn.c -+++ b/src/daemon/processconn.c -@@ -67,8 +67,8 @@ - return -1; - } - -- if((vc = request->vc) > MAX_VC) { -- gpm_report(GPM_PR_DEBUG, GPM_MESS_REQUEST_ON, vc, MAX_VC); -+ if((vc = request->vc) > MAX_NR_CONSOLES) { -+ gpm_report(GPM_PR_DEBUG, GPM_MESS_REQUEST_ON, vc, MAX_NR_CONSOLES); - free(info); - close(newfd); - return -1; ---- a/src/daemon/processrequest.c -+++ b/src/daemon/processrequest.c -@@ -41,7 +41,7 @@ - - gpm_report(GPM_PR_INFO, GPM_MESS_CON_REQUEST, ci->fd, vc); - -- if (vc>MAX_VC) return -1; -+ if (vc>MAX_NR_CONSOLES) return -1; - - /* itz 10-22-96 this shouldn't happen now */ - if (vc==-1) gpm_report(GPM_PR_OOPS, GPM_MESS_UNKNOWN_FD); ---- a/src/headers/daemon.h -+++ b/src/headers/daemon.h -@@ -26,6 +26,7 @@ - */ - #include "gpm.h" /* Gpm_Event */ - #include /* fd_set */ -+#include /* for cinfo -- to be moved to os/linux in 2.x! */ - - /************************************************************************* - * Types / structures -@@ -104,13 +105,6 @@ - * Macros - */ - --/* How many virtual consoles are managed? */ --#ifndef MAX_NR_CONSOLES --# define MAX_NR_CONSOLES 64 /* this is always sure */ --#endif -- --#define MAX_VC MAX_NR_CONSOLES /* doesn't work before 1.3.77 */ -- - /* for adding a mouse; add_mouse */ - #define GPM_ADD_DEVICE 0 - #define GPM_ADD_TYPE 1 -@@ -174,7 +168,7 @@ - extern int eventFlag; - extern struct winsize win; - --extern Gpm_Cinfo *cinfo[MAX_VC+1]; -+extern Gpm_Cinfo *cinfo[MAX_NR_CONSOLES+1]; - - extern struct mouse_features mouse_table[3], - *which_mouse; /*the current one*/ ---- a/src/headers/gpmCfg.h -+++ b/src/headers/gpmCfg.h -@@ -32,14 +32,6 @@ - #include - #endif - --/* FIXME: still needed ?? */ --/* How many virtual consoles are managed? */ --#ifndef MAX_NR_CONSOLES --# define MAX_NR_CONSOLES 64 /* this is always sure */ --#endif -- --#define MAX_VC MAX_NR_CONSOLES /* doesn't work before 1.3.77 */ -- - /* How many buttons may the mouse have? */ - /* #define MAX_BUTTONS 3 ===> not used, it is hardwired :-( */ - diff --git a/patches/gpm/080_cross-compile.patch b/patches/gpm/080_cross-compile.patch deleted file mode 100644 index 15c3589..0000000 --- a/patches/gpm/080_cross-compile.patch +++ /dev/null @@ -1,13 +0,0 @@ -Description: Add AC_CANONICAL_HOST - ---- a/configure.ac.footer -+++ b/configure.ac.footer -@@ -35,6 +35,8 @@ - # Find programs - # - -+AC_CANONICAL_HOST -+ - AC_PROG_CC - AC_PROG_LIBTOOL - AC_PROG_INSTALL diff --git a/patches/gpm/092_fix-format-not-a-string-literal-and-no-format-arguments.patch b/patches/gpm/092_fix-format-not-a-string-literal-and-no-format-arguments.patch deleted file mode 100644 index 87e5958..0000000 --- a/patches/gpm/092_fix-format-not-a-string-literal-and-no-format-arguments.patch +++ /dev/null @@ -1,16 +0,0 @@ -Description: Fix FTBFS with -Wformat-security -Author: Axel Beckert -Bug-Debian: https://bugs.debian.org/888792 -Bug-Debian: https://bugs.debian.org/888797 - ---- a/src/lib/report-lib.c -+++ b/src/lib/report-lib.c -@@ -47,7 +47,7 @@ - log_level = LOG_CRIT; break; - } - #ifdef HAVE_VSYSLOG -- syslog(log_level, string); -+ syslog(log_level, "%s", string); - vsyslog(log_level, text, ap); - #else - fprintf(stderr,"%s[%s(%d)]:\n",string,file,line); diff --git a/patches/gpm/093_fix-typos.patch b/patches/gpm/093_fix-typos.patch deleted file mode 100644 index 3e940b4..0000000 --- a/patches/gpm/093_fix-typos.patch +++ /dev/null @@ -1,133 +0,0 @@ -Description: Fix spelling errors found by lintian -Author: Axel Beckert - ---- a/doc/FAQ -+++ b/doc/FAQ -@@ -132,7 +132,7 @@ - to keep hold of processor time for at least 1 second). - - no pnp vendor will be able to support three buttons any more (no - more mouse protocols, all mice must behave the same). -- - similary, only 1200 baud devices (any serial device) are supported, -+ - similarly, only 1200 baud devices (any serial device) are supported, - because the initialization string of pnp devices only tells - the vendor and release, with no information about required - port configuration. ---- a/doc/doc.gpm.in -+++ b/doc/doc.gpm.in -@@ -394,7 +394,7 @@ - automatically forces the @emph{repeater} (@samp{\-R}) option on. - - @item \-o @var{list-of-extra-options} -- The option works similary to the ``\-o'' option of mount; it is -+ The option works similarly to the ``\-o'' option of mount; it is - used to specify a list of ``extra options'' that are specific - to each mouse type. The list is comma-separated. The options - @samp{dtr}, @samp{rts} or @samp{both} are used by the serial ---- a/src/daemon/old_main.c -+++ b/src/daemon/old_main.c -@@ -190,7 +190,7 @@ - /*....................................... got mouse, process event */ - /* - * Well, actually, run a loop to maintain inlining of functions without -- * lenghtening the file. This is not too clean a code, but it works.... -+ * lengthening the file. This is not too clean a code, but it works.... - */ - - for (i=1; i <= 1+opt_double; i++) { ---- a/src/mice.c -+++ b/src/mice.c -@@ -122,7 +122,7 @@ - break; - } - if (p->type == ARGV_END) { /* not found */ -- fprintf(stderr, "%s: Uknown option \"%s\" for pointer \"%s\"\n", -+ fprintf(stderr, "%s: Unknown option \"%s\" for pointer \"%s\"\n", - option.progname, argv[i], argv[0]); - errors++; - continue; ---- a/src/prog/mouse-test.c -+++ b/src/prog/mouse-test.c -@@ -524,7 +524,7 @@ - Gpm_Event event; - - if (packetsize!=cur->this->packetlen) { -- REMOVETYPE(cur,"different packet lenght"); -+ REMOVETYPE(cur,"different packet length"); - continue; - } - ---- a/src/synaptics.c -+++ b/src/synaptics.c -@@ -2471,7 +2471,7 @@ - #define PS2_SCALE_11 0xE6 /* Set scale to 1:1 */ - - --/* Normal ps2 responce */ -+/* Normal ps2 response */ - #define PS2_ERROR 0xFC /* Error, after a reset,resend or disconnect*/ - #define PS2_ACK 0xFA /* Command acknowledge */ - #define PS2_READY 0xAA /* Send after a calibration or ERROR */ -@@ -2538,7 +2538,7 @@ - } - - # ifdef DEBUG_PUTBYTE_ACK -- gpm_report(GPM_PR_DEBUG,"Responce %X to byte %X",ack,b); -+ gpm_report(GPM_PR_DEBUG,"Response %X to byte %X",ack,b); - # endif - - return ack; -@@ -2565,11 +2565,11 @@ - - /* Do some sanity checking */ - if((response[0] & 0xFC) != 0x84) { -- gpm_report (GPM_PR_ERR,"Byte 0 of stick device responce is not valid"); -+ gpm_report (GPM_PR_ERR,"Byte 0 of stick device response is not valid"); - return -1; - } - if((response[3] & 0xCC) != 0xC4) { -- gpm_report (GPM_PR_ERR,"Byte 3 of stick device responce is not valid"); -+ gpm_report (GPM_PR_ERR,"Byte 3 of stick device response is not valid"); - return -1; - } - } -@@ -2844,7 +2844,7 @@ - byte status,id_code = PS2_MOUSE_IDCODE; - byte reset_cmd = PS2_RESET; - -- gpm_report(GPM_PR_DEBUG,"Reseting Synaptic PS/2 %s\n",(stick?"Stick":"Touchpad")); -+ gpm_report(GPM_PR_DEBUG,"Resetting Synaptic PS/2 %s\n",(stick?"Stick":"Touchpad")); - - /* Send reset command without eating the ack. */ - if(!stick) { -@@ -2871,11 +2871,11 @@ - usleep(750000); - - if ( (status = syn_ps2_getbyte(fd,stick)) != PS2_READY ){ -- gpm_report(GPM_PR_ERR,"Reseting PS/2 Device failed: No READY, got %02X.\n" -+ gpm_report(GPM_PR_ERR,"Resetting PS/2 Device failed: No READY, got %02X.\n" - "Check pc_keyb.c for reconnect smartness.\n",status); - } - if ( (id_code = syn_ps2_getbyte(fd,stick)) != PS2_MOUSE_IDCODE){ -- gpm_report(GPM_PR_ERR,"Reseting PS/2 Device failed: Wrong ID, got %02X.\n",id_code); -+ gpm_report(GPM_PR_ERR,"Resetting PS/2 Device failed: Wrong ID, got %02X.\n",id_code); - } - - } -@@ -3155,7 +3155,7 @@ - - void syn_serial_reset(int fd) - { -- gpm_report (GPM_PR_INFO,"Reseting Synaptic Serial Touchpad."); -+ gpm_report (GPM_PR_INFO,"Resetting Synaptic Serial Touchpad."); - - syn_serial_set_mode (fd, (RELATIVE_MODE | - HIGH_REPORT_RATE | -@@ -3247,7 +3247,7 @@ - - void syn_ps2_reset (int fd) - { -- gpm_report (GPM_PR_INFO,"Reseting Synaptic PS/2 Touchpad."); -+ gpm_report (GPM_PR_INFO,"Resetting Synaptic PS/2 Touchpad."); - - /* Stop incoming motion data (of whatever kind absolute/relative). */ - tp_ps2_disable_data(fd); diff --git a/patches/gpm/094_gpm-1.20.7-glibc-2.26-1.patch b/patches/gpm/094_gpm-1.20.7-glibc-2.26-1.patch deleted file mode 100644 index 1a6868e..0000000 --- a/patches/gpm/094_gpm-1.20.7-glibc-2.26-1.patch +++ /dev/null @@ -1,63 +0,0 @@ -Origin: http://download.nutyx.org/x86_64/rolling/cli/gpm/gpm-1.20.7-consolidated-1.patch -Bug: https://github.com/telmich/gpm/issues/21 -Bug-Debian: https://bugs.debian.org/886903 -Bug-LFS: https://wiki.linuxfromscratch.org/blfs/ticket/9616#ticket -Author: tnut from nutyx.org, https://github.com/tnut -Description: Fix FTBFS with glibc 2.26 - ---- a/src/daemon/open_console.c -+++ b/src/daemon/open_console.c -@@ -24,6 +24,10 @@ - #include /* ioctl */ - #include /* major() */ - -+#ifdef HAVE_SYS_SYSMACROS_H -+#include /* major() w/newer glibc */ -+#endif -+ - /* Linux specific (to be outsourced in gpm2 */ - #include /* for serial console check */ - #include /* for serial console check */ ---- a/src/prog/gpm-root.y -+++ b/src/prog/gpm-root.y -@@ -443,6 +443,7 @@ - } - - /*---------------------------------------------------------------------*/ -+#if 0 - static int f_debug_one(FILE *f, Draw *draw) - { - DrawItem *ip; -@@ -465,6 +466,7 @@ - #undef LINE - return 0; - } -+#endif - - int f_debug(int mode, DrawItem *self, int uid) - { -@@ -960,10 +962,8 @@ - /*------------*/ - static inline void scr_restore(int fd, FILE *f, unsigned char *buffer, int vc) - { -- int x,y, dumpfd; -+ int dumpfd; - char dumpname[20]; -- -- x=buffer[2]; y=buffer[3]; - - /* WILL NOT WORK WITH DEVFS! FIXME! */ - sprintf(dumpname,"/dev/vcsa%i",vc); -@@ -1196,11 +1196,7 @@ - LOG_DAEMON : LOG_USER); - /* reap your zombies */ - childaction.sa_handler=reap_children; --#if defined(__GLIBC__) -- __sigemptyset(&childaction.sa_mask); --#else /* __GLIBC__ */ -- childaction.sa_mask=0; --#endif /* __GLIBC__ */ -+ sigemptyset(&childaction.sa_mask); - childaction.sa_flags=SA_INTERRUPT; /* need to break the select() call */ - sigaction(SIGCHLD,&childaction,NULL); - diff --git a/patches/gpm/095_fix-compilation-with-gcc-10.patch b/patches/gpm/095_fix-compilation-with-gcc-10.patch deleted file mode 100644 index c8be146..0000000 --- a/patches/gpm/095_fix-compilation-with-gcc-10.patch +++ /dev/null @@ -1,20 +0,0 @@ -Description: FTBFS with gcc-10 due to -fno-commons -Author: Sergei Trofimovich -Reviewed-By: Helmut Grohne -Origin: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=8f7e2ac82fc5a1847c132057fb7de1a996d66c76 -Forwarded: https://github.com/telmich/gpm/pull/37 -Bug: https://github.com/telmich/gpm/pull/37 -Bug-Gentoo: https://bugs.gentoo.org/705878 -Bug-Debian: https://bugs.debian.org/953266 - ---- a/src/headers/daemon.h -+++ b/src/headers/daemon.h -@@ -176,7 +176,7 @@ - extern Gpm_Type mice[]; - extern Gpm_Type *repeated_type; - --time_t last_selection_time; -+extern time_t last_selection_time; - - - diff --git a/patches/gpm/096_fix-compilation-against-musl-libc.patch b/patches/gpm/096_fix-compilation-against-musl-libc.patch deleted file mode 100644 index cfb8b1c..0000000 --- a/patches/gpm/096_fix-compilation-against-musl-libc.patch +++ /dev/null @@ -1,69 +0,0 @@ -Description: Add musl support - * Use SA_NODEFER instead of its non-standard alias SA_NOMASK. - * Add missing sys/select.h and fcntl.h includes. - * Use standard sigemptyset unconditionally. - * Define SA_INTERRUPT if it's not defined (historical no-op). - * With these changes gpm builds against musl libc. -Author: Szabolcs Nagy -Bug-Debian: https://bugs.debian.org/813751 - ---- a/src/lib/liblow.c -+++ b/src/lib/liblow.c -@@ -179,7 +179,7 @@ - /* Reincarnation. Prepare for another death early. */ - sigemptyset(&sa.sa_mask); - sa.sa_handler = gpm_suspend_hook; -- sa.sa_flags = SA_NOMASK; -+ sa.sa_flags = SA_NODEFER; - sigaction (SIGTSTP, &sa, 0); - - /* Pop the gpm stack by closing the useless connection */ -@@ -386,7 +386,7 @@ - - /* if signal was originally ignored, job control is not supported */ - if (gpm_saved_suspend_hook.sa_handler != SIG_IGN) { -- sa.sa_flags = SA_NOMASK; -+ sa.sa_flags = SA_NODEFER; - sa.sa_handler = gpm_suspend_hook; - sigaction(SIGTSTP, &sa, 0); - } ---- a/src/prog/display-buttons.c -+++ b/src/prog/display-buttons.c -@@ -36,6 +36,7 @@ - #include /* printf() */ - #include /* time() */ - #include /* errno */ -+#include /* fd_set, FD_ZERO */ - #include /* gpm information */ - - /* display resulting data */ ---- a/src/prog/display-coords.c -+++ b/src/prog/display-coords.c -@@ -37,6 +37,7 @@ - #include /* printf() */ - #include /* time() */ - #include /* errno */ -+#include /* fd_set, FD_ZERO */ - #include /* gpm information */ - - /* display resulting data */ ---- a/src/prog/gpm-root.y -+++ b/src/prog/gpm-root.y -@@ -1197,6 +1197,9 @@ - /* reap your zombies */ - childaction.sa_handler=reap_children; - sigemptyset(&childaction.sa_mask); -+#ifndef SA_INTERRUPT -+#define SA_INTERRUPT 0 -+#endif - childaction.sa_flags=SA_INTERRUPT; /* need to break the select() call */ - sigaction(SIGCHLD,&childaction,NULL); - ---- a/contrib/control/gpm_has_mouse_control.c -+++ b/contrib/control/gpm_has_mouse_control.c -@@ -1,4 +1,4 @@ --#include -+#include - #include - #include - #include diff --git a/patches/mbedtls/0001-Allow-empty-x509-cert-issuer.patch b/patches/mbedtls/0001-Allow-empty-x509-cert-issuer.patch deleted file mode 100644 index 4212647..0000000 --- a/patches/mbedtls/0001-Allow-empty-x509-cert-issuer.patch +++ /dev/null @@ -1,34 +0,0 @@ -From a2d012f3ba459f6debe636b576ad9aeab7b3c2aa Mon Sep 17 00:00:00 2001 -From: Nick Chan -Date: Sat, 27 May 2023 23:50:23 +0800 -Subject: [PATCH] Allow empty x509 cert issuer - ---- - library/x509_crt.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/library/x509_crt.c b/library/x509_crt.c -index cf62532f2..ef25b3d77 100644 ---- a/library/x509_crt.c -+++ b/library/x509_crt.c -@@ -1061,13 +1061,13 @@ static int x509_crt_parse_der_core(mbedtls_x509_crt *crt, - - if ((ret = mbedtls_asn1_get_tag(&p, end, &len, - MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) { -- mbedtls_x509_crt_free(crt); -- return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret); -+ /*mbedtls_x509_crt_free(crt); -+ return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);*/ - } - - if ((ret = mbedtls_x509_get_name(&p, p + len, &crt->issuer)) != 0) { -- mbedtls_x509_crt_free(crt); -- return ret; -+ /*mbedtls_x509_crt_free(crt); -+ return ret;*/ - } - - crt->issuer_raw.len = p - crt->issuer_raw.p; --- -2.39.1 - diff --git a/payloads/Pongo.bin b/payloads/Pongo.bin new file mode 100644 index 0000000000000000000000000000000000000000..490b1aa436995184e0dfce8b729b32701926953e GIT binary patch literal 254224 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�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 literal 0 HcmV?d00001 diff --git a/payloads/shellcode.bin b/payloads/shellcode.bin new file mode 100644 index 0000000000000000000000000000000000000000..14c424edac67ec5c3b0c8e76caa5437875e58f10 GIT binary patch literal 512 zcmZ8dK}Z`x6n#6h*#u(KtprRlWS2-R^b|Eh4uWYKf+s<`cj?7@4&F+!=}Hc{n9{q! z))+S@rG?y*9z-E0h0QgIO;t!y;&CaR{>iZe!~FUG{rBI0k38m#Ih=w2?di`KGm8oE za`q`A3`kYMI{5wW(=Y^mOM&iB?Oa{tGR=Ap&08HCM?x%1d~HXo#DUK;uEOXVP)B_Q z)*WEo5O>M^Q9n07)O+xaz6fCjfUpf#wpUQGiN9ou<0G?m+yX{*sy`<#0N;L*rW#NV z(tje}<~&Zh+JD@x5HtHLC@AE$)O}6fNIn}{qeyY@4=-fM XPr2`aha3~3PG8yVlDCsHn`QV1E_|$b literal 0 HcmV?d00001 diff --git a/payloads/yolo_s8000.bin b/payloads/yolo_s8000.bin new file mode 100644 index 0000000000000000000000000000000000000000..bce02a277ee4bb94f79eafa6a85219c2476ca521 GIT binary patch literal 2852 zcmai0du&tJ8UN0`eq583-aOWZg~oOWBGIb#5mjQ0HP;W6G+_`f*5*o^k~EZMGi%8m zlb9FE3Ahamrg0;rRr@FA6=hZ@RT->tv=XPF(Tbu4GiOMX7CV%NE!u><2c!#lzvIWK z5Yn!6b;{xUvj%PEMCv~=$8_*vYID3O;GCr;|7dJA%W#ow76P+|N>#=X6 zIOCdmBbWO*xn4|p@Vl$2vSl~*zd{rs(w6Axp5YTSJn6Rdj5Cs!ge}gYm3ccBaQ*`K znQ2nZ9@u{1%Y(@@!4|-5X03Sz=QhH|L+|q}5!b8m6LZck$rQUQv)CQEF7|Kvsn`(g zcgf!P;Nio%M>%c4?@*LczQ=AEOu+g7B*zO=k5b^)?;_?d(= zs>o!CQJpbv%y+DO{>GPTp0{pH3|ntcWvvp=+B(lCFKJ}j8t-InERkI(yOXthu4hRl za|CBZE9tC-cioMU^(P}_Ta2i!pScl#i<|2fZPY-z;^4i?;0I!ANLVF4WyqYaT0RzX z66Dw-hiy)h7yBTKef2BRNqt_97?MIw!sdTMR|d8*Vn<3eAFr>l@RRz`S9nq(o)o#S zUr7NgY4Itd{?n>Ad|LJ4_lLVhZea7BT<*!6h~?;JZDI~Q7r}E8JQs^RY1tb4J9tKk zF3*uYDn;zu;U_6{cKQ@*k`5U2GOv_1u74eP z%}!@MPf(5El`ULv5%IUt*@o>7)B1Lz>CKwKMr)0y>C!;W_FOmX7d{JI72^4(pC&GS z%UWgsaNUuGgmyQ#u`@eup}_A{s;Lh{Lr$t)6 zSK7ESh`h33!FKEW-PcZlF8YT-*1E5=09ybIIv4<{y?U<`(7?6@}eNtOze>pEA~RypOCu-zcyikzh0I4PeNYko`Vg` z(D5JS>VX|R>wJvj&Zj7@tfHWjs7tvdQpGIEuy?ZzcGjy}e)dQ%?`J;Ihwn18{&u-} z13hbjo(AY?At^tb!my#6oU^VkP|$;4QU-N_lXm`0--k6_O~EM-rJO`2DVjN@J=nK_ zhFC1+{Ds-(0BkQ$C)Y)IHiO!e=$O6>XNWp=!9EXWU37+LUk6SD%;>aEWRHaaCq4&% zN9YAiG?8UmG|z*1cD%7dGs&uryO_KrW+PLgdOE?g-vmv>k*7y=I$4);xDXTQ;-`)q z8uq1mmtdG*6?LgGc0ecfMa*a=MrvJt7B)Uk!Nf`mGAW8$=SF>g*0s$38vXQ#$4Tvb zOS>y(AhDL&{ZjSfLFA|nGOi*n;UJX(o@YEMS8MCnRMUE|g|;D=FK7 zkPVBoO641Vck)#utxAA5%fN( zpf~!Xf}TGX*FbT#z%Se#D{yy&qQ%+XtI{?fa-Wu+G2!bYc&Zcsx0HAsq0GHp0Q1EhYM|!UVh)7POP*2P4joD$rYkBpAgepx;KpAyZCe?W zDunL+xPNx2ZDFC?cT8*Q-L)FFtO!Naj&L`<6wW}e5BB)WwRkUCIwAvK+&*%g`nwfh zn1SYfmP{Y+xgABkIHz|9Rl$y$*6V8~M2v(jiZ-e%%dnv{raQ{H5yRb5(62!MO9lO^ z*0c$COREZ9IPZ)&6TU|T9lGYQzli-Oz;{!7IEtU+pBDb({jdPNKIrvbU-v(~a^rjY z8aFo@pub@)H>|Gr^tFI@;_mY%aqRZx`OwKgOBR%?Y-`8+qoaqeZobkr@l)WZm?OkdGhM7K b|K3={U2yc<)+z;e$DvoLxea%Xh|PZihg_R! literal 0 HcmV?d00001 diff --git a/payloads/yolo_s8001.bin b/payloads/yolo_s8001.bin new file mode 100644 index 0000000000000000000000000000000000000000..8e6abfc29ea14cd7a4f184945f13b4d0a93d2b91 GIT binary patch literal 4164 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 AC;$Ke literal 0 HcmV?d00001 diff --git a/payloads/yolo_t7001.bin b/payloads/yolo_t7001.bin new file mode 100644 index 0000000000000000000000000000000000000000..262f4df4c14d71b15d919f22c30120fa38d785c5 GIT binary patch literal 2888 zcmai0eQZ^f$q>ZA8)2GWAF(6*hBz*8I@%jJZm-Gf6tIY57 z^v9Inw?r>NXIhZQMk+8$zyCvv%vq+P@B`GKB? zNwsG#?d&`4qvTA0Vy4FEsKjZ_8`;d2b0*s@EZ9#-nsXhunK*4Sudp(pWz-R~FLut# zY{a^Q5=?OWdM@`9@;;vOrh0ttoy>uG$*^P=~lLkC9?|^x3W(E zhgmYneiwVhs_Bd-dTx)9<40puwm4$6f969DG@mdvK5ijp3CLb$I0NEpDS(QYvQ$A= zwcklS1$t~zz%LJ}i#wrKk)fhF1O+a;yAvAPa@`nmmqTqGM9=nY1I+` zD`duru3RH$BmljC0RIzoCWy}7R9$f?BW?Z>^t7tS`<5ezz@L{n1V2+>z`qN8?QdN6 z%|`l#cYnEk6ML|7@G8Yje_nQFoOPcw{fdxrsg|*S0p}#0&Rjf!x}<&9yeg_yF3cA} z=T174ag$rhs+ur&$oQAhna1rd+wpp``DJ&s$>H`lPw#PW&-JoFd1gtgK|Eh>qsi%~ z9W~C&YeyH7{B~}0clM%2q4x}`E(@QtZk+F(9pAjFFd1c{(?~Y&h&K?6__7H=vuOX)y)g8a5u87}N zzYx#&>{c};d$j|#-;q3))#+%K7*Eh{Pc;Tdf^d#3YCrjV^cX#6M-_6vvz1Twpzbfq znxpzF3hH6sb4trQDkXe(b77em9kFJ`wF7Hu>kr6XV;i5;aNdAHgU6vSZC`^AcVOdR z$kly6UdwuxQNmM4iOY2q)|2%qu8<+;NrwG0%jorNgTd`DY5c0JLB$*REGYXh$?OLH zkbNCJtHD+yY_*b-pHV-BAHC$6ORl7F2EUSwnv$l3ZS&`V0<D->;_t!Vw z6h=Ijys%HJxt&qV;|lFFN1;cUU9sRHi+`m&ksbz2C<*>5;9D$_Yb(se<`oonR;Fjx zj)-gq^{UWe6Zt&a@ehb-NQE36=kB3Syt3r zNlS8uGCgL-k|MiX?pamj`Dlq_A4bPbB4>OMyks87Yy&R)Y5+8u8<8F}>3Dt0<*iS7 zVON|Ou{hSH`I%(Usj5#+uze;Ok7M@haWd-jv$dm&!fAuTOo^d?gw>Frovm}T1{t4L zk+Jg?ep}8|Vy$z-O6}r)Y^j6RdQS5zO z{a+r3e&!*$4<#m+Qrliy2M3>Z@hE zB+uhjQ{ULSW$UK?ojdv?R^L~jr*{8S?VGwfgWe8*IK0Wf`#bBt7xq38@^5S=Z+QcoPLA01yMg~)f1Oz{T!LA56aAA{=E6rY2^0} ztE}T!=0fnS*~H&8^*zE0VwMc-Tva_rj>s{@_E}?9OB?L&2W^Uh7n#JJgcD%sq_RK%by?_cMm{^ns;78$5&AL8tZAqHEW z$)3s14X)}QrbnXirxWj!u0FcD<^7(?AA>%{ToHlX^{|Tkdt?!J#i4IGYINK!ukN6h K4%|i3$A1GPN~0$L literal 0 HcmV?d00001 diff --git a/payloads/yolo_t8010.bin b/payloads/yolo_t8010.bin new file mode 100644 index 0000000000000000000000000000000000000000..6fb01078887b8ee0903249190a2e03056326e07f GIT binary patch literal 4836 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 literal 0 HcmV?d00001 diff --git a/payloads/yolo_t8011.bin b/payloads/yolo_t8011.bin new file mode 100644 index 0000000000000000000000000000000000000000..6e557bd0af122d85d016d88d8f9052b9cf671cef GIT binary patch literal 4828 zcma)9eQZe$>FM6{eeOBuo^wrP|NiW(Vmaa=a^ZJgBVxb>sg#RV{M=RSUAi%izT87x(8SNB zXI*-|tw-^HR*%h1q|8Fs*4|BUqM&Q0?# z;n=^4e8Yb}3!P*qKTiB+wC}O`W~4g~#AiC+O%A&84Z8Mcpc}K$vp3P>Lo>wJu>Jo~ zo`LSzufL7|xWC+W)Ac_$&HkB^>)M-d$a~3;)0C?eZ^lq-LtG&l}KB zZzFvVBfWpEJRW?abQ~E-28c}^DimS@cM)IUhgxyX$}JaGPE^b9u&(nJmby z38Kt|+-tU`PFfQ?u;-Ma?DJzeqCVnxBw3J>lit>2k+MkA==59*Kkd1e1O7DZN(vwA zV|1`pBE5%qkL|;LLZ)<1_NM<*DEzzz_Ow@co`{>3_=p8A1hEQVE<>jliX>@XV}^Dq z6*N!F2>dn3UzJ(kR`a6StuLyZlzD}$aq~XtNiC=2BBl}_ zH3e=ha0J}DI8S#C`6U7`^_VM#&FX2qL2iCk$S;E**_M%Bl1lnvKPXe|J;)A_kqK?x z^RpnSeM~!H4s<qrel3L=C_M0B%MXR4Y?Gqwa znvq!-B7Z-r?X7@OPbTWhLeDAc?MB{N^PnZ-AoRYETA{_Z-sPaFd=R?S_AqLfm2op{ z{MvHk`!;w}3+cF4Z;WW=RKb>f8qdFimR&%{1G{NwmQjq+GbYR{)K+c#aVoz1mV-T#QB!dpdxHY+c?kW)jbxrnw z`oU;km3ZFMd}{2hK}k=|mAr>#^Os7myeJbdK6!MM*{kV&sPeC z`J(oRaJMdk=L~qxfai?Elatl-``|&ld-WoD+ar+sH{icPW|-*2W!Z;5qNcrT_}DwZ z=VUG2Iu|_$K0HF=KKs%GivffFeZVXJ;7eYvre6m4mLxAj2P*-sjE}Vyc~RHRC(W?L zZ`9vLkzWmYI&{)x)MM8g>R_|TpO=oe-s#jBavBx!_t5d`Exx4sT(EBXFu$|(}0#}K6{up=b?6=fP@5?LtE@h3Yg*DCj(+b7@s8fX}e$smPcZu^uYZlc# z2|f>c&AXk=pTf>TROLe0->!e`hBjhI*dXpuW>T{BBV|Iu;TMc__Nh;35C*VthFni`vJd97` z-KM}ve>!09!J4b0_-L5M14KzujO3_c?+f+z{Hz7tTb3JJ(aZA_s5^!Uc6Qe#5r-Of27 zA7@mby!kCt3c9Elk)wia90-JQZq$T0*C+B~^od33Mz1(u;DU&kz)yeo$olEwWqS8; z#GswSPW`RzwBeT>Sh>FbeCYbd^D^x-(Mzk8>)!zU;CUH&>aE#*pqI2h(NlSRDdHpd z;mqaYK8W~;dJc;`PY&eSVxAA8FVf>nD#Td@?ZHhOHmz>k{!m-H)q3|M)DYg-uzGz{ zG}su9$5)4UeQ)It;=y&X@ao4NMQ6hh!~Moj;BJJROHik+i(KS zQ^=k9$X@*~*y}C_U%$YC%kA|8+;+hqN0S!o(I46Cj{9x<&pT_ivnn{7`$kDQy}nJS z%~9k(CkN8vytm*vcQelrq;==DDLmp?TaeJj2=LI zx8bc-54(GT>%w~@f&1P?TJeqcioU4AXPmJ1>v~;1-fK3GuYKa_1@J*NxhBm^BSLY(d`yCWX34&XsIHOO_vL?+ys3o% literal 0 HcmV?d00001 diff --git a/payloads/yolo_t8015.bin b/payloads/yolo_t8015.bin new file mode 100644 index 0000000000000000000000000000000000000000..d76d511bbdb8c2f7dea492fcf590f760a71db37a GIT binary patch literal 4784 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 F{{c + + + + CFBundleIdentifier + palera.in.palera1n + CFBundleDevelopmentRegion + English + CFBundlePackageType + APPL + NSPrincipalClass + NSApplication + NSHighResolutionCapable + + + diff --git a/resources/ios-entitlements.xml b/resources/ios-entitlements.xml new file mode 100644 index 0000000..f7077f9 --- /dev/null +++ b/resources/ios-entitlements.xml @@ -0,0 +1,14 @@ + + + + + platform-application + + com.apple.private.security.no-container + + com.apple.security.iokit-user-client-class + + IOUserClient + + + diff --git a/resources/main.exe.manifest b/resources/main.exe.manifest new file mode 100644 index 0000000..3107f64 --- /dev/null +++ b/resources/main.exe.manifest @@ -0,0 +1,9 @@ + + + + + true + PerMonitorV2 + + + \ No newline at end of file diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index 11ba5f8..0000000 --- a/src/Makefile +++ /dev/null @@ -1,197 +0,0 @@ -all: palera1n - -OBJDIR = obj -GENDIR = gen -RESOURCES_DIR = resources - -C_SRC = $(wildcard *.c) -OBJS = $(patsubst %,$(OBJDIR)/%,$(C_SRC:.c=.c.o)) - -ifeq (,$(findstring macosx, $(CFLAGS))) -ifneq (,$(findstring version-min=, $(CFLAGS))) -ifneq ($(NO_EMBED_HELPER),1) -C_SRC += $(GENDIR)/gen-libcheckra1nhelper.dylib.c -endif -endif -endif - -ifeq ($(NO_EMBED_HELPER),1) -CFLAGS += -DNO_EMBED_HELPER -endif - -ifeq ($(DFUHELPER_AUTO_ONLY),1) -CFLAGS += -DDFUHELPER_AUTO_ONLY -endif - -ifeq ($(FORCE_HELPER),1) -ifneq ($(NO_EMBED_HELPER),1) -C_SRC += $(GENDIR)/gen-libcheckra1nhelper.dylib.c -endif -CFLAGS += -DFORCE_HELPER -BUILD_OPTIONS += FORCE_HELPER -endif - -ifneq ($(NO_RAMDISK),1) -C_SRC += $(GENDIR)/gen-ramdisk.dmg.lzma.c -else -CFLAGS += -DNO_RAMDISK -DRAMDISK_COMPRESSED_SIZE=\"0\" -BUILD_OPTIONS += NO_RAMDISK -endif -ifneq ($(NO_KPF),1) -C_SRC += $(GENDIR)/gen-checkra1n-kpf-pongo.lzma.c -else -CFLAGS += -DNO_KPF -BUILD_OPTIONS += NO_KPF -endif -ifneq ($(NO_OVERLAY),1) -C_SRC += $(GENDIR)/gen-binpack.dmg.c -else -CFLAGS += -DNO_OVERLAY -BUILD_OPTIONS += NO_OVERLAY -endif -ifneq ($(NO_CHECKRAIN),1) -C_SRC += $(GENDIR)/gen-checkra1n.c -else -CFLAGS += -DNO_CHECKRAIN -BUILD_OPTIONS += NO_CHECKRAIN -endif - -ifneq ($(NO_CUSTOM_PONGO),1) -C_SRC += $(GENDIR)/gen-Pongo.bin.c -else -CFLAGS += -DNO_CUSTOM_PONGO -BUILD_OPTIONS += NO_CUSTOM_PONGO -endif - -ifeq ($(TUI),1) -BUILD_OPTIONS += TUI -CFLAGS += -DTUI -endif - -CHECKRA1N_VERSION ?= 0.1337.3 -LIPO = lipo -LDID = ldid - -ifeq ($(TARGET_OS),Darwin) -ifneq ($(USE_LIBUSB),1) -else -LIBS += -framework SystemConfiguration -framework Security -BUILD_OPTIONS += USE_LIBUSB -endif -# add lto and debug symbols for lto -CFLAGS += -flto=full -g -LDFLAGS += -Wl,-object_path_lto,obj/lto.o -else -USE_LIBUSB = 1 -endif - -ifeq ($(USE_LIBUSB),1) -CFLAGS += -DUSE_LIBUSB=1 -LIBS += $(DEP)/lib/libusb-1.0.a -endif - -ifneq ($(ROOTFUL),0) -CFLAGS += -DROOTFUL=1 -BUILD_OPTIONS += ROOTFUL -endif - -ifeq ($(BUILD_OPTIONS),) -BUILD_OPTIONS = (none) -endif - -CFLAGS += -DBUILD_OPTIONS=\""$(BUILD_OPTIONS)"\" - -ifeq ($(TARGET_OS),Linux) -ifeq ($(UNAME),Linux) -ifeq ($(CHECKRA1N_NAME),) -ifeq ($(shell arch),x86_64) -CHECKRA1N_NAME := linux-x86_64 -else ifeq ($(shell arch | grep -q 'i[3-7]86' && echo 1),1) -CHECKRA1N_NAME := linux-x86 -else ifeq ($(shell arch | grep -v '\(arm\|aarch\)[a-z]\?\+64' | grep -q arm && echo 1),1) -CHECKRA1N_NAME := linux-armel -else ifeq ($(shell arch | grep -q '\(arm\|aarch\)[a-z]\?\+64' && echo 1),1) -CHECKRA1N_NAME := linux-arm64 -endif -endif -endif -endif - -$(RESOURCES_DIR)/checkra1n-%: - curl -Lfo $@ https://assets.checkra.in/downloads/preview/$(CHECKRA1N_VERSION)/$$(echo $@ | cut -d/ -f2) - chmod 755 $@ - -$(RESOURCES_DIR)/checkra1n: $(RESOURCES_DIR)/checkra1n-macos usb.xml -ifeq ($(TARGET_OS),Darwin) -ifneq (,$(findstring arm64, $(CFLAGS))) - $(LIPO) -thin arm64 -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n-macos -else ifneq (,$(findstring x86_64, $(CFLAGS))) - $(LIPO) -thin x86_64 -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n-macos -else ifeq ($(shell arch),i386) - $(LIPO) -thin x86_64 -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n-macos -else - $(LIPO) -thin $(shell arch) -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n-macos -endif -ifeq (,$(findstring macosx, $(CFLAGS))) -ifneq (,$(findstring version-min=, $(CFLAGS))) - vtool -remove-build-version 1 -replace -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n - vtool -set-build-version $(FAKE_PLATFORM) $(FAKE_MINOS) $(FAKE_SDK) -replace -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n - install_name_tool -change /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit /System/Library/Frameworks/IOKit.framework/IOKit $(RESOURCES_DIR)/checkra1n - install_name_tool -change /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation $(RESOURCES_DIR)/checkra1n - $(LDID) -Susb.xml $(RESOURCES_DIR)/checkra1n -endif -endif -else - cp $(RESOURCES_DIR)/checkra1n-$(CHECKRA1N_NAME) $(RESOURCES_DIR)/checkra1n -endif - -$(GENDIR)/gen-%.c: $(RESOURCES_DIR)/% - echo '#include ' > $(RESOURCES_DIR)/../$@ - cd $(RESOURCES_DIR) && xxd -iC $$(echo $< | cut -d/ -f2) | sed -e 's/unsigned int/uint32_t/' -e 's/unsigned char/uint8_t/' >> ../$@ - - -$(OBJDIR)/pongo_helper.c.o: pongo_helper.c $(wildcard ../include/*.h) $(RESOURCES_DIR)/ramdisk.dmg $(RESOURCES_DIR)/checkra1n-kpf-pongo - $(CC) -c -o $@ $(CFLAGS) -DRAMDISK_UNCOMPRESSED_SIZE="\"$$(wc -c < $(RESOURCES_DIR)/ramdisk.dmg | tr -d ' ')\"" -DKPF_UNCOMPRESSED_SIZE="\"$$(wc -c < $(RESOURCES_DIR)/checkra1n-kpf-pongo | tr -d ' ')\"" $< - -$(OBJDIR)/%.c.o: $(GENDIR)/gen-%.c $(wildcard ../include/*.h) - $(CC) $(CFLAGS) -c -o $< - -$(OBJDIR)/%.c.o: %.c $(wildcard ../include/*.h) - $(CC) $(CFLAGS) -c -o $@ $< - -palera1n: $(OBJS) - $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o palera1n -ifeq (,$(findstring macosx, $(CFLAGS))) -ifneq (,$(findstring version-min=, $(CFLAGS))) - $(LDID) -Susb.xml palera1n -endif -endif - -$(RESOURCES_DIR)/libcheckra1nhelper.dylib: chkstk.S - $(CC) $(CFLAGS) $(LDFLAGS) -shared chkstk.S -o $@ - -$(RESOURCES_DIR)/checkra1n-kpf-pongo: - curl -Lfo $@ https://cdn.nickchan.lol/palera1n/artifacts/kpf/iOS15/checkra1n-kpf-pongo - -$(RESOURCES_DIR)/ramdisk.dmg.lzma: $(RESOURCES_DIR)/ramdisk.dmg - xz --format=lzma -vfc6ekT 0 $< > $@ - -$(RESOURCES_DIR)/checkra1n-kpf-pongo.lzma: $(RESOURCES_DIR)/checkra1n-kpf-pongo - xz --format=lzma -vfc6ekT 0 $< > $@ - -$(RESOURCES_DIR)/ramdisk.dmg: - curl -Lfo $@ https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg - -$(RESOURCES_DIR)/binpack.dmg: - curl -Lfo $@ https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg - -$(RESOURCES_DIR)/Pongo.bin: - curl -Lfo $@ https://cdn.nickchan.lol/palera1n/artifacts/kpf/iOS15/Pongo.bin - -clean: - rm -rf $(OBJDIR)/*.o $(GENDIR)/*.c $(GENDIR)/*.o palera1n palera1n.dSYM libcheckra1nhelper.dylib - -distclean: clean - rm -rf $(RESOURCES_DIR)/* - -.PHONY: all clean diff --git a/src/boyermoore_memmem.c b/src/boyermoore_memmem.c deleted file mode 100644 index 6a37f26..0000000 --- a/src/boyermoore_memmem.c +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include - -const unsigned char * -boyermoore_horspool_memmem(const unsigned char* haystack, size_t hlen, - const unsigned char* needle, size_t nlen) -{ - size_t scan = 0; - size_t bad_char_skip[UCHAR_MAX + 1]; /* Officially called: - * bad character shift */ - - /* Sanity checks on the parameters */ - if (nlen <= 0 || !haystack || !needle) - return NULL; - - /* ---- Preprocess ---- */ - /* Initialize the table to default value */ - /* When a character is encountered that does not occur - * in the needle, we can safely skip ahead for the whole - * length of the needle. - */ - for (scan = 0; scan <= UCHAR_MAX; scan = scan + 1) - bad_char_skip[scan] = nlen; - - /* C arrays have the first byte at [0], therefore: - * [nlen - 1] is the last byte of the array. */ - size_t last = nlen - 1; - - /* Then populate it with the analysis of the needle */ - for (scan = 0; scan < last; scan = scan + 1) - bad_char_skip[needle[scan]] = last - scan; - - /* ---- Do the matching ---- */ - - /* Search the haystack, while the needle can still be within it. */ - while (hlen >= nlen) - { - /* scan from the end of the needle */ - for (scan = last; haystack[scan] == needle[scan]; scan = scan - 1) - if (scan == 0) /* If the first byte matches, we've found it. */ - { - return haystack; - } - - /* otherwise, we need to skip some bytes and start again. - Note that here we are getting the skip value based on the last byte - of needle, no matter where we didn't match. So if needle is: "abcd" - then we are skipping based on 'd' and that value will be 4, and - for "abcdd" we again skip on 'd' but the value will be only 1. - The alternative of pretending that the mismatched character was - the last character is slower in the normal case (E.g. finding - "abcd" in "...azcd..." gives 4 by using 'd' but only - 4-2==2 using 'z'. */ - hlen -= bad_char_skip[haystack[last]]; - haystack += bad_char_skip[haystack[last]]; - } - - return NULL; -} diff --git a/src/chkstk.S b/src/chkstk.S deleted file mode 100644 index 3b6ba6b..0000000 --- a/src/chkstk.S +++ /dev/null @@ -1,65 +0,0 @@ -#define _PTHREAD_STRUCT_DIRECT_STACKADDR_OFFSET -48 -#define _PTHREAD_STRUCT_DIRECT_STACKBOTTOM_OFFSET -40 - -.align 4 -_thread_chkstk_darwin: - .globl ___chkstk_darwin -___chkstk_darwin: // %w9/x9 == alloca size - stp x10, x11, [sp, #-16] - - // validate that the frame pointer is on our stack (no alt stack) - mrs x10, TPIDRRO_EL0 - - // (%sp - pthread_self()->stackaddr) > 0 ? -#if defined(__ARM64_ARCH_8_32__) - ubfx x9, x9, #0, #32 - ldur w11, [x10, _PTHREAD_STRUCT_DIRECT_STACKADDR_OFFSET] -#else - ldur x11, [x10, _PTHREAD_STRUCT_DIRECT_STACKADDR_OFFSET] -#endif - subs x11, sp, x11 - b.hs Lprobe - - // %sp <= pthread_self()->stackbottom ? -#if defined(__ARM64_ARCH_8_32__) - ldur w11, [x10, _PTHREAD_STRUCT_DIRECT_STACKBOTTOM_OFFSET] -#else - ldur x11, [x10, _PTHREAD_STRUCT_DIRECT_STACKBOTTOM_OFFSET] -#endif - mov x10, sp - cmp x10, x11 - b.ls Lprobe - - // %sp - (uintptr_t)%x9 < pthread_self()->stackbottom ? - subs x10, x10, x9 - b.lo Lcrash - cmp x10, x11 - b.lo Lcrash - -Lexit: - ldp x10, x11, [sp, #-16] - ret - -Lcrash: - // POSIX mandates that stack overflow crashes with SIGSEGV - // so load an address in the guard page and dereference it - // - // x11 contains pthread_self()->stackbottom already - ldr x11, [x11, #-8] - // if main_thread caused stack growth with setrlimit() - // fall into Lprobe and eventually cause SIGSEGV. - -Lprobe: - mov x10, sp - cmp x9, #0x1000 - b.lo Lend -Lloop: - sub x10, x10, #0x1000 - ldr x11, [x10] - sub x9, x9, #0x1000 - cmp x9, #0x1000 - b.hi Lloop -Lend: - sub x10, x10, x9 - ldr x11, [x10] - b Lexit diff --git a/src/credits.c b/src/credits.c deleted file mode 100644 index 1641279..0000000 --- a/src/credits.c +++ /dev/null @@ -1,25 +0,0 @@ -#include - -#ifndef BAKERAIN_DEVELOPE_R -#define BAKERAIN_DEVELOPE_R "kok3shidoll" -#endif -#define THE_PLUSH "Ploosh" - -#define NEKO_DEVELOPE_R "HAHALOSAH" - -#define T void -#define R print_credits(void) { -#define O fprintf( -#define U stderr, -#define B "#\n# palera1n: " BUILD_TAG " \n#\n" -#define L "# ======== Made by =======\n" -#define E "# Made by: Nick Chan, " THE_PLUSH ", Khcrysalis, Mineek, staturnz, " BAKERAIN_DEVELOPE_R ", " NEKO_DEVELOPE_R " \n" -#define M "# ======== Thanks to =======\n" -#define A "# Thanks to: llsc12, Nebula, Lrdsnow, nikias (libimobiledevice),\n" -#define K "# checkra1n team (Siguza, axi0mx, littlelailo et al.),\n" -#define I "# Procursus Team (Hayden Seay, Cameron Katri, Keto et.al)\n" -#define N "# ==========================\n\n" -#define G ); -#define S } - -T R O U B L E M A K I N G S diff --git a/src/devhelper.c b/src/devhelper.c deleted file mode 100644 index 87e5ab2..0000000 --- a/src/devhelper.c +++ /dev/null @@ -1,405 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef WIN32 -#include -#include -#else -#include -#include -#include -#include -#include -#endif -#include -#include - -#include -#include - -#include -#include -#include -#include - -#ifdef HAVE_LIB_TV_CONTROL -#include -#endif - -#include - -irecv_device_event_context_t irecvctx = NULL; -usbmuxd_subscription_context_t usbmuxdctx = NULL; - -void devinfo_free(devinfo_t *dev) { - free(dev->buildVersion); - free(dev->productType); - free(dev->productVersion); - free(dev->CPUArchitecture); - return; -} - -bool cpid_is_arm64(unsigned int cpid) { - /* - * ========== 0x6000 =========== - * M1 Pro, M1 Max, etc. - * ========== 0x7000 =========== - * (ARM64) A8(X) - * ========== 0x7002 =========== - * S1 - * ========== 0x8000 =========== - * (ARM64) A9 (Samsung), A9X - * ========== 0x8002 =========== - * S1P, S2, T1 - * ========== 0x8003 =========== - * (ARM64) A9 (TSMC) - * ========== 0x8004 =========== - * S3 - S5 - * ========== 0x8010 =========== - * (ARM64) A10(X) - A11, T2 - * ========== 0x8020 =========== - * A12, M1, M2, etc - * ========== 0x8700 =========== - * iPod SoCs - * ========== 0x8747 =========== - * Haywire - * ========== 0x8900 =========== - * S5L8900 - A6(X) - * ========== 0x8960 =========== - * (ARM64) A7 - */ - return ( - cpid == 0x8960 || cpid == 0x7000 || cpid == 0x7001 || - cpid == 0x8000 || cpid == 0x8001 || cpid == 0x8003 || - cpid == 0x8010 || cpid == 0x8011 || cpid == 0x8012 || - cpid == 0x8015 - ); -} - -int subscribe_cmd(usbmuxd_event_cb_t device_event_cb, irecv_device_event_cb_t irecv_event_cb) -{ - int ret; - if ((ret = usbmuxd_events_subscribe(&usbmuxdctx, device_event_cb, NULL))) return ret; - if ((ret = irecv_device_event_subscribe(&irecvctx, irecv_event_cb, NULL))) return ret; - return 0; -} - -int unsubscribe_cmd(void) -{ - int ret; - if ((ret = usbmuxd_events_unsubscribe(usbmuxdctx))) return ret; - if ((ret = irecv_device_event_unsubscribe(irecvctx))) return ret; - irecvctx = NULL; - usbmuxdctx = NULL; - return 0; -} - -int devinfo_cmd(devinfo_t *dev, const char *udid) -{ - int ret; - uint64_t this_ecid = 0; - char *productType = NULL; - char *productVersion = NULL; - char *buildVersion = NULL; - const char *displayName = NULL; - char *CPUArchitecture = NULL; - idevice_t device = NULL; - lockdownd_client_t lockdown = NULL; - if ((ret = idevice_new_with_options(&device, udid, IDEVICE_LOOKUP_USBMUX)) != IDEVICE_E_SUCCESS) - { - LOG(LOG_ERROR, "Error connecting to device: %d (%s)", ret, lockdownd_strerror(ret)); - return -1; - } - if ((ret = lockdownd_client_new_with_handshake(device, &lockdown, "palera1n")) != LOCKDOWN_E_SUCCESS) - { - (void)idevice_free(device); - LOG(LOG_ERROR, "Device is not in normal mode: %d (%s)", ret, lockdownd_strerror(ret)); - return -1; - } - plist_t node = NULL; - if ((ret = lockdownd_get_value(lockdown, NULL, "UniqueChipID", &node)) != LOCKDOWN_E_SUCCESS) - { - (void)lockdownd_client_free(lockdown); - (void)idevice_free(device); - LOG(LOG_ERROR, "Error getting ECID: %d (%s)", ret, lockdownd_strerror(ret)); - return -1; - } - plist_get_uint_val(node, &this_ecid); - plist_free(node); - - node = NULL; - if ((ret = lockdownd_get_value(lockdown, NULL, "ProductType", &node)) != LOCKDOWN_E_SUCCESS) - { - (void)lockdownd_client_free(lockdown); - (void)idevice_free(device); - LOG(LOG_ERROR, "Error getting product type: %d (%s)", ret, lockdownd_strerror(ret)); - return -1; - } - plist_get_string_val(node, &productType); - plist_free(node); - - node = NULL; - if ((ret = lockdownd_get_value(lockdown, NULL, "CPUArchitecture", &node)) != LOCKDOWN_E_SUCCESS) - { - (void)lockdownd_client_free(lockdown); - (void)idevice_free(device); - LOG(LOG_ERROR, "Error getting CPU type: %d (%s)", ret, lockdownd_strerror(ret)); - return -1; - } - plist_get_string_val(node, &CPUArchitecture); - plist_free(node); - - node = NULL; - if ((ret = lockdownd_get_value(lockdown, NULL, "ProductVersion", &node)) != LOCKDOWN_E_SUCCESS) - { - (void)lockdownd_client_free(lockdown); - (void)idevice_free(device); - LOG(LOG_ERROR, "Error getting product version: %d (%s)", ret, lockdownd_strerror(ret)); - return -1; - } - plist_get_string_val(node, &productVersion); - plist_free(node); - - node = NULL; - if ((ret = lockdownd_get_value(lockdown, NULL, "BuildVersion", &node)) != LOCKDOWN_E_SUCCESS) - { - (void)lockdownd_client_free(lockdown); - (void)idevice_free(device); - LOG(LOG_ERROR, "Error getting build version: %d (%s)", ret, lockdownd_strerror(ret)); - return -1; - } - plist_get_string_val(node, &buildVersion); - plist_free(node); - (void)lockdownd_client_free(lockdown); - (void)idevice_free(device); - - irecv_device_t rcvydev; - if (irecv_devices_get_device_by_product_type(productType, &rcvydev) == IRECV_E_SUCCESS) - { - displayName = rcvydev->display_name; - } else - { - displayName = productType; - } - dev->buildVersion = buildVersion; - dev->ecid = this_ecid; - dev->CPUArchitecture = CPUArchitecture; - dev->displayName = displayName; - dev->productType = productType; - dev->productVersion = productVersion; - return 0; -} - -int enter_recovery_cmd(const char* udid) { - idevice_t device = NULL; - lockdownd_client_t lockdown = NULL; - if (idevice_new(&device, udid) != IDEVICE_E_SUCCESS) { - LOG(LOG_ERROR, "Could not connect to device"); - return -1; - } - lockdownd_error_t ldret = lockdownd_client_new(device, &lockdown, "palera1n"); - if (ldret != LOCKDOWN_E_SUCCESS) { - LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret)); - return -1; - } - ldret = lockdownd_enter_recovery(lockdown); - if (ldret == LOCKDOWN_E_SESSION_INACTIVE) { - lockdownd_client_free(lockdown); - lockdown = NULL; - ldret = lockdownd_client_new_with_handshake(device, &lockdown, "palera1n"); - if (ldret != LOCKDOWN_E_SUCCESS) { - LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret)); - return -1; - } - ldret = lockdownd_enter_recovery(lockdown); - } - if (ldret != LOCKDOWN_E_SUCCESS) { - LOG(LOG_ERROR, "Could not trigger entering recovery mode: %s", lockdownd_strerror(ldret)); - return -1; - } - lockdownd_client_free(lockdown); - idevice_free(device); - return 0; -} - -int reboot_cmd(const char* udid) { - idevice_t device = NULL; - lockdownd_client_t lockdown = NULL; - if (idevice_new(&device, udid) != IDEVICE_E_SUCCESS) { - LOG(LOG_ERROR, "Could not connect to device"); - return -1; - } else { - diagnostics_relay_client_t diag = NULL; - if (diagnostics_relay_client_start_service(device, &diag, "palera1n") == DIAGNOSTICS_RELAY_E_SUCCESS) { - if (diagnostics_relay_restart(diag, DIAGNOSTICS_RELAY_ACTION_FLAG_WAIT_FOR_DISCONNECT) != DIAGNOSTICS_RELAY_E_SUCCESS) { - LOG(LOG_ERROR, "Could not reboot device."); - } - (void)diagnostics_relay_goodbye(diag); - (void)diagnostics_relay_client_free(diag); - } else { - LOG(LOG_ERROR, "Could not connect to device."); - return -1; - } - idevice_free(device); - } - return 0; -} - -int passstat_cmd(unsigned char* status, const char* udid) { - lockdownd_error_t lerr = LOCKDOWN_E_SUCCESS; - diagnostics_relay_error_t derr = DIAGNOSTICS_RELAY_E_SUCCESS; - - idevice_t dev = NULL; - lockdownd_client_t lockdown = NULL; - lockdownd_service_descriptor_t service = NULL; - diagnostics_relay_client_t diagnostics_client = NULL; - plist_t node = NULL; - plist_t keys = NULL; - plist_t status_node = NULL; - plist_t value_node = NULL; - - if (idevice_new(&dev, udid) != IDEVICE_E_SUCCESS) - { - LOG(LOG_ERROR, "Error detecting device type"); - return -1; - } - lerr = lockdownd_client_new_with_handshake(dev, &lockdown, "idevicediagnostics"); - if ((lerr != LOCKDOWN_E_SUCCESS) || !lockdown) - { - idevice_free(dev); - LOG(LOG_ERROR, "Error connecting to lockdownd (lockdownd error %d: (%s))", lerr, lockdownd_strerror(lerr)); - return -1; - } - lerr = lockdownd_start_service(lockdown, "com.apple.mobile.diagnostics_relay", &service); - if ((lerr != LOCKDOWN_E_SUCCESS) || !service) - lerr = lockdownd_start_service(lockdown, "com.apple.iosdiagnostics.relay", &service); - - lockdownd_client_free(lockdown); - if ((lerr != LOCKDOWN_E_SUCCESS) || !service) - { - idevice_free(dev); - LOG(LOG_ERROR, "Error starting diagnostics service (lockdownd error %d: (%s))\nUnlock the device and try again.", lerr, lockdownd_strerror(lerr)); - return -1; - } - derr = diagnostics_relay_client_new(dev, service, &diagnostics_client); - if ((derr != DIAGNOSTICS_RELAY_E_SUCCESS) || !diagnostics_client) - { - lockdownd_service_descriptor_free(service); - idevice_free(dev); - LOG(LOG_ERROR, "Error starting diagnostics client (diagnostics error %d)", derr); - return -1; - } - keys = plist_new_array(); - plist_array_append_item(keys, plist_new_string("xsaMbRQ5rQ+eyKMKG+ZSSg")); - derr = diagnostics_relay_query_mobilegestalt(diagnostics_client, keys, &node); - - plist_free(keys); - (void)diagnostics_relay_client_free(diagnostics_client); - (void)lockdownd_service_descriptor_free(service); - (void)idevice_free(dev); - - if (derr != DIAGNOSTICS_RELAY_E_SUCCESS || !node) - { - LOG(LOG_ERROR, "Error getting passcode state (lockdownd error %d: (%s))", lerr, lockdownd_strerror(lerr)); - return -1; - } - status_node = plist_access_path(node, 2, "MobileGestalt", "Status"); - if (!status_node) - { - plist_free(node); - LOG(LOG_ERROR, "Error getting passcode state (invalid status node)"); - return -1; - } - char* passstat_status; - plist_get_string_val(status_node, &passstat_status); - if (!status || strncmp(passstat_status, "Succ", 4)) - { - if (passstat_status) - free(passstat_status); - passstat_status = NULL; - plist_free(node); - LOG(LOG_ERROR, "Error getting passcode state (invalid status)"); - return -1; - } - - free(passstat_status); - value_node = plist_access_path(node, 2, "MobileGestalt", "xsaMbRQ5rQ+eyKMKG+ZSSg"); - if (!value_node) - { - plist_free(node); - LOG(LOG_ERROR, "Error getting passcode state (invalid value node)"); - return -1; - } - uint8_t passcode_state = 2; - plist_get_bool_val(value_node, &passcode_state); - plist_free(node); - *status = passcode_state; - LOG(LOG_VERBOSE4, "Passcode state: %hhu", *status); - return 0; -} - -int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid) { - irecv_client_t client = NULL; - irecv_error_t err = irecv_open_with_ecid(&client, ecid); - if (err != IRECV_E_SUCCESS) goto err; - int mode = 0; - err = irecv_get_mode(client, &mode); - if (err != IRECV_E_SUCCESS) goto err; - char *ibootver = NULL; - err = irecv_getenv(client, "build-version", &ibootver); - if (err != IRECV_E_SUCCESS) goto err; - irecv_device_t device; - err = irecv_devices_get_device_by_client(client, &device); - if (err != IRECV_E_SUCCESS) goto err; - info->mode = mode; - info->cpid = device->chip_id; - snprintf(info->product_type, 0x20, "%s", device->product_type); - snprintf(info->display_name, 0x20, "%s", device->display_name); - snprintf(info->iboot_ver, 0x20, "%s", (ibootver) ? ibootver : ""); - free(ibootver); - irecv_close(client); - return 0; -err: - LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err)); - return -1; -} - -int autoboot_cmd(const uint64_t ecid) { - irecv_client_t client = NULL; - irecv_error_t err = irecv_open_with_ecid(&client, ecid); - if (err != IRECV_E_SUCCESS) goto err; - err = irecv_setenv(client, "auto-boot", "true"); - if (err != IRECV_E_SUCCESS) goto err; - err = irecv_saveenv(client); - if (err != IRECV_E_SUCCESS) goto err; - err = irecv_close(client); - if (err != IRECV_E_SUCCESS) goto err; - return 0; -err: - LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err)); - return -1; -} - -int exitrecv_cmd(const uint64_t ecid) { - irecv_client_t client = NULL; - irecv_error_t err = irecv_open_with_ecid(&client, ecid); - if (err != IRECV_E_SUCCESS) goto err; - err = irecv_setenv(client, "auto-boot", "true"); - if (err != IRECV_E_SUCCESS) goto err; - err = irecv_saveenv(client); - if (err != IRECV_E_SUCCESS) goto err; - err = irecv_reboot(client); - if (err != IRECV_E_SUCCESS) goto err; - err = irecv_close(client); - if (err != IRECV_E_SUCCESS) goto err; - return 0; -err: - LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err)); - return -1; -} diff --git a/src/dfuhelper.c b/src/dfuhelper.c deleted file mode 100644 index e639012..0000000 --- a/src/dfuhelper.c +++ /dev/null @@ -1,364 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -#define FORMAT_KEY_VALUE 1 -#define FORMAT_XML 2 - -#define NO_PHYSICAL_HOME_BUTTON (cpid == 0x8015 || (cpid == 0x8010 && (bdid == 0x08 || bdid == 0x0a || bdid == 0x0c || bdid == 0x0e))) -#define IS_APPLE_TV_HD (cpid == 0x7000 && bdid == 0x34) -#define IS_APPLE_TV_4K (cpid == 0x8011 && bdid == 0x02) -#define IS_APPLE_HOME1 (cpid == 0x7000 && bdid == 0x38) -#define IS_APPLE_HOME2 (cpid == 0x7000 && bdid == 0x1a) -#define IS_APPLE_HOME (IS_APPLE_HOME1 || IS_APPLE_HOME1) -#define IS_APPLETV (IS_APPLE_TV_4K || IS_APPLE_TV_HD || IS_APPLE_HOME) - -int dfuhelper_thr_running = false; - -static void step(int time, int time2, char *text, bool (*cond)(uint64_t), uint64_t cond_arg) { - for (int i = time2; i < time; i++) { - printf( - (palerain_flags & palerain_option_no_colors) - ? "\r\033[K%s (%d)" - : BCYN "\r\033[K%s (%d)" CRESET, text, time - i + time2 - ); - fflush(stdout); - sleep(1); - if (cond != NULL && cond(cond_arg)) pthread_exit(NULL); - } - printf( - (palerain_flags & palerain_option_no_colors) - ? "\r%s (%d)" - : CYN "\r%s (%d)" CRESET, text, time2 - ); - if (time2 == 0) puts(""); -} - -static int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) { - devinfo_t dev; - int ret; - ret = devinfo_cmd(&dev, usbmuxd_device->udid); - if (ret != 0) { - LOG(LOG_ERROR, "Unable to get device information"); - return 0; - } - if (strcmp(dev.CPUArchitecture, "arm64")) { - devinfo_free(&dev); - LOG(LOG_WARNING, "Ignoring non-arm64 device..."); - LOG(LOG_WARNING, "palera1n doesn't and never will work on A12+ (arm64e)"); - return -1; - } - - if ((palerain_flags & palerain_option_device_info)) { - printf("Mode: normal\n"); - printf("ProductType: %s\n", dev.productType); - printf("Architecture: %s\n", dev.CPUArchitecture); - printf("Version: %s\n", dev.productVersion); - printf("DisplayName: %s\n", dev.displayName); - - device_has_booted = true; - set_spin(0); - unsubscribe_cmd(); - return 0; - } - - /* For Booting Linux etc */ - if (!getenv("PALERA1N_BYPASS_PASSCODE_CHECK") && - !strncmp(dev.productType, "iPhone10,", strlen("iPhone10,") - )) { - if (!(palerain_flags & palerain_option_device_info)) - LOG(LOG_VERBOSE2, "Product %s requires passcode to be disabled", dev.productType); - unsigned char passcode_state = 0; - ret = passstat_cmd(&passcode_state, usbmuxd_device->udid); - if (ret != 0) { - LOG(LOG_ERROR, "Failed to get passcode state"); - devinfo_free(&dev); - return -1; - } - if (passcode_state) { - LOG(LOG_ERROR, "Passcode must be disabled on this device"); - if (!(palerain_flags & palerain_option_device_info)) - LOG(LOG_ERROR, "Additionally, passcode must never be set since a restore on iOS 16+"); - devinfo_free(&dev); - return -1; - } - } - - if (getenv("PALERA1N_BYPASS_PASSCODE_CHECK")) - LOG(LOG_WARNING, "Bypassed passcode check"); - - if (verbose > 1) { - /* (LOG_VERBOSE - 3) or below*/ - LOG(LOG_INFO, "Telling device with udid %s to enter recovery mode immediately", usbmuxd_device->udid); - } else { - /* At least (LOG_VERBOSE2 - 3) */ - LOG(LOG_INFO, "Entering recovery mode"); - } - enter_recovery_cmd(usbmuxd_device->udid); - devinfo_free(&dev); - if ((palerain_flags & palerain_option_enter_recovery)) { - device_has_booted = true; - set_spin(0); - unsubscribe_cmd(); - } - return 0; -} - -static bool conditional(uint64_t ecid) { - return get_ecid_wait_for_dfu() != ecid; -} - -static void* connected_recovery_mode(struct irecv_device_info* info) { - int ret; - uint64_t ecid; - uint32_t cpid, bdid; - cpid = info->cpid; - ecid = info->ecid; - bdid = info->bdid; - info = NULL; - if (!cpid_is_arm64(cpid)) { - LOG(LOG_WARNING, "Ignoring non-arm64 device..."); - return NULL; - } - sleep(1); - ret = autoboot_cmd(ecid); - if (ret) { - LOG(LOG_ERROR, "Cannot set auto-boot back to true"); - return NULL; - } -#if !defined(DFUHELPER_AUTO_ONLY) - if (IS_APPLE_TV_4K) { - LOG(LOG_INFO, "Depending on your connection method, you might need to press a button on your cable/board during reboot"); - } - LOG(LOG_INFO, "Press Enter when ready for DFU mode"); - getchar(); -#endif - if (IS_APPLETV) { - if (IS_APPLE_TV_HD) { - step(10, 8, "Hold menu + play button", NULL, 0); - set_ecid_wait_for_dfu(ecid); - ret = exitrecv_cmd(ecid); - if (ret) { - LOG(LOG_ERROR, "Cannot exit recovery mode"); - set_ecid_wait_for_dfu(0); - return NULL; - } - printf("\r\033[K"); - step(8, 0, "Hold menu + play button", conditional, ecid); - } else if (IS_APPLE_TV_4K) { - step(2, 0, "About to reboot device", NULL, 0); - set_ecid_wait_for_dfu(ecid); - ret = exitrecv_cmd(ecid); - if (ret) { - LOG(LOG_ERROR, "Cannot exit recovery mode"); - set_ecid_wait_for_dfu(0); - return NULL; - } - step(4, 0, "Waiting for device to reconnect in DFU mode", conditional, ecid); - } else if (IS_APPLE_HOME) { - step(6, 4, "Put device in upside down orientation", NULL, 0); - set_ecid_wait_for_dfu(ecid); - ret = exitrecv_cmd(ecid); - if (ret) { - LOG(LOG_ERROR, "Cannot exit recovery mode"); - set_ecid_wait_for_dfu(0); - return NULL; - } - step(4, 0, "Put device upside down orientation", conditional, ecid); - } - } else if (cpid != 0x8012) { - if (NO_PHYSICAL_HOME_BUTTON) - step(4, 2, "Hold volume down + side button", NULL, 0); - else - step(4, 2, "Hold home + power button", NULL, 0); - set_ecid_wait_for_dfu(ecid); - ret = exitrecv_cmd(ecid); - if (ret) { - LOG(LOG_ERROR, "Cannot exit recovery mode"); - set_ecid_wait_for_dfu(0); - return NULL; - } - printf("\r\033[K"); - if (NO_PHYSICAL_HOME_BUTTON) { - step(2, 0, "Hold volume down + side button", NULL, 0); - step(10, 0, "Hold volume down button", conditional, ecid); - } else { - step(2, 0, "Hold home + power button", NULL, 0); - step(10, 0, "Hold home button", conditional, ecid); - } - } - if (get_ecid_wait_for_dfu() == ecid) { - LOG(LOG_WARNING, "Whoops, device did not enter DFU mode"); - LOG(LOG_INFO, "Waiting for device to reconnect..."); - set_ecid_wait_for_dfu(0); - return NULL; - } - set_ecid_wait_for_dfu(0); - pthread_exit(NULL); - return NULL; -} - -static void* connected_dfu_mode(struct irecv_device_info* info) { - if (get_ecid_wait_for_dfu() == info->ecid) { - set_ecid_wait_for_dfu(0); - puts(""); - LOG(LOG_INFO, "Device entered DFU mode successfully"); - } - unsigned int bdid = info->bdid; - unsigned int cpid = info->cpid; - if (IS_APPLE_HOME) { - step(2, 0, "Put device in upright orientation", NULL, 0); - } - set_spin(0); - unsubscribe_cmd(); - pthread_exit(NULL); - return NULL; -} - -static void device_event_cb(const usbmuxd_event_t *event, void* userdata) { - if (event->device.conn_type != CONNECTION_TYPE_USB) return; - switch (event->event) { - case UE_DEVICE_ADD: - LOG(LOG_VERBOSE, "Normal mode device connected"); - if ((palerain_flags & palerain_option_exit_recovery)) { - break; - } else if ((palerain_flags & palerain_option_reboot_device)) { - int ret = reboot_cmd(event->device.udid); - if (!ret) { - LOG(LOG_INFO, "Restarted device"); - set_spin(0); - unsubscribe_cmd(); - } - pthread_exit(NULL); - break; - } - connected_normal_mode(&event->device); - break; - case UE_DEVICE_REMOVE: - LOG(LOG_VERBOSE, "Normal mode device disconnected"); - break; - } -} - -static void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) { - pthread_t recovery_thread, dfu_thread; - int ret; - - switch(event->type) { - case IRECV_DEVICE_ADD: - if (event->mode == IRECV_K_RECOVERY_MODE_1 || - event->mode == IRECV_K_RECOVERY_MODE_2 || - event->mode == IRECV_K_RECOVERY_MODE_3 || - event->mode == IRECV_K_RECOVERY_MODE_4) { - if (!(palerain_flags & palerain_option_device_info)) - LOG(LOG_VERBOSE, "Recovery mode device %" PRIu64 " connected", event->device_info->ecid); - if ((palerain_flags & palerain_option_exit_recovery)) { - ret = exitrecv_cmd(event->device_info->ecid); - if (!ret) { - LOG(LOG_INFO, "Exited recovery mode"); - device_has_booted = true; - set_spin(0); - unsubscribe_cmd(); - } else { - LOG(LOG_WARNING, "Could not exit recovery mode"); - } - if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread); - pthread_exit(NULL); - break; - } - - if ((palerain_flags & palerain_option_device_info)) { - recvinfo_t info; - ret = recvinfo_cmd(&info, event->device_info->ecid); - if (ret) { - LOG(LOG_WARNING, "Could not get info from device"); - } else { - printf("Mode: Recovery\n"); - printf("ProductType: %s\n", info.product_type); - printf("DisplayName: %s\n", info.display_name); - - device_has_booted = true; - set_spin(0); - unsubscribe_cmd(); - } - if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread); - pthread_exit(NULL); - break; - } - - if ((palerain_flags & palerain_option_enter_recovery) || - (palerain_flags & palerain_option_reboot_device)) return; - pthread_create(&recovery_thread, NULL, (pthread_start_t)connected_recovery_mode, event->device_info); - } else if (event->mode == IRECV_K_DFU_MODE) { - if (!(palerain_flags & palerain_option_device_info)) - LOG(LOG_VERBOSE, "DFU mode device %" PRIu64 " connected", event->device_info->ecid); - - if ((palerain_flags & palerain_option_device_info)) { - recvinfo_t info; - ret = recvinfo_cmd(&info, event->device_info->ecid); - if (ret) { - LOG(LOG_WARNING, "Could not get info from device"); - } else { - printf("Mode: DFU\n"); - printf("ProductType: %s\n", info.product_type); - printf("DisplayName: %s\n", info.display_name); - - device_has_booted = true; - set_spin(0); - unsubscribe_cmd(); - } - if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread); - pthread_exit(NULL); - break; - } - - if ( - (palerain_flags & palerain_option_exit_recovery) || - (palerain_flags & palerain_option_enter_recovery) || - (palerain_flags & palerain_option_reboot_device)) { - break; - } - pthread_create(&dfu_thread, NULL, (pthread_start_t)connected_dfu_mode, event->device_info); - } - break; - case IRECV_DEVICE_REMOVE: - LOG(LOG_VERBOSE, "Recovery mode device disconnected"); - break; - } -} - -void *dfuhelper(void* ptr) { - dfuhelper_thr_running = true; - set_spin(1); - subscribe_cmd(device_event_cb, irecv_device_event_cb); - while (get_spin()) { - sleep(1); - }; - dfuhelper_thr_running = false; - return 0; -} diff --git a/src/exec_checkra1n.c b/src/exec_checkra1n.c deleted file mode 100644 index 113ce61..0000000 --- a/src/exec_checkra1n.c +++ /dev/null @@ -1,206 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#if defined(__APPLE__) -#include -#endif - -extern char **environ; -extern char* gOverrideLibcheckra1nHelper; - -#include -#ifdef TUI -#include -#endif -#include -char* pongo_path = NULL; -bool external_pongo = false; -char* ext_checkra1n = NULL; - -#define tmpdir getenv("TMPDIR") == NULL ? "/tmp" : getenv("TMPDIR") - -int exec_checkra1n(void) { - LOG(LOG_INFO, "About to execute checkra1n"); - int fd_checkra1n, fd_pongo, ret; - char* checkra1n_path = NULL; -#ifndef NO_CUSTOM_PONGO - if (pongo_path == NULL) { - pongo_path = malloc(strlen(tmpdir) + 20); - if (pongo_path == NULL) { - LOG(LOG_FATAL, "memory allocation failed\n"); - return -1; - } - snprintf(pongo_path, strlen(tmpdir) + 20, "%s/Pongo.bin.XXXXXX", tmpdir); - fd_pongo = mkstemp(pongo_path); - if (fd_pongo == -1) { - LOG(LOG_FATAL, "Cannot open temporary file %s: %d (%s)", pongo_path, errno, strerror(errno)); - free(pongo_path); - return -1; - } - ssize_t didWrite_Pongo_bin = write(fd_pongo, Pongo_bin, Pongo_bin_len); - if (didWrite_Pongo_bin != (ssize_t)Pongo_bin_len) { - LOG(LOG_FATAL, "Size written to %s does not match expected: %zd != %" PRIu32 ": %d (%s)", pongo_path, didWrite_Pongo_bin, Pongo_bin_len, errno, strerror(errno)); - close(fd_pongo); - unlink(pongo_path); - free(pongo_path); - pongo_path = NULL; - return -1; - } - } else external_pongo = true; -#endif - if (ext_checkra1n != NULL) { - checkra1n_path = ext_checkra1n; - } else { - checkra1n_path = malloc(strlen(tmpdir) + 20); - if (checkra1n_path == NULL) { - LOG(LOG_FATAL, "memory allocation failed\n"); - return -1; - } - snprintf(checkra1n_path, strlen(tmpdir) + 20, "%s/checkra1n.XXXXXX", tmpdir); - fd_checkra1n = mkstemp(checkra1n_path); - if (fd_checkra1n == -1) { - LOG(LOG_FATAL, "Cannot open temporary file %s: %d (%s)", checkra1n_path, errno, strerror(errno)); - free(checkra1n_path); - checkra1n_path = NULL; - return -1; - } - ssize_t didWrite_checkra1n = write(fd_checkra1n, checkra1n, checkra1n_len); - if (didWrite_checkra1n != (ssize_t)checkra1n_len) { - LOG(LOG_FATAL, "Size written to %s does not match expected: %zd != %" PRIu32 ": %d (%s)", checkra1n_path, didWrite_checkra1n, checkra1n_len, errno, strerror(errno)); - close(fd_checkra1n); - unlink(checkra1n_path); - free(checkra1n_path); - checkra1n_path = NULL; - return -1; - } - close(fd_checkra1n); - ret = chmod(checkra1n_path, 0700); - if (ret) { - LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", checkra1n_path, errno, strerror(errno)); - unlink(checkra1n_path); - free(checkra1n_path); - checkra1n_path = NULL; - return -1; - } - } -#if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER)) - char* libcheckra1nhelper_dylib_path = NULL; - { - struct utsname name; - uname(&name); - unsigned long darwinMajor = strtoul(name.release, NULL, 10); - assert(darwinMajor != 0); -#if !defined(FORCE_HELPER) - if (darwinMajor < 20) { -#endif - if (gOverrideLibcheckra1nHelper) { - libcheckra1nhelper_dylib_path = gOverrideLibcheckra1nHelper; - goto setenv_ra1n; - } - libcheckra1nhelper_dylib_path = malloc(strlen(tmpdir) + 40); - if (libcheckra1nhelper_dylib_path == NULL) { - LOG(LOG_FATAL, "memory allocation failed\n"); - return -1; - } - snprintf(libcheckra1nhelper_dylib_path, strlen(tmpdir) + 40, "%s/libcheckra1nhelper.dylib.XXXXXX", tmpdir); - int helper_fd = mkstemp(libcheckra1nhelper_dylib_path); - if (helper_fd == -1) { - LOG(LOG_FATAL, "Cannot open temporary file: %d (%s)", errno, strerror(errno)); - return -1; - } - ssize_t didWrite_libcheckra1nhelper = write(helper_fd, libcheckra1nhelper_dylib, libcheckra1nhelper_dylib_len); - if ((unsigned int)didWrite_libcheckra1nhelper != libcheckra1nhelper_dylib_len) { - LOG(LOG_FATAL, "Size written does not match expected: %zd != %" PRIu32 ": %d (%s)", didWrite_libcheckra1nhelper, libcheckra1nhelper_dylib_len, errno, strerror(errno)); - close(helper_fd); - unlink(libcheckra1nhelper_dylib_path); - return -1; - } - close(helper_fd); - ret = chmod(libcheckra1nhelper_dylib_path, 0700); - if (ret) { - LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", libcheckra1nhelper_dylib_path, errno, strerror(errno)); - unlink(libcheckra1nhelper_dylib_path); - return -1; - } -setenv_ra1n: - setenv("DYLD_INSERT_LIBRARIES", libcheckra1nhelper_dylib_path, 1); -#if !defined(FORCE_HELPER) - } -#endif - } -#endif - char args[0x10] = "-E"; - if ((palerain_flags & palerain_option_demote)) strncat(args, "d", 0xf); - if (!(palerain_flags & palerain_option_checkrain_is_clone)) { - strncat(args, "p", 0xf); - if (verbose >= 2) strncat(args, "v", 0xf); - if ((palerain_flags & palerain_option_no_colors)) strncat(args, "n", 0xf); - } else { - strncat(args, "R", 0xf); - } - LOG(LOG_VERBOSE5, "%s", args); - if (pongo_path != NULL) LOG(LOG_VERBOSE5, "%s", pongo_path); - pid_t pid; - posix_spawn_file_actions_t action; - posix_spawn_file_actions_init(&action); -#ifdef TUI - if (tui_is_jailbreaking) { - // silence checkra1n - posix_spawn_file_actions_addopen(&action, 1, "/dev/null", O_WRONLY, 0); - posix_spawn_file_actions_addopen(&action, 2, "/dev/null", O_WRONLY, 0); - } -#endif - ret = posix_spawn(&pid, checkra1n_path, &action, NULL, (char* []){ - checkra1n_path, - args, - "-k", - pongo_path, - NULL - }, environ); - posix_spawn_file_actions_destroy(&action); - if (ret) { - LOG(LOG_FATAL, "Cannot posix spawn %s: %d (%s)", checkra1n_path, errno, strerror(errno)); - if (ext_checkra1n != NULL) unlink(checkra1n_path); - return -1; - } - LOG(LOG_VERBOSE2, "%s spawned successfully", checkra1n_path); - sleep(2); - if (ext_checkra1n == NULL) { - unlink(checkra1n_path); - free(checkra1n_path); - checkra1n_path = NULL; - } - waitpid(pid, NULL, 0); - if (!external_pongo && pongo_path != NULL) { - unlink(pongo_path); - } - if (pongo_path != NULL) free(pongo_path); - pongo_path = NULL; -#if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER)) - if (libcheckra1nhelper_dylib_path != NULL) { - if (!gOverrideLibcheckra1nHelper) unlink(libcheckra1nhelper_dylib_path); - unsetenv("DYLD_INSERT_LIBRARIES"); - unsetenv("DYLD_FORCE_FLAT_NAMESPACE"); - if (!gOverrideLibcheckra1nHelper) free(libcheckra1nhelper_dylib_path); - libcheckra1nhelper_dylib_path = NULL; - } -#endif - return 0; -} diff --git a/src/fake_embedded.c b/src/fake_embedded.c deleted file mode 100644 index 48d3ce1..0000000 --- a/src/fake_embedded.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -#ifdef NO_KPF -unsigned char* checkra1n_kpf_pongo_lzma = NULL; -unsigned int checkra1n_kpf_pongo_lzma_len = 0; -#endif - -#ifdef NO_RAMDISK -unsigned char* ramdisk_dmg_lzma = NULL; -unsigned int ramdisk_dmg_lzma_len = 0; -#endif - -#ifdef NO_CHECKRAIN -unsigned char* checkra1n = NULL; -unsigned int checkra1n_len = 0; -#endif - -#ifdef NO_OVERLAY -unsigned char* binpack_dmg = NULL; -unsigned int binpack_dmg_len = 0; -#endif - -#ifdef NO_CUSTOM_PONGO -unsigned char* Pongo_bin = NULL; -unsigned int Pongo_bin_len = 0; -#endif - -#ifdef NO_EMBED_HELPER -unsigned char* libcheckra1nhelper_dylib = NULL; -unsigned int libcheckra1nhelper_dylib_len = 0; -#endif diff --git a/src/gen/.gitignore b/src/gen/.gitignore deleted file mode 100644 index 5761abc..0000000 --- a/src/gen/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.o diff --git a/src/gen/resources b/src/gen/resources deleted file mode 120000 index 945c9b4..0000000 --- a/src/gen/resources +++ /dev/null @@ -1 +0,0 @@ -. \ No newline at end of file diff --git a/src/lock_vars.c b/src/lock_vars.c deleted file mode 100644 index 7da4219..0000000 --- a/src/lock_vars.c +++ /dev/null @@ -1,85 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex; - -bool spin, found_pongo = 0; -uint64_t ecid_wait_for_dfu = 0; - -static bool get_locked_bool(bool* val, pthread_mutex_t* mutex) { - // fprintf(stderr, "%s: val = %p mutex = %p\n", __func__, (void*)val, (void*)mutex); - pthread_mutex_lock(mutex); - bool ret = *val; - pthread_mutex_unlock(mutex); - return ret; -} - -static bool set_locked_bool(bool* val, bool newval, pthread_mutex_t* mutex) { - // fprintf(stderr, "%s: val = %p mutex = %p, newval = %d\n", __func__, (void*)val, (void*)mutex, newval); - pthread_mutex_lock(mutex); - *val = newval; - pthread_mutex_unlock(mutex); - return newval; -} - -bool get_spin(void) { - return get_locked_bool(&spin, &spin_mutex); -} - -bool set_spin(bool newval) { - return set_locked_bool(&spin, newval, &spin_mutex); -} - -bool get_found_pongo(void) { - return get_locked_bool(&found_pongo, &found_pongo_mutex); -} - -bool set_found_pongo(bool val) { - return set_locked_bool(&found_pongo, val, &found_pongo_mutex); -} - -uint64_t get_ecid_wait_for_dfu(void) { - LOG(LOG_VERBOSE5, "locking ecid wait for dfu mutex for get"); - pthread_mutex_lock(&ecid_dfu_wait_mutex); - uint64_t ret = ecid_wait_for_dfu; - LOG(LOG_VERBOSE5, "UN-locking ecid wait for dfu mutex, ecid_wait_for_dfu value is %llu", ret); - pthread_mutex_unlock(&ecid_dfu_wait_mutex); - return ret; -} - -uint64_t set_ecid_wait_for_dfu(uint64_t ecid) { - LOG(LOG_VERBOSE5, "locking ecid wait for dfu mutex for set ecid_wait_for_dfu = %llu", ecid); - pthread_mutex_lock(&ecid_dfu_wait_mutex); - ecid_wait_for_dfu = ecid; - LOG(LOG_VERBOSE5, "UN-locking ecid wait for dfu mutex afrer setting ecid_wait_for_dfu"); - pthread_mutex_unlock(&ecid_dfu_wait_mutex); - return ecid; -} diff --git a/src/log.c b/src/log.c deleted file mode 100644 index 982c0c9..0000000 --- a/src/log.c +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include -#include - -#ifdef TUI -#include -#endif - -int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxname, const char *__restrict format, ...) -{ -#ifdef TUI - if (tui_started) return 0; -#endif - if (verbose >= 5 -#ifdef TUI - && !(palerain_flags & palerain_option_tui) -#endif - ) fprintf(stderr, "p1_log: loglevel %d from %s:%d:%s()\n", loglevel, fname, lineno, fxname); - int ret = 0; - char type[0x10]; - char colour[0x10]; - char colour_bold[0x10]; - va_list args; - va_start(args, format); - if (verbose < (loglevel - 3) && loglevel > LOG_INFO) { - if (verbose >= 5 -#ifdef TUI - && !tui_started -#endif -) fprintf(stderr, "p1_log: hid log with high log level (%d < %d)\n", verbose, loglevel - 3); - va_end(args); - return 0; - } - switch (loglevel) { - case LOG_FATAL: - snprintf(type, 0x10, "%s", "!"); - snprintf(colour, 0x10, "%s", RED); - snprintf(colour_bold, 0x10, "%s", BRED); - break; - case LOG_ERROR: - snprintf(type, 0x10, "%s", "Error"); - snprintf(colour, 0x10, "%s", RED); - snprintf(colour_bold, 0x10, "%s", BRED); - break; - case LOG_WARNING: - snprintf(type, 0x10, "%s", "Warning"); - snprintf(colour, 0x10, "%s", YEL); - snprintf(colour_bold, 0x10, "%s", BYEL); - break; - case LOG_INFO: - snprintf(type, 0x10, "%s", "Info"); - snprintf(colour, 0x10, "%s", CYN); - snprintf(colour_bold, 0x10, "%s", BCYN); - break; - default: - assert(loglevel >= 0); - snprintf(type, 0x10, "%s", "Verbose"); - snprintf(colour, 0x10, "%s", WHT); - snprintf(colour_bold, 0x10, "%s", BWHT); - break; - } - if ((palerain_flags & palerain_option_no_colors)) { - colour[0] = '\0'; - colour_bold[0] = '\0'; - } - { - pthread_mutex_lock(&log_mutex); - char timestring[0x80]; - time_t curtime; - time(&curtime); - struct tm* timeinfo = localtime(&curtime); - if (!(palerain_flags & palerain_option_no_colors)) - snprintf(timestring, 0x80, "%s[%s%02d/%02d/%d %02d:%02d:%02d%s]", CRESET, HBLK, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_year - 100, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, CRESET); - else - snprintf(timestring, 0x80, "[%02d/%02d/%d %02d:%02d:%02d]", timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_year - 100, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); - if (verbose >= 2 && !(palerain_flags & palerain_option_no_colors)) { - printf("%s| - %s%s <%s> " CRESET "%s" HBLU "%s" CRESET ":" BLU "%d" CRESET ":" BMAG "%s()" CRESET ": \n%s| ----> ", colour_bold, timestring, colour_bold, type, WHT, fname, lineno, fxname, colour_bold); - } else if (!(palerain_flags & palerain_option_no_colors)) { - printf(" - %s %s<%s>%s: ", timestring, colour_bold, type, CRESET); - } else if (verbose >= 2 && (palerain_flags & palerain_option_no_colors)) { - printf("%s| - %s%s <%s> %s:%d:%s(): \n%s| ----> ", colour_bold, timestring, colour_bold, type, fname, lineno, fxname, colour_bold); - } else if ((palerain_flags & palerain_option_no_colors)) { - printf(" - %s %s<%s>: ", timestring, colour_bold, type); - } - printf("%s", colour); - ret = vprintf(format, args); - va_end(args); - - if (verbose < 2 && !(palerain_flags & palerain_option_no_colors)) - printf(CRESET "\n"); - else if (!(palerain_flags & palerain_option_no_colors)) - printf("\n%s-%s\n", colour, CRESET); - else if (verbose < 2) - printf("\n"); - else - printf("\n%s-\n", colour); - fflush(stdout); - } - pthread_mutex_unlock(&log_mutex); - return ret; -} diff --git a/src/main.c b/src/main.c deleted file mode 100644 index 99d6cab..0000000 --- a/src/main.c +++ /dev/null @@ -1,190 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#define CMD_LEN_MAX 512 -#define OVERRIDE_MAGIC 0xd803b376 - -unsigned int verbose = 0; -/* we want to write to them so don't use string literals */ -char xargs_cmd[0x270] = { 'x', 'a', 'r', 'g', 's', '\0' }, - palerain_flags_cmd[0x30] = { 'd', 'e', 'a', 'd', 'b', 'e', 'e', 'f', '\0' }; -extern char** environ; - -niarelap_file_t* kpf_to_upload_1 = &checkra1n_kpf_pongo_lzma; -niarelap_file_t* ramdisk_to_upload_1 = &ramdisk_dmg_lzma; -niarelap_file_t* overlay_to_upload_1 = &binpack_dmg; - -niarelap_file_t** kpf_to_upload = &kpf_to_upload_1; -niarelap_file_t** ramdisk_to_upload = &ramdisk_to_upload_1; -niarelap_file_t** overlay_to_upload = &overlay_to_upload_1; - -override_file_t override_ramdisk, override_kpf, override_overlay; - -uint64_t palerain_flags = 0; - -pthread_mutex_t log_mutex; -pthread_t dfuhelper_thread, pongo_thread; - -void thr_cleanup(void* ptr) { - *(int*)ptr = 0; -} - -static int build_checks(void) { -#ifndef NO_CHECKRAIN -#if defined(__APPLE__) - struct mach_header_64* c1_header = (struct mach_header_64*)&checkra1n[0]; - if (c1_header->magic != MH_MAGIC_64 && c1_header->magic != MH_CIGAM_64) { - LOG(LOG_FATAL, "Broken build: checkra1n is not a thin Mach-O"); - return -1; - } - if (c1_header->cputype != _mh_execute_header.cputype) { - LOG(LOG_FATAL, "Broken build: checkra1n CPU type does not match palera1n CPU type"); - return -1; - } -#endif - if (checkra1n_len <= (UCHAR_MAX + 1)) { - LOG(LOG_FATAL, "checkra1n too small"); - } - if (boyermoore_horspool_memmem(&checkra1n[0], checkra1n_len, (const unsigned char *)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL) { - palerain_flags |= palerain_option_checkrain_is_clone; - } -#endif - return 0; -} - -#ifdef TUI -bool tui_started = false; -#endif - -#ifdef USE_LIBUSB -void log_cb(libusb_context *ctx, enum libusb_log_level level, const char *str) { - LOG(level + 0, "%s", str); -} -#endif - -// save argc, argv, and envp for restarting - -int saved_argc; -char** saved_argv; -char** saved_envp; - -static int palera1n(int argc, char *argv[], char *envp[]) { - saved_argc = argc; - saved_argv = argv; - saved_envp = envp; - - print_credits(); - int ret = 0; - pthread_mutex_init(&log_mutex, NULL); - pthread_mutex_init(&spin_mutex, NULL); - pthread_mutex_init(&found_pongo_mutex, NULL); - pthread_mutex_init(&ecid_dfu_wait_mutex, NULL); - if ((ret = build_checks())) return ret; - if ((ret = optparse(argc, argv))) goto cleanup; - if (!(palerain_flags & palerain_option_device_info) && (palerain_flags & palerain_option_palerain_version)) goto normal_exit; -#ifdef TUI - if ((palerain_flags & palerain_option_tui) || (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO) && !(palerain_flags & palerain_option_cli))) { - ret = tui(); - if (ret) goto cleanup; - else goto normal_exit; - } -#endif -#ifdef USE_LIBUSB - { - libusb_set_log_cb(NULL, log_cb, LIBUSB_LOG_CB_GLOBAL); - libusb_context* ctx = NULL; - int test_libusb = libusb_init(&ctx); - if (test_libusb) { - LOG(LOG_ERROR, "cannot initialize libusb: %d (%s)\n", test_libusb, libusb_strerror(test_libusb)); - libusb_exit(ctx); - goto cleanup; - } - libusb_exit(ctx); - } -#endif - - if (!(palerain_flags & palerain_option_device_info)) - LOG(LOG_INFO, "Waiting for devices"); - - if (getenv("USBMUXD_SOCKET_ADDRESS") == NULL && access("/var/run/usbmuxd", F_OK) != 0) - LOG(LOG_WARNING, "/var/run/usbmuxd not found, normal mode device detection will not work."); - - pthread_create(&pongo_thread, NULL, pongo_helper, NULL); - pthread_create(&dfuhelper_thread, NULL, dfuhelper, NULL); - pthread_join(dfuhelper_thread, NULL); - set_spin(0); - if ((palerain_flags & (palerain_option_dfuhelper_only | - palerain_option_reboot_device | - palerain_option_exit_recovery | - palerain_option_enter_recovery | - palerain_option_device_info) - ) || device_has_booted) - goto normal_exit; - pthread_cancel(pongo_thread); - pthread_join(pongo_thread, NULL); - if (exec_checkra1n()) goto cleanup; - - if ((palerain_flags & (palerain_option_pongo_exit | palerain_option_demote))) - goto normal_exit; - set_spin(1); - sleep(2); - pthread_create(&pongo_thread, NULL, pongo_helper, NULL); - pthread_join(pongo_thread, NULL); - while (get_spin()) - { - sleep(1); - } -normal_exit: -cleanup: - if (override_kpf.magic == OVERRIDE_MAGIC) { - munmap(override_kpf.ptr, (size_t)override_kpf.len); - close(override_kpf.fd); - } - if (override_ramdisk.magic == OVERRIDE_MAGIC) { - munmap(override_ramdisk.ptr, (size_t)override_ramdisk.len); - close(override_ramdisk.fd); - } - if (override_overlay.magic == OVERRIDE_MAGIC) { - munmap(override_overlay.ptr, (size_t)override_overlay.len); - close(override_overlay.fd); - } - if (ext_checkra1n != NULL) free(ext_checkra1n); - pthread_mutex_destroy(&log_mutex); - pthread_mutex_destroy(&spin_mutex); - pthread_mutex_destroy(&found_pongo_mutex); - pthread_mutex_destroy(&ecid_dfu_wait_mutex); - return ret; -} - - -int main (int argc, char* argv[], char* envp[]) { - return palera1n(argc, argv, envp); -} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..2f8024b --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,165 @@ +#include // isatty, STDIN_FILENO +#include // getenv +#include +#include +#include +#include + +#if defined(__APPLE__) +#include +#include +#include +#endif + +#ifdef WITH_GUI +# include +#endif + +#include "utils/constants.h" +#include "utils/log.h" +#include "utils/paleinfo.h" + +void print_credits() { + printf( + ":: ========================== ::\n" + ":: palera1n: " PALERAIN_VERSION "\n" + ":: ========================== ::\n\n" + ); +} + +void print_usage(char* argv) { + printf( + "Usage: %s [OPTIONS]\n\n" + " -h, --help Print usage information\n" + " -v, --version Print version\n\n" + "Options:\n" + " --cli Use command line interface\n" + #ifdef WITH_GUI + " --gui Use graphical user interface\n" + #endif + " --force-revert Force environment reversion\n" + " -l, --rootless Enable rootless mode (standard)\n" + " -f, --rootful Enable rootful mode\n" + " -c, --setup-fakefs Setup fake filesystem\n" + " -B, --setup-partial-fakefs Setup partial fake filesystem\n" + " -s, --safe-mode Enable safe mode\n" + " -T, --telnetd Enable TELNET daemon on port 46 (insecure)\n" + " -V, --verbose-boot Enable verbose booting\n" + , argv + ); +} + +void parse_arguments(int argc, char* argv[]) { + int options; + int option_index = 0; + + static struct option long_options[] = { + {"help", no_argument, NULL, 'h'}, + {"version", no_argument, NULL, 'v'}, + {"cli", no_argument, NULL, 1}, + #ifdef WITH_GUI + {"gui", no_argument, NULL, 3}, + #endif + {"force-revert", no_argument, NULL, 0}, + {"rootless", no_argument, NULL, 'l'}, + {"rootful", no_argument, NULL, 'f'}, + {"setup-fakefs", no_argument, NULL, 'c'}, + {"setup-partial-fakefs", no_argument, NULL, 'B'}, + {"safe-mode", no_argument, NULL, 's'}, + {"telnetd", no_argument, NULL, 'T'}, + {"verbose-boot", no_argument, NULL, 'V'}, + {NULL, 0, NULL, 0} + }; + + #ifdef WITH_GUI + if (isatty(STDIN_FILENO) && getenv("LLVM_PROFILE_FILE") == nullptr) { + palerain_flags &= ~palerain_option_gui; + palerain_flags |= palerain_option_cli; + } else { + palerain_flags &= ~palerain_option_cli; + palerain_flags |= palerain_option_gui; + } + #else + palerain_flags |= palerain_option_cli; + #endif + + while ((options = getopt_long(argc, argv, "hvlf:", long_options, &option_index)) != -1) { + switch (options) { + case 'h': // --help + print_usage(argv[0]); + exit(1); + case 'v': // --version + exit(0); + case 1: // --cli + palerain_flags &= ~palerain_option_tui; + palerain_flags &= ~palerain_option_gui; + palerain_flags |= palerain_option_cli; + break; + #ifdef WITH_GUI + case 3: // --gui + palerain_flags &= ~palerain_option_cli; + palerain_flags &= ~palerain_option_tui; + palerain_flags |= palerain_option_gui; + break; + #endif + case 0: // --force-revert + palerain_flags |= palerain_option_force_revert; + break; + case 'l': // --rootless + palerain_flags &= ~palerain_option_rootful; + palerain_flags |= palerain_option_rootless; + break; + case 'f': // --rootful + palerain_flags &= ~palerain_option_rootless; + palerain_flags |= palerain_option_rootful; + break; + case 'c': // --setup-fakefs + palerain_flags |= palerain_option_setup_rootful; + break; + case 'B': // --setup-partial-fakefs + palerain_flags |= palerain_option_setup_partial_root; + break; + case 's': // --safe-mode + palerain_flags |= palerain_option_safemode; + break; + case 'T': // --telnetd + palerain_flags |= palerain_option_telnetd; + break; + case 'V': // --verbose-boot + palerain_flags |= palerain_option_verbose_boot; + break; + case '?': + LOG("Unknown option"); + print_usage(argv[0]); + exit(1); + default: break; + } + } + + if (!(palerain_flags & palerain_option_gui)) { + if (!(palerain_flags & palerain_option_rootful) && !(palerain_flags & palerain_option_rootless)) { + LOG("You must specify either -l, --rootless or -f, --rootful.\n"); + print_usage(argv[0]); + exit(1); + } + } +} + +int main(int argc, char* argv[], char* envp[]) { + print_credits(); + parse_arguments(argc, argv); + LOG("palera1n_flags: %llu", palerain_flags); + + #ifdef WITH_GUI + if (palerain_flags & palerain_option_gui) { + wxEntryStart(argc, argv); + wxTheApp->CallOnInit(); + wxTheApp->OnRun(); + wxTheApp->OnExit(); + wxEntryCleanup(); + return 0; + } + #endif + + return 0; +} diff --git a/src/obj/.gitignore b/src/obj/.gitignore deleted file mode 100644 index 5761abc..0000000 --- a/src/obj/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.o diff --git a/src/obj/gen b/src/obj/gen deleted file mode 120000 index 945c9b4..0000000 --- a/src/obj/gen +++ /dev/null @@ -1 +0,0 @@ -. \ No newline at end of file diff --git a/src/optparse.c b/src/optparse.c deleted file mode 100644 index 5220116..0000000 --- a/src/optparse.c +++ /dev/null @@ -1,467 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef TUI -#include -#endif - -uint64_t* palerain_flags_p = &palerain_flags; -char* gOverrideLibcheckra1nHelper = NULL; - -static struct option longopts[] = { - {"setup-partial-fakefs", no_argument, NULL, 'B'}, - {"setup-fakefs", no_argument, NULL, 'c'}, - {"clean-fakefs", no_argument, NULL, 'C'}, - {"dfuhelper", no_argument, NULL, 'D'}, - {"help", no_argument, NULL, 'h'}, - {"pongo-shell", no_argument, NULL, 'p'}, - {"pongo-full", no_argument, NULL, 'P'}, - {"debug-logging", no_argument, NULL, 'v'}, - {"verbose-boot", no_argument, NULL, 'V'}, - {"boot-args", required_argument, NULL, 'e'}, - {"fakefs", no_argument, NULL, 'f'}, - {"rootless", no_argument, NULL, 'l'}, - {"demote", no_argument, NULL, 'd'}, - {"force-revert", no_argument, NULL, palerain_option_case_force_revert}, - {"no-colors", no_argument, NULL, 'S'}, - {"safe-mode", no_argument, NULL, 's'}, - {"telnetd", no_argument, NULL, 'T'}, - {"version", no_argument, NULL, palerain_option_case_version}, - {"override-libcheckra1nhelper", required_argument, NULL, palerain_option_case_libcheckra1nhelper_path}, - {"override-pongo", required_argument, NULL, 'k'}, - {"override-overlay", required_argument, NULL, 'o'}, - {"override-ramdisk", required_argument, NULL, 'r'}, - {"override-kpf", required_argument, NULL, 'K'}, - {"override-checkra1n", required_argument, NULL, 'i'}, - {"reboot-device", no_argument, NULL, 'R'}, - {"exit-recovery", no_argument, NULL, 'n'}, - {"enter-recovery", no_argument, NULL, 'E'}, - {"device-info", no_argument, NULL, 'I'}, -#ifdef DEV_BUILD - {"test1", no_argument, NULL, '1'}, - {"test2", no_argument, NULL, '2'}, -#endif -#ifdef TUI - {"tui", no_argument, NULL, 't'}, -#endif - {"cli", no_argument, NULL, palerain_option_case_cli}, - {NULL, 0, NULL, 0} -}; - -static int usage(int e, char* prog_name) -{ - fprintf(stderr, - "Usage: %s [-" - "DEhpvVldsSTLRnPI" -#ifdef DEV_BUILD - "12" -#endif -#ifdef ROOTFUL - "cCfB" -#endif -#ifdef TUI - "t" -#endif - "] [-e boot arguments] [-k Pongo image] [-o overlay file] [-r ramdisk file] [-K KPF file] [-i checkra1n file]\n" - "Copyright (C) 2024, palera1n team, All Rights Reserved.\n\n" - "iOS/iPadOS/tvOS 15.0-26.0, bridgeOS 5.0-10.0 arm64 jailbreaking tool\n\n" - "\t--version\t\t\t\tPrint version\n" - "\t--force-revert\t\t\t\tRemove jailbreak\n" -#ifdef DEV_BUILD - "\t-1, --test1\t\t\t\tSet palerain_option_test1\n" - "\t-2, --test2\t\t\t\tSet palerain_option_test2\n" -#endif -#ifdef ROOTFUL - "\t-B, --setup-partial-fakefs\t\tSetup partial fakefs\n" - "\t-c, --setup-fakefs\t\t\tSetup fakefs\n" - "\t-C, --clean-fakefs\t\t\tClean fakefs\n" -#endif - "\t-d, --demote\t\t\t\tDemote\n" - "\t-D, --dfuhelper\t\t\t\tExit after entering DFU\n" - "\t-e, --boot-args \tXNU boot arguments\n" - "\t-E, --enter-recovery\t\t\tEnter recovery mode\n" -#ifdef ROOTFUL - "\t-f, --fakefs \t\t\t\tBoots fakefs\n" -#endif - "\t-h, --help\t\t\t\tShow this help\n" - "\t-i, --override-checkra1n \t\tOverride checkra1n\n" - "\t-k, --override-pongo \t\tOverride Pongo image\n" - "\t-K, --override-kpf \t\tOverride kernel patchfinder\n" -#ifdef ROOTFUL - "\t-l, --rootless\t\t\t\tBoots rootless. This is the default\n" -#endif - "\t-L, --jbinit-log-to-file\t\tMake jbinit log to /cores/jbinit.log (can be read from sandbox while jailbroken)\n" - "\t-n, --exit-recovery\t\t\tExit recovery mode\n" - "\t-I, --device-info\t\t\tPrint info about the connected device\n" - "\t-o, --override-overlay \t\tOverride overlay\n" - "\t-p, --pongo-shell\t\t\tBoots to PongoOS shell\n" - "\t-P, --pongo-full\t\t\tBoots to a PongoOS shell with default images already uploaded\n" - "\t-r, --override-ramdisk \t\tOverride ramdisk\n" - "\t-R, --reboot-device\t\t\tReboot connected device in normal mode\n" - "\t-s, --safe-mode\t\t\t\tEnter safe mode\n" - "\t-S, --no-colors\t\t\t\tDisable colors on the command line\n" - "\t-T, --telnetd\t\t\t\tEnable TELNET daemon on port 46 (insecure)\n" - "\t-v, --debug-logging\t\t\tEnable debug logging\n" - "\t\tThis option can be repeated for extra verbosity.\n" - "\t-V, --verbose-boot\t\t\tVerbose boot\n" - -#ifdef TUI - "\t-t, --tui\t\t\t\tForce interactive TUI\n" - "\t--cli\t\t\t\t\tForce cli mode\n" -#endif - "\nEnvironmental variables:\n" - "\tTMPDIR\t\ttemporary diretory (path the built-in checkra1n will be extracted to)\n" - , - prog_name); - exit(e); -} - -int optparse(int argc, char* argv[]) { - int opt; - int index; - while ((opt = getopt_long(argc, argv, - "DEhpvVlLdsSTtRnPIe:o:r:K:k:i:" -#ifdef DEV_BUILD - "12" -#endif -#ifdef ROOTFUL - "fCcB" -#endif - ,longopts, NULL)) != -1) - { - switch (opt) { -#ifdef ROOTFUL - case 'B': - palerain_flags |= palerain_option_setup_partial_root; - palerain_flags |= palerain_option_setup_rootful; - break; - case 'c': - palerain_flags |= palerain_option_setup_rootful; - break; - case 'C': - palerain_flags |= palerain_option_clean_fakefs; - break; -#endif - case 'p': - palerain_flags |= palerain_option_pongo_exit; - break; - case 'P': - palerain_flags |= palerain_option_pongo_full; - break; - case 'D': - palerain_flags |= palerain_option_dfuhelper_only; - break; - case 'h': - usage(0, argv[0]); - assert(0); - case 'v': - verbose++; - break; - case 'V': - palerain_flags |= palerain_option_verbose_boot; -#ifdef TUI - tui_options_verbose_boot = true; -#endif - break; - case 'e': - if (strlen(optarg) > (sizeof(xargs_cmd) - 0x20)) { - LOG(LOG_FATAL, "Boot arguments too long"); - return -1; - } - snprintf(xargs_cmd, sizeof(xargs_cmd), "xargs %s", optarg); -#ifdef TUI - snprintf(tui_options_boot_args, sizeof(tui_options_boot_args), "%s", optarg); -#endif - break; -#ifdef ROOTFUL - case 'f': - palerain_flags |= palerain_option_rootful; - palerain_flags &= ~palerain_option_rootless; - break; -#endif - case 'l': - palerain_flags &= ~palerain_option_rootful; - palerain_flags |= palerain_option_rootless; - break; - case 'L': - palerain_flags |= palerain_option_jbinit_log_to_file; - break; - case 'd': - palerain_flags |= palerain_option_demote; - break; - case 'E': - palerain_flags |= palerain_option_enter_recovery; - break; - case 's': - palerain_flags |= palerain_option_safemode; -#ifdef TUI - tui_options_safe_mode = true; -#endif - break; - case 'T': - palerain_flags |= palerain_option_telnetd; - break; - case 'k': - if (access(optarg, F_OK) != 0) { - LOG(LOG_FATAL, "Cannot access pongo file at %s: %d (%s)", optarg, errno, strerror(errno)); - return -1; - } - pongo_path = malloc(strlen(optarg) + 1); - if (pongo_path == NULL) { - LOG(LOG_FATAL, "memory allocation failed"); - return -1; - } - snprintf(pongo_path, strlen(optarg) + 1, "%s", optarg); - break; - case 'o': - if (override_file(&override_overlay, overlay_to_upload, &binpack_dmg_len, optarg)) - return 1; - break; - case 'r': - if (override_file(&override_ramdisk, ramdisk_to_upload, &ramdisk_dmg_lzma_len, optarg)) - return 1; - break; - case 'K': - if (override_file(&override_kpf, kpf_to_upload, &checkra1n_kpf_pongo_lzma_len, optarg)) - return 1; - struct mach_header_64* hdr = (struct mach_header_64*)override_kpf.ptr; - if (hdr->magic != MH_MAGIC_64 && hdr->magic != MH_CIGAM_64) { - LOG(LOG_FATAL, "Invalid kernel patchfinder: Not thin 64-bit Mach-O"); - return -1; - } else if (hdr->filetype != MH_KEXT_BUNDLE) { - LOG(LOG_FATAL, "Invalid kernel patchfinder: Not a kext bundle"); - return -1; - } else if (hdr->cputype != CPU_TYPE_ARM64) { - LOG(LOG_FATAL, "Invalid kernel patchfinder: CPU type is not arm64"); - return -1; - } - break; - case 'i': {}; - struct stat st; - if (stat(optarg, &st) != 0) { - LOG(LOG_FATAL, "cannot stat external checkra1n file: %d (%s)", errno, strerror(errno)); - return -1; - } else if (!(st.st_mode & S_IXUSR) && !(st.st_mode & S_IXGRP) && !(st.st_mode & S_IXOTH)) { - LOG(LOG_FATAL, "%s is not executable", optarg); - return -1; - } else if (!S_ISREG(st.st_mode)) { - LOG(LOG_FATAL, "%s is not a regular file", optarg); - return -1; - } - if (st.st_size < (UCHAR_MAX+1)) { - LOG(LOG_FATAL, "%s too small", optarg); - return -1; - } - int checkra1n_fd = open(optarg, O_RDONLY); - if (checkra1n_fd == -1) { - LOG(LOG_FATAL, "Cannot open %s: %d (%s)", optarg, errno, strerror(errno)); - return -1; - } - void* addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, checkra1n_fd, 0); - if (addr == MAP_FAILED) { - LOG(LOG_ERROR, "Failed to map file %s: %d (%s)", optarg, errno, strerror(errno)); - return -1; - } - if (boyermoore_horspool_memmem(addr, st.st_size, (const unsigned char*)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL) - { - palerain_flags |= palerain_option_checkrain_is_clone; - LOG(LOG_VERBOSE3, "%s is checkra1n clone", optarg); - } - else - { - palerain_flags &= ~palerain_option_checkrain_is_clone; - LOG(LOG_VERBOSE3, "%s is checkra1n", optarg); - } - munmap(addr, st.st_size); - close(checkra1n_fd); - ext_checkra1n = calloc(1, strlen(optarg) + 1); - snprintf(ext_checkra1n, strlen(optarg) + 1, "%s", optarg); - break; - case 'R': - palerain_flags |= palerain_option_reboot_device; - break; - case 'n': - palerain_flags |= palerain_option_exit_recovery; - break; - case 'I': - palerain_flags |= palerain_option_device_info; - break; - case 'S': - palerain_flags |= palerain_option_no_colors; - break; -#ifdef TUI - case 't': - palerain_flags |= palerain_option_tui; - break; -#endif - case palerain_option_case_cli: - palerain_flags |= palerain_option_cli; - break; -#ifdef DEV_BUILD - case '1': - palerain_flags |= palerain_option_test1; - break; - case '2': - palerain_flags |= palerain_option_test2; - break; -#endif - case palerain_option_case_force_revert: - palerain_flags |= palerain_option_force_revert; -#ifdef TUI - tui_options_force_revert = true; -#endif - break; - case palerain_option_case_version: - palerain_flags |= palerain_option_palerain_version; - break; - case palerain_option_case_libcheckra1nhelper_path: - printf("meow\n"); - gOverrideLibcheckra1nHelper = calloc(1, strlen(optarg) + 1); - if (!gOverrideLibcheckra1nHelper) { - return -1; - } - snprintf(gOverrideLibcheckra1nHelper, strlen(optarg) + 1, "%s", optarg); - break; - default: - usage(1, argv[0]); - break; - } - } - if ((palerain_flags & palerain_option_palerain_version)) { - printf( - "palera1n " PALERAIN_VERSION "\n" - BUILD_COMMIT " " BUILD_NUMBER " (" BUILD_BRANCH ")\n\n" - "Build style: " BUILD_STYLE "\n" - "Build tag: " BUILD_TAG "\n" -#ifdef USE_LIBUSB - "USB backend: libusb\n" -#else - "USB backend: IOKit\n" -#endif - "Build options: " BUILD_OPTIONS "\n" - ); - return 0; - } - - if (palerain_flags & palerain_option_telnetd) { - LOG(LOG_WARNING, "telnetd is enabled, this is a security hole"); - } - - if ((palerain_flags & (palerain_option_tui)) && (palerain_flags & (palerain_option_cli))) { - LOG(LOG_FATAL, "cannot specify both --tui and --cli"); - return -1; - } - - if ((palerain_flags & (palerain_option_exit_recovery | palerain_option_enter_recovery | palerain_option_reboot_device | palerain_option_device_info | palerain_option_dfuhelper_only | palerain_option_pongo_exit | palerain_option_pongo_full)) > 0) { - palerain_flags &= ~palerain_option_tui; - palerain_flags |= palerain_option_cli; - } else { -#ifdef ROOTFUL - if ((palerain_flags & (palerain_option_rootless | palerain_option_rootful)) == 0) { - LOG(LOG_FATAL, "Please specify rootful (-f) or rootless (-l)"); - return -1; - } -#else - palerain_flags |= palerain_option_rootless; -#endif - } - - snprintf(palerain_flags_cmd, 0x30, "palera1n_flags 0x%" PRIx64, palerain_flags); - LOG(LOG_VERBOSE3, "palerain_flags: %s", palerain_flags_cmd); - if (override_kpf.magic == OVERRIDE_MAGIC) { - LOG(LOG_VERBOSE4, "kpf override length %" PRIu32 " -> %" PRIu32, override_kpf.orig_len, checkra1n_kpf_pongo_lzma_len); - LOG(LOG_VERBOSE4, "kpf override ptr %p -> %p", override_kpf.orig_ptr, **kpf_to_upload); - } - if (override_ramdisk.magic == OVERRIDE_MAGIC) { - LOG(LOG_VERBOSE4, "ramdisk override length %" PRIu32 " -> %" PRIu32, override_ramdisk.orig_len, ramdisk_dmg_lzma_len); - LOG(LOG_VERBOSE4, "ramdisk override ptr %p -> %p", override_ramdisk.orig_ptr, **ramdisk_to_upload); - } - if (override_overlay.magic == OVERRIDE_MAGIC) { - LOG(LOG_VERBOSE4, "overlay override length %" PRIu32 " -> %" PRIu32, override_overlay.orig_len, binpack_dmg_len); - LOG(LOG_VERBOSE4, "overlay override ptr %p -> %p", override_overlay.orig_ptr, **overlay_to_upload); - } -#ifdef ROOTFUL - if (!(palerain_flags & palerain_option_rootful)) { - if ((palerain_flags & palerain_option_setup_rootful)) { - LOG(LOG_FATAL, "Cannot setup rootful when rootless is requested. Use -f to enable rootful mode."); - return -1; - } - } -#endif - if (!( - (palerain_flags & palerain_option_dfuhelper_only) || - (palerain_flags & palerain_option_enter_recovery) || - (palerain_flags & palerain_option_exit_recovery) || - (palerain_flags & palerain_option_reboot_device))) - { -#ifdef NO_CHECKRAIN - if (checkra1n_len == 0 && ext_checkra1n == NULL) - { - LOG(LOG_FATAL, "checkra1n omitted in build but no override specified"); - return -1; - } - if (!((palerain_flags & palerain_option_pongo_exit) || (palerain_flags & palerain_option_pongo_exit))) - { -#ifdef NO_KPF - if (checkra1n_kpf_pongo_lzma_len == 0) - { - LOG(LOG_FATAL, "kernel patchfinder omitted in build but no override specified"); - return -1; - } -#endif - } -#endif - -#ifdef NO_EMBED_HELPER - if (libcheckra1nhelper_dylib_len == 0 && gOverrideLibcheckra1nHelper == NULL) { - LOG(LOG_FATAL, "checkra1n helper omitted in build but no override specified"); - return -1; - } -#endif - } - - for (index = optind; index < argc; index++) - { - if (!strcmp("windows", argv[index])) - { - fprintf(stderr, - "Windows not really using for manipulating OSX images,\n" - "compiled in mingw tool for this working unstable and incorrectly\n"); - return -2; - } - else - { - fprintf(stderr, "%s: unknown argument: %s\n", argv[0], argv[index]); - usage(1, argv[0]); - } - } - if (verbose >= 2) setenv("LIBUSB_DEBUG", "1", 1); - - if (verbose >= 3) - { - libusbmuxd_set_debug_level(verbose - 2); - irecv_set_debug_level(1); - setenv("LIBUSB_DEBUG", "2", 1); - } - if (verbose >= 4) { - idevice_set_debug_level(1); - setenv("LIBUSB_DEBUG", "3", 1); - } - if (verbose >= 5) - setenv("LIBUSB_DEBUG", "4", 1); - return 0; -} diff --git a/src/override_file.c b/src/override_file.c deleted file mode 100644 index 857aebf..0000000 --- a/src/override_file.c +++ /dev/null @@ -1,50 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int override_file(override_file_t *finfo, niarelap_file_t** orig, unsigned int *orig_len, char *filename) { - int ret = 0; - int fd = open(filename, O_RDONLY); - LOG(LOG_VERBOSE5, "override_file() called!"); - if (fd == -1) { - LOG(LOG_ERROR, "Cannot open file %s: %d (%s)", filename, errno, strerror(errno)); - return errno; - } - LOG(LOG_VERBOSE5, "override_file: opened %s!", filename); - struct stat st; - ret = fstat(fd, &st); - if (ret) { - LOG(LOG_ERROR, "Cannot fstat fd from file %s: %d (%s)", filename, errno, strerror(errno)); - return errno; - } - LOG(LOG_VERBOSE5, "override_file: fstat fd %d succeeded!", fd); - void *addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (addr == MAP_FAILED) { - LOG(LOG_ERROR, "Failed to map file %s: %d (%s)", filename, errno, strerror(errno)); - return errno; - } - LOG(LOG_VERBOSE5, "override_file: Override file mapped successfully"); - finfo->magic = OVERRIDE_MAGIC; - finfo->fd = fd; - finfo->len = (unsigned int)st.st_size;; - finfo->ptr = *(niarelap_file_t*)addr; - finfo->orig_len = *orig_len; - finfo->orig_ptr = **orig; - *orig = (niarelap_file_t*)addr; - *orig_len = (unsigned int)st.st_size; - LOG(LOG_VERBOSE5, "override_file() finished!"); - return 0; -} diff --git a/src/pongo_helper.c b/src/pongo_helper.c deleted file mode 100644 index 42d8e9b..0000000 --- a/src/pongo_helper.c +++ /dev/null @@ -1,283 +0,0 @@ -#include -#include // open -#include -#include -#include -#include -#include // exit, strtoull -#include // strlen, strerror, memcpy, memmove -#include // close -#include // mmap, munmap -#include // fstst - -#include -#ifdef TUI -#include -#endif -#include - -bool device_has_booted = 0; -int pongo_thr_running = 0; - -#define ERR(...) LOG(LOG_VERBOSE, __VA_ARGS__) - -static int issue_pongo_command(usb_device_handle_t, char*); -static int upload_pongo_file(usb_device_handle_t, unsigned char*, unsigned int); -static void write_stdout(char *buf, uint32_t len); - -void* pongo_helper(void* ptr) { - pongo_thr_running = 1; - pthread_cleanup_push(thr_cleanup, &pongo_thr_running); - wait_for_pongo(); - while (get_spin()) { - sleep(1); - } - pthread_cleanup_pop(1); - return NULL; -} - -static void *pongo_usb_callback(stuff_t *arg) { - if (get_found_pongo()) - return NULL; - set_found_pongo(1); -#ifdef ROOTFUL - if ((palerain_flags & palerain_option_setup_rootful)) { - strncat(xargs_cmd, " wdt=-1", 0x270 - strlen(xargs_cmd) - 1); - } -#endif - LOG(LOG_INFO, "Found PongoOS USB Device"); - if (palerain_flags & palerain_option_pongo_exit) - goto done; - - usb_device_handle_t handle = arg->handle; -#ifdef TUI - if (tui_is_jailbreaking) { - tui_jailbreak_stage = 4; - tui_jailbreak_status = "Sending PongoOS commands"; - tui_jailbreak_status_changed(); - } -#endif - issue_pongo_command(handle, NULL); - issue_pongo_command(handle, "fuse lock"); - issue_pongo_command(handle, "sep auto"); -#ifdef TUI - if (tui_is_jailbreaking) { - tui_jailbreak_stage = 5; - tui_jailbreak_status = "Sending KPF"; - tui_jailbreak_status_changed(); - } -#endif - upload_pongo_file(handle, **kpf_to_upload, checkra1n_kpf_pongo_lzma_len); - if (*kpf_to_upload == &checkra1n_kpf_pongo_lzma) { - issue_pongo_command(handle, "modload " KPF_UNCOMPRESSED_SIZE); - } else { - issue_pongo_command(handle, "modload"); - } - issue_pongo_command(handle, palerain_flags_cmd); -#ifdef NO_RAMDISK - if (ramdisk_dmg_lzma_len != 0) -#endif - { -#ifdef TUI - if (tui_is_jailbreaking) { - tui_jailbreak_stage = 6; - tui_jailbreak_status = "Sending ramdisk"; - tui_jailbreak_status_changed(); - } -#endif - upload_pongo_file(handle, **ramdisk_to_upload, ramdisk_dmg_lzma_len); - if ((*ramdisk_to_upload) == &ramdisk_dmg_lzma) - issue_pongo_command(handle, "ramdisk " RAMDISK_UNCOMPRESSED_SIZE); - else { - issue_pongo_command(handle, "ramdisk"); - } - } -#ifdef NO_OVERLAY - if (binpack_dmg_len != 0) -#endif - { -#ifdef TUI - if (tui_is_jailbreaking) { - tui_jailbreak_stage = 7; - tui_jailbreak_status = "Sending binpack"; - tui_jailbreak_status_changed(); - } -#endif - upload_pongo_file(handle, **overlay_to_upload, binpack_dmg_len); - issue_pongo_command(handle, "overlay"); - } - issue_pongo_command(handle, xargs_cmd); - if ((palerain_flags & palerain_option_pongo_full)) goto done; - -#ifdef TUI - if (tui_is_jailbreaking) { - tui_jailbreak_stage = 8; - tui_jailbreak_status = "Booting"; - tui_jailbreak_status_changed(); - } -#endif - issue_pongo_command(handle, "bootx"); - LOG(LOG_INFO, "Booting Kernel..."); -#ifdef ROOTFUL - if ((palerain_flags & palerain_option_setup_partial_root)) { - LOG(LOG_INFO, "Please wait up to 5 minutes for the bindfs to be created."); - LOG(LOG_INFO, "Once the device reboots into recovery mode, run again without the -B (Create BindFS) option to jailbreak."); - } else if ((palerain_flags & palerain_option_setup_rootful)) { - LOG(LOG_INFO, "Please wait up to 10 minutes for the fakefs to be created."); - LOG(LOG_INFO, "Once the device reboots into recovery mode, run again without the -c (Create FakeFS) option to jailbreak."); - } -#endif - if (dfuhelper_thr_running) { - pthread_cancel(dfuhelper_thread); - dfuhelper_thr_running = false; - } -done: - device_has_booted = true; - -#ifdef TUI - if (tui_is_jailbreaking) { - tui_jailbreak_stage = 9; - tui_jailbreak_status = "All Done"; - tui_is_jailbreaking = false; - tui_jailbreak_status_changed(); - } -#endif -#ifdef USE_LIBUSB - libusb_unref_device(arg->dev); -#endif - set_spin(0); - return NULL; -} - -static int issue_pongo_command(usb_device_handle_t handle, char *command) -{ - uint32_t outpos = 0; - uint32_t outlen = 0; - int ret = USB_RET_SUCCESS; - uint8_t in_progress = 1; - if (command == NULL) goto fetch_output; - size_t len = strlen(command); - char command_buf[512]; - char stdout_buf[0x2000]; - if (len > (CMD_LEN_MAX - 2)) - { - LOG(LOG_ERROR, "Pongo command %s too long (max %d)", command, CMD_LEN_MAX - 2); - return EINVAL; - } - if (verbose < 3 || verbose > 4) { - LOG(LOG_VERBOSE, "Executing PongoOS command: '%s'", command); - } else { - printf("%s\n", command); - } - snprintf(command_buf, 512, "%s\n", command); - len = strlen(command_buf); - ret = USBControlTransfer(handle, 0x21, 4, 1, 0, 0, NULL, NULL); - if (ret) - goto bad; - ret = USBControlTransfer(handle, 0x21, 3, 0, 0, (uint32_t)len, command_buf, NULL); -fetch_output: - while (in_progress) { - ret = USBControlTransfer(handle, 0xa1, 2, 0, 0, (uint32_t)sizeof(in_progress), &in_progress, NULL); - if (ret == USB_RET_SUCCESS) - { - ret = USBControlTransfer(handle, 0xa1, 1, 0, 0, 0x1000, stdout_buf + outpos, &outlen); - if (ret == USB_RET_SUCCESS) - { - write_stdout(stdout_buf + outpos, outlen); - outpos += outlen; - if (outpos > 0x1000) - { - memmove(stdout_buf, stdout_buf + outpos - 0x1000, 0x1000); - outpos = 0x1000; - } - } - } - if (ret != USB_RET_SUCCESS) - { - goto bad; - } - } -bad: - if (ret != USB_RET_SUCCESS) - { - if (command != NULL && (!strncmp("boot", command, 4))) { - if (ret == USB_RET_IO || ret == USB_RET_NO_DEVICE || ret == USB_RET_NOT_RESPONDING) - return 0; - } - LOG(LOG_ERROR, "USB error: %s", usb_strerror(ret)); - return ret; - } - else - return ret; -} - -static int upload_pongo_file(usb_device_handle_t handle, unsigned char *buf, unsigned int buf_len) -{ - int ret = 0; - ret = USBControlTransfer(handle, 0x21, 1, 0, 0, 4, &buf_len, NULL); - if (ret == USB_RET_SUCCESS) - { - ret = USBBulkUpload(handle, buf, buf_len); - if (ret == USB_RET_SUCCESS) - { - if (verbose < 3 || verbose > 4) { - LOG(LOG_VERBOSE, "Uploaded %llu bytes to PongoOS", (unsigned long long)buf_len); - } else { - if ((palerain_flags & palerain_option_no_colors)) - printf("/send mem:%p:%p\n[Uploaded %llu bytes]\n", (void*)buf, (void*)(buf + buf_len), (unsigned long long)buf_len); - else - printf("/send mem:%p:%p\n" BCYN "[Uploaded %llu bytes]\n" CRESET, (void*)buf, (void*)(buf + buf_len), (unsigned long long)buf_len); - } - } - } - if (verbose >= 3) printf("pongoOS> "); - return ret; -} - -void io_start(stuff_t *stuff) -{ - int r = pthread_create(&stuff->th, NULL, (pthread_start_t)pongo_usb_callback, stuff); - if(r != 0) - { - ERR("pthread_create: %s", strerror(r)); - set_spin(0); - return; - } - pthread_join(stuff->th, NULL); -} - -void io_stop(stuff_t *stuff) -{ - int r = pthread_cancel(stuff->th); - if(r != 0) - { - ERR("pthread_cancel: %s", strerror(r)); - set_spin(0); - return; - } - r = pthread_join(stuff->th, NULL); - if(r != 0) - { - ERR("pthread_join: %s", strerror(r)); - set_spin(0); - return; - } -#ifdef USE_LIBUSB - libusb_unref_device(stuff->dev); -#endif -} - -static void write_stdout(char *buf, uint32_t len) -{ - while(len > 0) { - if (verbose >= 3) { - ssize_t s = write(1, buf, len); - if(s < 0) { - LOG(LOG_ERROR, "write: %s", strerror(errno)); - pthread_exit(NULL); - } - buf += s; - len -= s; - } else break; - } -} diff --git a/src/resources/.gitignore b/src/resources/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/src/resources/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/src/tui_devhelper.c b/src/tui_devhelper.c deleted file mode 100644 index 50f9413..0000000 --- a/src/tui_devhelper.c +++ /dev/null @@ -1,220 +0,0 @@ -#ifdef TUI - -#include -#include - -static irecv_device_t tui_get_recovery_device(uint64_t ecid) { - irecv_client_t client = NULL; - for (int i = 0; i <= 5; i++) { - irecv_error_t err = irecv_open_with_ecid(&client, ecid); - if (err == IRECV_E_UNSUPPORTED) { - return NULL; - } - else if (err != IRECV_E_SUCCESS) - sleep(1); - else - break; - - if (i == 5) { - return NULL; - } - } - - irecv_device_t device = NULL; - irecv_devices_get_device_by_client(client, &device); - irecv_close(client); - return device; -} - -struct tui_connected_device *tui_connected_devices = NULL; - -static void* tui_connected_recovery_mode(struct irecv_device_info* info) { - //printf("Recovery mode device %" PRIu64 " connected\n", info->ecid); - tui_last_event = TUI_EVENT_CONNECTED_DEVICES_CHANGED; - sem_post(tui_event_semaphore); - pthread_exit(NULL); - return NULL; -} - -static void* tui_disconnected_recovery_mode(struct irecv_device_info* info) { - //printf("Recovery mode device %" PRIu64 " disconnected\n", info->ecid); - tui_last_event = TUI_EVENT_CONNECTED_DEVICES_CHANGED; - sem_post(tui_event_semaphore); - pthread_exit(NULL); - return NULL; -} - -static void* tui_connected_dfu_mode(struct irecv_device_info* info) { - //printf("DFU mode device %" PRIu64 " connected\n", info->ecid); - tui_last_event = TUI_EVENT_CONNECTED_DEVICES_CHANGED; - sem_post(tui_event_semaphore); - pthread_exit(NULL); - return NULL; -} - -static void* tui_disconnected_dfu_mode(struct irecv_device_info* info) { - //printf("DFU mode device %" PRIu64 " disconnected\n", info->ecid); - tui_last_event = TUI_EVENT_CONNECTED_DEVICES_CHANGED; - sem_post(tui_event_semaphore); - pthread_exit(NULL); - return NULL; -} - -static int tui_connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) { - struct tui_connected_device *tui_dev = malloc(sizeof(struct tui_connected_device)); - snprintf(tui_dev->udid, sizeof(tui_dev->udid), "%s", usbmuxd_device->udid); - tui_dev->next = tui_connected_devices; - tui_dev->mode = TUI_DEVICE_MODE_NORMAL; - tui_connected_devices = tui_dev; - devinfo_t dev; - int ret; - ret = devinfo_cmd(&dev, usbmuxd_device->udid); - if (ret != 0) { - LOG(LOG_ERROR, "Unable to get device information"); - free(tui_dev); - return 0; - } - snprintf(tui_dev->product_type, sizeof(tui_dev->product_type), "%s", dev.productType); - snprintf(tui_dev->display_name, sizeof(tui_dev->display_name), "%s", dev.displayName); - tui_dev->ecid = dev.ecid; - if (strncmp(dev.CPUArchitecture, "arm64", strlen("arm64"))) { - tui_dev->arm64 = false; - } else { - tui_dev->arm64 = true; - } - snprintf(tui_dev->version, sizeof(tui_dev->version), "%s", dev.productVersion); - if (!strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) { - tui_dev->requires_passcode_disabled = true; - unsigned char passcode_state = 0; - ret = passstat_cmd(&passcode_state, usbmuxd_device->udid); - if (ret != 0) { - LOG(LOG_ERROR, "Failed to get passcode state"); - devinfo_free(&dev); - free(tui_dev); - return -1; - } - tui_dev->passcode_state = passcode_state; - } - - //enter_recovery_cmd(usbmuxd_device->udid); - devinfo_free(&dev); - - tui_last_event = TUI_EVENT_CONNECTED_DEVICES_CHANGED; - sem_post(tui_event_semaphore); - - return 0; -} - -static void tui_disconnected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) { - struct tui_connected_device *cur = tui_connected_devices; - struct tui_connected_device *prev = NULL; - while (cur) { - if (!strcmp(cur->udid, usbmuxd_device->udid)) { - if (prev) { - prev->next = cur->next; - } else { - tui_connected_devices = cur->next; - } - free(cur); - break; - } - prev = cur; - cur = cur->next; - } - - tui_last_event = TUI_EVENT_CONNECTED_DEVICES_CHANGED; - sem_post(tui_event_semaphore); -} - -static void tui_device_event_cb(const usbmuxd_event_t *event, void* userdata) { - if (event->device.conn_type != CONNECTION_TYPE_USB) return; - switch (event->event) { - case UE_DEVICE_ADD: - LOG(LOG_VERBOSE, "Normal mode device connected"); - tui_connected_normal_mode(&event->device); - break; - case UE_DEVICE_REMOVE: - LOG(LOG_VERBOSE, "Normal mode device disconnected"); - tui_disconnected_normal_mode(&event->device); - break; - } -} - -static void tui_irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) { - pthread_t recovery_thread, dfu_thread; - int ret; - - switch(event->type) { - case IRECV_DEVICE_ADD: { - struct tui_connected_device *dev = malloc(sizeof(struct tui_connected_device)); - dev->ecid = event->device_info->ecid; - dev->next = tui_connected_devices; - dev->arm64 = cpid_is_arm64(event->device_info->cpid); - /*recvinfo_t info; - ret = recvinfo_cmd(&info, event->device_info->ecid); - if (ret) { - LOG(LOG_WARNING, "Could not get info from device"); - } else { - snprintf(dev->product_type, sizeof(dev->product_type), "%s", info.product_type); - snprintf(dev->display_name, sizeof(dev->display_name), "%s", info.display_name); - }*/ - irecv_device_t device = tui_get_recovery_device(event->device_info->ecid); - if (!device) { - LOG(LOG_WARNING, "Could not get info from device"); - free(dev); - return; - } - snprintf(dev->product_type, sizeof(dev->product_type), "%s", device->product_type); - snprintf(dev->display_name, sizeof(dev->display_name), "%s", device->display_name); - dev->cpid = device->chip_id; - tui_connected_devices = dev; - - if (event->mode == IRECV_K_RECOVERY_MODE_1 || - event->mode == IRECV_K_RECOVERY_MODE_2 || - event->mode == IRECV_K_RECOVERY_MODE_3 || - event->mode == IRECV_K_RECOVERY_MODE_4) { - - dev->mode = TUI_DEVICE_MODE_RECOVERY; - pthread_create(&recovery_thread, NULL, (pthread_start_t)tui_connected_recovery_mode, event->device_info); - } else if (event->mode == IRECV_K_DFU_MODE) { - dev->mode = TUI_DEVICE_MODE_DFU; - pthread_create(&dfu_thread, NULL, (pthread_start_t)tui_connected_dfu_mode, event->device_info); - } - break; - } - case IRECV_DEVICE_REMOVE: { - struct tui_connected_device *cur = tui_connected_devices; - struct tui_connected_device *prev = NULL; - while (cur) { - if (cur->ecid == event->device_info->ecid) { - if (prev) { - prev->next = cur->next; - } else { - tui_connected_devices = cur->next; - } - if (cur->mode == TUI_DEVICE_MODE_RECOVERY) { - LOG(LOG_VERBOSE, "Recovery mode device %" PRIu64 " disconnected", event->device_info->ecid); - pthread_create(&recovery_thread, NULL, (pthread_start_t)tui_disconnected_recovery_mode, event->device_info); - } else if (cur->mode == TUI_DEVICE_MODE_DFU) { - LOG(LOG_VERBOSE, "DFU mode device %" PRIu64 " disconnected", event->device_info->ecid); - pthread_create(&dfu_thread, NULL, (pthread_start_t)tui_disconnected_dfu_mode, event->device_info); - } - free(cur); - break; - } - prev = cur; - cur = cur->next; - } - break; - } - } -} - -void tui_devhelper(void) { - subscribe_cmd(tui_device_event_cb, tui_irecv_device_event_cb); -} - -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/tui_input.c b/src/tui_input.c deleted file mode 100644 index cc6f6b4..0000000 --- a/src/tui_input.c +++ /dev/null @@ -1,166 +0,0 @@ -#ifdef TUI - -#include - -#ifdef __linux__ -#include -#endif - -int tui_mouse_x = 0; -int tui_mouse_y = 0; -int tui_mouse_button = -1; - -int tui_last_event = -1; -int tui_last_input = -1; -sem_t *tui_event_semaphore; -char tui_last_key = 0; - -#ifdef __linux__ -bool using_gpm = false; -#endif - -int tui_get_input(void) { - char c = getc(stdin); - if (c == '\x1b' && getc(stdin) == '[') { - char c3 = getc(stdin); - switch (c3) { - case 'D': - return TUI_INPUT_LEFT; - case 'C': - return TUI_INPUT_RIGHT; - case 'A': - return TUI_INPUT_UP; - case 'B': - return TUI_INPUT_DOWN; - case 'Z': - return TUI_INPUT_TAB_BACK; - case 'M': { - char c4 = getc(stdin); - char c5 = getc(stdin); - char c6 = getc(stdin); - - int new_mouse_x = c5 - 33; - if (new_mouse_x < 0) new_mouse_x += 256; - int new_mouse_y = c6 - 33; - if (new_mouse_y < 0) new_mouse_y += 256; - int mouse_button = c4 & 3; - - if (tui_mouse_x != new_mouse_x || tui_mouse_y != new_mouse_y) { - tui_mouse_x = new_mouse_x; - tui_mouse_y = new_mouse_y; - return TUI_INPUT_MOUSE_MOVE; - } - - if (tui_mouse_button != (c4 & 1)) { - tui_mouse_button = c4 & 1; - if (tui_mouse_button == 0) { - return TUI_INPUT_MOUSE_DOWN; - } else { - return TUI_INPUT_MOUSE_UP; - } - } - - break; - } - } - } - - tui_last_key = c; - - if (c == '\x0d' || c == ' ') { - return TUI_INPUT_SELECT; - } - - if (c == '\t') { - return TUI_INPUT_TAB; - } - - if (c == '\x7f') { - return TUI_INPUT_BACKSPACE; - } - - if (c == '\x1b') { - return TUI_INPUT_ESCAPE; - } - - return TUI_INPUT_NONE; -} - -#ifdef __linux__ -void *tui_gpm_thread(void *arg) { - Gpm_Event event; - while (1) { - if (Gpm_GetEvent(&event) == -1) { - exit(1); - } - tui_mouse_x = event.x - 1; - tui_mouse_y = event.y - 1; - if (event.type & GPM_MOVE) { - tui_last_event = TUI_EVENT_INPUT; - tui_last_input = TUI_INPUT_MOUSE_MOVE; - sem_post(tui_event_semaphore); - } - if (event.buttons & 4) { - if (event.type & GPM_DOWN) { - tui_mouse_button = 1; - tui_last_event = TUI_EVENT_INPUT; - tui_last_input = TUI_INPUT_MOUSE_DOWN; - sem_post(tui_event_semaphore); - } else if (event.type & GPM_UP) { - tui_mouse_button = 0; - tui_last_event = TUI_EVENT_INPUT; - tui_last_input = TUI_INPUT_MOUSE_UP; - sem_post(tui_event_semaphore); - } - continue; - } - } -} -#endif - -void *tui_input_thread(void *arg) { -#ifdef __linux__ - if (strncmp(getenv("TERM"), "linux", 5) == 0) { - Gpm_Connect conn; - Gpm_Event event; - conn.eventMask = GPM_UP | GPM_DOWN; - conn.defaultMask = ~0; - conn.minMod = 0; - conn.maxMod = 0xffff; - if (Gpm_Open(&conn, 0) != -1) { - using_gpm = true; - pthread_t gpm_thread; - pthread_create(&gpm_thread, NULL, tui_gpm_thread, NULL); - } - } -#endif - while (1) { - int input = tui_get_input(); - tui_last_event = TUI_EVENT_INPUT; - tui_last_input = input; - sem_post(tui_event_semaphore); - } - return 0; -} - -int tui_get_event(void) { - sem_wait(tui_event_semaphore); - int last_event = tui_last_event; - tui_last_event = -1; - return last_event; -} - -int tui_try_get_event(void) { - int ret = sem_trywait(tui_event_semaphore); - if (ret == 0) { - int last_event = tui_last_event; - tui_last_event = -1; - return last_event; - } - return -1; -} - -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/tui_main.c b/src/tui_main.c deleted file mode 100644 index eb1f11c..0000000 --- a/src/tui_main.c +++ /dev/null @@ -1,256 +0,0 @@ -#ifdef TUI -#ifdef __APPLE__ -#define _DARWIN_C_SOURCE -#else -#define _DEFAULT_SOURCE -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#ifdef __APPLE__ -int proc_pidpath(int pid, void * buffer, uint32_t buffersize); -char random_sem_name[sizeof("palera1n.tui_event_semaphore") + 16 + 1]; -#endif - -static int tui_state = 0; - -int tui_x_offset = 0; -int tui_y_offset = 0; - -bool supports_bright_colors = true; - -static struct termios saved_termios; - -int redraw_screen(void) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - CLEAR_SCREEN; - MOVETO(0, 0); - - struct winsize w; - ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); - if (w.ws_col < 80 || w.ws_row < 24) { - LOG(LOG_FATAL, "Terminal size must be at least 80x24"); - printf("\033[37;41mERROR: Terminal size must be at least 80x24!"); - fflush(stdout); - return -1; - } - tui_y_offset = (w.ws_row - 24) / 2; - for (int i = 0; i < tui_y_offset; i++) { - printf("\n"); - } - tui_x_offset = (w.ws_col - 80) / 2; - - const char* tui_version = TUI_VERSION; - if (tui_version[0] == 'v') tui_version++; - - tui_draw_rectangle(0, 0, 79, 23); - MOVETOT((int)(80 - (strlen("[palera1n - Version ]") + strlen(tui_version) ) - 1), 1); - printf("[palera1n - Version %s]", tui_version); - SETCOLOR(FG_WHITE, BG_BLACK); - switch(tui_state) { - case MAIN_SCREEN: - tui_screen_main_redraw(); - break; - case OPTIONS_SCREEN: - tui_screen_options_redraw(); - break; - case ENTER_RECOVERY_SCREEN: - tui_screen_enter_recovery_redraw(); - break; - case ENTER_DFU_SCREEN: - tui_screen_enter_dfu_redraw(); - break; - case JAILBREAK_SCREEN: - tui_screen_jailbreak_redraw(); - break; - } - fflush(stdout); - return 0; -} - -static int destroy_window(void) { - if (!tui_started) return 0; - tui_started = false; - tcsetattr(STDIN_FILENO, 0, &saved_termios); - MOUSEOFF; - CLEAR_SCREEN; - - MOVETO(0, 0); - RMCUP; - CNORM; - - return 0; -} - -static int init_window(void) { - setlocale(LC_ALL, NULL); - - tui_started = true; - struct winsize w; - ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); - if (w.ws_col < 80 || w.ws_row < 24) { - tui_started = false; - LOG(LOG_FATAL, "Terminal size must be at least 80x24"); - return -1; - } - LOG(LOG_VERBOSE3, "cols: %d, rows: %d\n", w.ws_col, w.ws_row); - SMCUP; - CIVIS; - fflush(stdout); - struct termios term; - tcgetattr(STDIN_FILENO, &term); - tcgetattr(STDIN_FILENO, &saved_termios); - cfmakeraw(&term); - term.c_lflag |= ISIG; - tcsetattr(STDIN_FILENO, 0, &term); - - MOUSEON; - - return 0; -} - -bool tui_is_restarting = false; - -extern int saved_argc; -extern char** saved_argv; -extern char** saved_envp; - -void tui_terminate(int sig) { - destroy_window(); - if (tui_is_restarting) { -#ifdef __APPLE__ - sem_close(tui_event_semaphore); - sem_unlink(random_sem_name); - char pathbuf[4096]; - if (proc_pidpath(getpid(), pathbuf, sizeof(pathbuf)) <= 0) { - LOG(LOG_FATAL, "Failed to get path of running executable"); - exit(1); - } - - execve(pathbuf, saved_argv, saved_envp); -#elif defined(__linux__) - execve("/proc/self/exe", saved_argv, saved_envp); -#endif - } else { - exit(0); - } -} - -static void resize_handler(int sig) { - redraw_screen(); -} - -int tui(void) { - if (strncmp(getenv("TERM"), "xterm", 5) != 0) { - supports_bright_colors = false; - } - srand(time(NULL)); - int ret = 0; - if ((ret = init_window())) return ret; - signal(SIGINT, tui_terminate); - signal(SIGTERM, tui_terminate); - signal(SIGQUIT, tui_terminate); - signal(SIGWINCH, resize_handler); - -#ifdef __APPLE__ - // generate a 16 character random hex string from urandom - int fd = open("/dev/urandom", O_RDONLY); - if (fd < 0) { - LOG(LOG_FATAL, "Failed to open /dev/urandom"); - return -1; - } - uint8_t random[8]; - if (read(fd, random, 8) != 8) { - LOG(LOG_FATAL, "Failed to read from /dev/urandom"); - return -1; - } - close(fd); - for (int i = 0; i < 8; i++) { - sprintf(&random_sem_name[i * 2], "%02x", random[i]); - } - sem_unlink(random_sem_name); - tui_event_semaphore = sem_open(random_sem_name, O_CREAT, 0644, 0); -#else - tui_event_semaphore = malloc(sizeof(sem_t)); - sem_init(tui_event_semaphore, 0, 0); -#endif - pthread_t input_thread; - pthread_create(&input_thread, NULL, tui_input_thread, NULL); - - tui_devhelper(); - - tui_state = MAIN_SCREEN; - while (1) { - switch (tui_state) { - case ERROR_SCREEN: - case EXIT_SCREEN: - goto out; - break; - case MAIN_SCREEN: - tui_state = tui_screen_main(); - break; - case OPTIONS_SCREEN: - tui_state = tui_screen_options(); - break; - case ENTER_RECOVERY_SCREEN: - tui_state = tui_screen_enter_recovery(); - break; - case ENTER_DFU_SCREEN: - tui_state = tui_screen_enter_dfu(); - break; - case JAILBREAK_SCREEN: - tui_state = tui_screen_jailbreak(); - break; - default: - assert(0); - goto out; - } - } -out: - destroy_window(); - return 0; -} - -void tui_draw_rectangle(int x1, int y1, int x2, int y2) { - if (x1 == x2 || y1 == y2) return; - DSGON; - MOVETOT(x1 + 1, y1 + 1); - printf("%c", 0x6C); - for (int x = x1 + 1; x < x2; x++) { - putchar(0x71); - } - putchar(0x6B); - MOVETOT(x1 + 1, y2 + 1); - putchar(0x6D); - for (int x = x1 + 1; x < x2; x++) { - putchar(0x71); - } - putchar(0x6A); - for (int y = y1 + 1; y < y2; y++) { - PRINTATT(x1 + 1, y + 1, "\x78"); - PRINTATT(x2 + 1, y + 1, "\x78"); - } - DSGOFF; - fflush(stdout); -} - -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/tui_screen_enter_dfu.c b/src/tui_screen_enter_dfu.c deleted file mode 100644 index f463d46..0000000 --- a/src/tui_screen_enter_dfu.c +++ /dev/null @@ -1,473 +0,0 @@ -#ifdef TUI -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -static int tui_enter_dfu_nav_selection = 1; -static bool tui_device_is_entering_dfu = false; -static int tui_enter_dfu_status = 0; - -enum { - DEVICE_TYPE_IPHONE_SE, - DEVICE_TYPE_IPHONE_6S, - DEVICE_TYPE_IPHONE_7_8, - DEVICE_TYPE_IPHONE_X, - DEVICE_TYPE_IPAD, - DEVICE_TYPE_IPOD_TOUCH -} device_type; - -static int tui_product_type_to_device_type(char *product_type) { - if (strcmp(product_type, "iPhone8,1") == 0 || strcmp(product_type, "iPhone8,2") == 0) { - return DEVICE_TYPE_IPHONE_6S; - } - if (strcmp(product_type, "iPhone8,4") == 0) return DEVICE_TYPE_IPHONE_SE; - if (strcmp(product_type, "iPhone9,1") == 0 || strcmp(product_type, "iPhone9,2") == 0 - || strcmp(product_type, "iPhone9,3") == 0 || strcmp(product_type, "iPhone9,4") == 0) { - return DEVICE_TYPE_IPHONE_7_8; - } - if (strcmp(product_type, "iPhone10,1") == 0 || strcmp(product_type, "iPhone10,2") == 0 - || strcmp(product_type, "iPhone10,4") == 0 || strcmp(product_type, "iPhone10,5") == 0) { - return DEVICE_TYPE_IPHONE_7_8; - } - if (strcmp(product_type, "iPhone10,3") == 0 || strcmp(product_type, "iPhone10,6") == 0) { - return DEVICE_TYPE_IPHONE_X; - } - if (strncmp(product_type, "iPad", strlen("iPad")) == 0) { - return DEVICE_TYPE_IPAD; - } - if (strcmp(product_type, "iPod9,1") == 0) { - return DEVICE_TYPE_IPOD_TOUCH; - } - - // Not found - return DEVICE_TYPE_IPHONE_SE; -} - -static int tui_enter_dfu_device_type = DEVICE_TYPE_IPHONE_SE; - -static int tui_enter_dfu_loading_progress = 1; - -static void tui_screen_enter_dfu_nav(void) { - MOVETOT(80 - 22, 23); - printf("%s[ Cancel ]" COLOR(FG_WHITE, BG_BLACK) " %s[ %s ]" COLOR(FG_WHITE, BG_BLACK), - tui_device_is_entering_dfu || tui_enter_dfu_status == 1 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : tui_enter_dfu_nav_selection == 0 ? "\033[30;107m" : ( - ( - tui_mouse_x >= tui_x_offset + 80 - 23 && tui_mouse_x <= tui_x_offset + 80 - 23 + 10 - ) && (tui_mouse_y == tui_y_offset + 22) ? COLOR(FG_BLACK, BG_WHITE) : "" - ), - tui_device_is_entering_dfu || tui_enter_dfu_status == 1 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : tui_enter_dfu_nav_selection == 1 ? "\033[30;107m" : ( - ( - tui_mouse_x >= tui_x_offset + 80 - 12 && tui_mouse_x <= tui_x_offset + 80 - 12 + 10 - ) && (tui_mouse_y == tui_y_offset + 22) ? COLOR(FG_BLACK, BG_WHITE) : "" - ), - tui_enter_dfu_status == 2 ? "Retry" : "Start" - ); -} - -void tui_screen_enter_dfu_redraw(void) { - SETCOLOR(FG_WHITE, BG_BLACK); - switch(tui_enter_dfu_status) { - case 0: - PRINTATT(3, 3, "Time to put the device into DFU mode. Locate the buttons as marked below on"); - PRINTATT(3, 4, "your device and check the instructions on the right *before* clicking Start."); - break; - case 1: - PRINTATT(3, 3, "Device entered DFU mode successfully."); - break; - case 2: - PRINTATT(3, 3, "Whoops, the device didn't enter DFU mode. Click Retry to try again."); - break; - } - - tui_screen_enter_dfu_nav(); - - switch(tui_enter_dfu_device_type) { - case DEVICE_TYPE_IPHONE_SE: - case DEVICE_TYPE_IPAD: - if (tui_enter_dfu_loading_progress > 0 || tui_enter_dfu_status == 2) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } - PRINTATT(51, 6, "1. Click Start"); - if (tui_enter_dfu_loading_progress > 0) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - - if (!tui_device_is_entering_dfu || tui_enter_dfu_loading_progress > 4 || tui_enter_dfu_status == 2) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } - PRINTATT(51, 7, "2. Press and hold the Top and"); - MOVETOT(54, 8); - printf("Home buttons together (%d)", tui_enter_dfu_loading_progress > 4 ? 0 : tui_enter_dfu_loading_progress < 1 ? 4 : 5 - tui_enter_dfu_loading_progress); - if (!tui_device_is_entering_dfu || tui_enter_dfu_loading_progress > 4) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - - if (tui_enter_dfu_loading_progress < 5 || tui_enter_dfu_loading_progress > 14 || tui_enter_dfu_status == 2) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } - PRINTATT(51, 9, "3. Release the Top button BUT"); - PRINTATT(54, 10, "KEEP HOLDING the Home"); - MOVETOT(54, 11); - printf("button (%d)", tui_enter_dfu_loading_progress > 14 ? 0 : tui_enter_dfu_loading_progress < 5 ? 10 : 15 - tui_enter_dfu_loading_progress); - if (tui_enter_dfu_loading_progress < 5 || tui_enter_dfu_loading_progress > 14) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - break; - case DEVICE_TYPE_IPHONE_6S: - if (tui_enter_dfu_loading_progress > 0 || tui_enter_dfu_status == 2) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } - PRINTATT(51, 6, "1. Click Start"); - if (tui_enter_dfu_loading_progress > 0) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - - if (!tui_device_is_entering_dfu || tui_enter_dfu_loading_progress > 4 || tui_enter_dfu_status == 2) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } - PRINTATT(51, 7, "2. Press and hold the Side"); - PRINTATT(54, 8, "and Home buttons together"); - MOVETOT(54, 9); - printf("(%d)", tui_enter_dfu_loading_progress > 4 ? 0 : tui_enter_dfu_loading_progress < 1 ? 4 : 5 - tui_enter_dfu_loading_progress); - if (!tui_device_is_entering_dfu || tui_enter_dfu_loading_progress > 4) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - - if (tui_enter_dfu_loading_progress < 5 || tui_enter_dfu_loading_progress > 14 || tui_enter_dfu_status == 2) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } - PRINTATT(51, 10, "3. Release the Side button"); - PRINTATT(54, 11, "BUT KEEP HOLDING the Home"); - MOVETOT(54, 12); - printf("button (%d)", tui_enter_dfu_loading_progress > 14 ? 0 : tui_enter_dfu_loading_progress < 5 ? 10 : 15 - tui_enter_dfu_loading_progress); - if (tui_enter_dfu_loading_progress < 5 || tui_enter_dfu_loading_progress > 14) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - break; - case DEVICE_TYPE_IPHONE_7_8: - case DEVICE_TYPE_IPHONE_X: - tui_draw_rectangle(17, 5, 33, 21); - PRINTATT(17, 10, "|"); - MOVETOT(5, 11); - printf("%sVolume down-", tui_enter_dfu_loading_progress > 14 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : COLOR(FG_YELLOW, BG_BLACK)); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - putchar('|'); - DSGON; - MOVETOT(35, 10); - putchar(0x78); - DSGOFF; - printf("%s-Side button", tui_enter_dfu_loading_progress > 4 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : COLOR(FG_YELLOW, BG_BLACK)); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - - if (tui_enter_dfu_loading_progress > 0 || tui_enter_dfu_status == 2) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } - PRINTATT(51, 6, "1. Click Start"); - if (tui_enter_dfu_loading_progress > 0) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - - if (!tui_device_is_entering_dfu || tui_enter_dfu_loading_progress > 4 || tui_enter_dfu_status == 2) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } - PRINTATT(51, 7, "2. Press and hold the Side"); - PRINTATT(54, 8, "and Volume down buttons"); - MOVETOT(54, 9); - printf("together (%d)", tui_enter_dfu_loading_progress > 4 ? 0 : tui_enter_dfu_loading_progress < 1 ? 4 : 5 - tui_enter_dfu_loading_progress); - if (!tui_device_is_entering_dfu || tui_enter_dfu_loading_progress > 4) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - - if (tui_enter_dfu_loading_progress < 5 || tui_enter_dfu_loading_progress > 14 || tui_enter_dfu_status == 2) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } - PRINTATT(51, 10, "3. Release the Side button"); - PRINTATT(54, 11, "BUT KEEP HOLDING the"); - MOVETOT(54, 12); - printf("Volume down button (%d)", tui_enter_dfu_loading_progress > 14 ? 0 : tui_enter_dfu_loading_progress < 5 ? 10 : 15 - tui_enter_dfu_loading_progress); - if (tui_enter_dfu_loading_progress < 5 || tui_enter_dfu_loading_progress > 14) { - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - break; - } - - switch(tui_enter_dfu_device_type) { - case DEVICE_TYPE_IPHONE_SE: - tui_draw_rectangle(18, 6, 32, 21); - tui_draw_rectangle(24, 19, 26, 20); - for (int y = 9; y < 20; y++) { - SETCOLOR(FG_BLACK, BG_BRIGHT_BLACK); - PRINTATT(20, y, " "); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - PRINTATT(23, 8, "o ==="); - PRINTATT(18, 11, "|"); - PRINTATT(18, 12, "|"); - MOVETOT(30, 6); - printf("__ %s-Top button", tui_enter_dfu_loading_progress > 4 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : COLOR(FG_YELLOW, BG_BLACK)); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - MOVETOT(31, 20); - printf("%s-Home button", tui_enter_dfu_loading_progress > 14 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : COLOR(FG_YELLOW, BG_BLACK)); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - - break; - case DEVICE_TYPE_IPHONE_6S: - tui_draw_rectangle(17, 5, 33, 21); - tui_draw_rectangle(24, 19, 26, 20); - for (int y = 8; y < 20; y++) { - SETCOLOR(FG_BLACK, BG_BRIGHT_BLACK); - PRINTATT(19, y, " "); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - PRINTATT(23, 7, "o ==="); - PRINTATT(17, 10, "|"); - PRINTATT(17, 11, "|"); - MOVETOT(35, 10); - printf("|%s-Side button", tui_enter_dfu_loading_progress > 4 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : COLOR(FG_YELLOW, BG_BLACK)); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - MOVETOT(30, 20); - printf("%s-Home button", tui_enter_dfu_loading_progress > 14 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : COLOR(FG_YELLOW, BG_BLACK)); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - break; - case DEVICE_TYPE_IPHONE_7_8: - tui_draw_rectangle(24, 19, 26, 20); - for (int y = 8; y < 20; y++) { - SETCOLOR(FG_BLACK, BG_BRIGHT_BLACK); - PRINTATT(19, y, " "); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - PRINTATT(23, 7, "o ==="); - - break; - case DEVICE_TYPE_IPHONE_X: - SETCOLOR(FG_BLACK, BG_BRIGHT_BLACK); - PRINTATT(19, 7, " "); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - printf(" "); - SETCOLOR(FG_BLACK, BG_BRIGHT_BLACK); - printf(" "); - SETCOLOR(FG_BLACK, BG_BRIGHT_BLACK); - for (int y = 8; y < 22; y++) { - PRINTATT(19, y, " "); - } - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - - DSGON; - MOVETOT(35, 11); - putchar(0x78); - DSGOFF; - - break; - case DEVICE_TYPE_IPAD: - tui_draw_rectangle(14, 6, 36, 21); - tui_draw_rectangle(24, 19, 26, 20); - for (int y = 9; y < 20; y++) { - SETCOLOR(FG_BLACK, BG_BRIGHT_BLACK); - PRINTATT(16, y, " "); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - } - PRINTATT(23, 8, "o ==="); - PRINTATT(14, 11, "|"); - PRINTATT(14, 12, "|"); - MOVETOT(33, 6); - printf("__ %s-Top button", tui_enter_dfu_loading_progress > 4 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : COLOR(FG_YELLOW, BG_BLACK)); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - MOVETOT(29, 21); - printf("%s-Home button", tui_enter_dfu_loading_progress > 14 ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : COLOR(FG_YELLOW, BG_BLACK)); - SETCOLOR(FG_BRIGHT_WHITE, BG_BLACK); - - break; - } - fflush(stdout); -} - -// TODO: IMPLEMENT REAL ENTER RECOVERY -static int dfu_time = 0; - -static tui_screen_t tui_enter_dfu(void) { - if (tui_connected_devices && !tui_connected_devices->next) { - if (tui_connected_devices->mode == TUI_DEVICE_MODE_NORMAL) { - tui_enter_dfu_status = 0; - return ENTER_RECOVERY_SCREEN; - } - } - int i = 0; - tui_enter_dfu_loading_progress = 1; - while(1) { - if (++i % 10 == 0) { - tui_enter_dfu_loading_progress++; - } - redraw_screen(); - usleep(100000); - int event = tui_try_get_event(); - if (event == TUI_EVENT_CONNECTED_DEVICES_CHANGED) { - if (tui_connected_devices && !tui_connected_devices->next) { - if (tui_connected_devices->mode == TUI_DEVICE_MODE_RECOVERY || tui_connected_devices->mode == TUI_DEVICE_MODE_NORMAL) { - tui_enter_dfu_status = 2; - tui_device_is_entering_dfu = false; - return ENTER_DFU_SCREEN; - } else { - tui_enter_dfu_status = 1; - tui_device_is_entering_dfu = false; - tui_enter_dfu_loading_progress = 15; - redraw_screen(); - sleep(3); - tui_jailbreak(); - return JAILBREAK_SCREEN; - } - } - } - if (i > 10 * (60 + 15)) { - return MAIN_SCREEN; - } - if (i == 10 * 2) { - exitrecv_cmd(tui_connected_devices->ecid); - } - } - redraw_screen(); - fflush(stdout); - sleep(3); - return JAILBREAK_SCREEN; -} - -static int tui_enter_dfu_nav_mouse_select = -1; - -tui_screen_t tui_screen_enter_dfu(void) { - if (tui_connected_devices && !tui_connected_devices->next) { - tui_enter_dfu_device_type = tui_product_type_to_device_type(tui_connected_devices->product_type); - } - - tui_device_is_entering_dfu = false; - tui_enter_dfu_loading_progress = 0; - tui_enter_dfu_nav_selection = 1; - redraw_screen(); - - tui_device_is_entering_dfu = false; - tui_enter_dfu_loading_progress = 0; - - while(1) { - int event = tui_get_event(); - switch (event) { - case TUI_EVENT_CONNECTED_DEVICES_CHANGED: - break; - case TUI_EVENT_INPUT: { - int input = tui_last_input; - if (input == TUI_INPUT_NONE) continue; - if (tui_device_is_entering_dfu) continue; - - switch (input) { - case TUI_INPUT_LEFT: - case TUI_INPUT_RIGHT: - tui_enter_dfu_nav_selection = !tui_enter_dfu_nav_selection; - redraw_screen(); - break; - case TUI_INPUT_SELECT: - switch(tui_enter_dfu_nav_selection) { - case 0: - return MAIN_SCREEN; - case 1: - tui_device_is_entering_dfu = true; - redraw_screen(); - return tui_enter_dfu(); - } - case TUI_INPUT_MOUSE_MOVE: - tui_screen_enter_dfu_nav(); - fflush(stdout); - break; - case TUI_INPUT_MOUSE_DOWN: - if (tui_mouse_y == tui_y_offset + 22) { - if (tui_mouse_x >= tui_x_offset + 80 - 23 && tui_mouse_x <= tui_x_offset + 80 - 23 + 10) { - tui_enter_dfu_nav_selection = 0; - tui_enter_dfu_nav_mouse_select = 0; - redraw_screen(); - } else if (tui_mouse_x >= tui_x_offset + 80 - 12 && tui_mouse_x <= tui_x_offset + 80 - 12 + 10) { - tui_enter_dfu_nav_selection = 1; - tui_enter_dfu_nav_mouse_select = 1; - redraw_screen(); - } - } - break; - case TUI_INPUT_MOUSE_UP: - if (tui_mouse_y == tui_y_offset + 22) { - if (tui_mouse_x >= tui_x_offset + 80 - 23 && tui_mouse_x <= tui_x_offset + 80 - 23 + 10) { - return MAIN_SCREEN; - } else if (tui_mouse_x >= tui_x_offset + 80 - 12 && tui_mouse_x <= tui_x_offset + 80 - 12 + 10) { - tui_device_is_entering_dfu = true; - redraw_screen(); - return tui_enter_dfu(); - } - } - tui_enter_dfu_nav_mouse_select = -1; - break; - } - break; - } - } - } - return MAIN_SCREEN; -} -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/tui_screen_enter_recovery.c b/src/tui_screen_enter_recovery.c deleted file mode 100644 index 50db9fc..0000000 --- a/src/tui_screen_enter_recovery.c +++ /dev/null @@ -1,209 +0,0 @@ -#ifdef TUI -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int tui_enter_recovery_nav_selection = 1; -bool tui_device_is_entering_recovery = false; -bool tui_enter_recovery_mode_failed = false; - -static void tui_screen_enter_recovery_nav(void) { - MOVETOT(80 - 22, 23); - printf("%s[ Back ]" COLOR(FG_WHITE, BG_BLACK) " %s[ Next ]" COLOR(FG_WHITE, BG_BLACK), - tui_device_is_entering_recovery ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : tui_enter_recovery_nav_selection == 0 ? "\033[30;107m" : ( - ( - tui_mouse_x >= tui_x_offset + 80 - 23 && tui_mouse_x <= tui_x_offset + 80 - 23 + 10 - ) && (tui_mouse_y == tui_y_offset + 22) ? COLOR(FG_BLACK, BG_WHITE) : "" - ), - tui_device_is_entering_recovery ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : tui_enter_recovery_nav_selection == 1 ? "\033[30;107m" : ( - ( - tui_mouse_x >= tui_x_offset + 80 - 12 && tui_mouse_x <= tui_x_offset + 80 - 12 + 10 - ) && (tui_mouse_y == tui_y_offset + 22) ? COLOR(FG_BLACK, BG_WHITE) : "" - ) - ); -} - -static char enter_recovery_loading[9][8] = { - "........", - "|.......", - ".|......", - "..|.....", - "...|....", - "....|...", - ".....|..", - "......|.", - ".......|" -}; - -static char enter_recovery_loading_troll[9][8] = { - ".......", - "t......", - ".r.....", - "..o....", - "...l...", - "....l..", - ".....e.", - "......d", -}; - -static bool is_troll; -static int tui_enter_recovery_loading_progress = 0; - -static void tui_screen_enter_recovery_loading(void) { - SETCOLOR(FG_YELLOW, BG_BLACK); - PRINTATT(3, 8, "Entering recovery mode "); - printf("%.8s", is_troll ? enter_recovery_loading_troll[tui_enter_recovery_loading_progress] : enter_recovery_loading[tui_enter_recovery_loading_progress]); - SETCOLOR(FG_WHITE, BG_BLACK); - fflush(stdout); -} - -void tui_screen_enter_recovery_redraw(void) { - PRINTATT(3, 3, "The device needs to be put into DFU mode to apply the jailbreak. This is a"); - PRINTATT(3, 4, "manual process and we will guide you through it."); - PRINTATT(3, 5, "In order to prevent filesystem corruption through hard reset, the device"); - PRINTATT(3, 6, "will be put into recovery mode first. Click Next when you are ready."); - - if (tui_enter_recovery_mode_failed) { - SETCOLOR(FG_YELLOW, BG_BLACK); - PRINTATT(3, 8, "Hmm... device did not enter recovery mode!? Click Next to try again..."); - SETCOLOR(FG_WHITE, BG_BLACK); - } - - tui_screen_enter_recovery_nav(); - if (tui_device_is_entering_recovery) { - tui_screen_enter_recovery_loading(); - } - - fflush(stdout); -} - -static int recovery_time = 0; - -static tui_screen_t tui_enter_recovery(void) { - enter_recovery_cmd(tui_connected_devices->udid); - is_troll = false; - if (rand() % 1000 == 0) { - is_troll = true; - } - int i = 0; - recovery_time = 0; - while(1) { - redraw_screen(); - tui_enter_recovery_loading_progress++; - tui_enter_recovery_loading_progress %= 9; - // 100ms sleep - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = 100000000; - nanosleep(&ts, NULL); - - int event = tui_try_get_event(); - if (event == TUI_EVENT_CONNECTED_DEVICES_CHANGED) { - if (tui_connected_devices && !tui_connected_devices->next && tui_connected_devices->mode == TUI_DEVICE_MODE_RECOVERY) { - SETCOLOR(FG_YELLOW, BG_BLACK); - PRINTATT(3, 8, "Device is now in recovery mode."); - SETCOLOR(FG_WHITE, BG_BLACK); - fflush(stdout); - - sleep(3); - - return ENTER_DFU_SCREEN; - } - } - if (i > 60 * 10) { - tui_enter_recovery_mode_failed = true; - return ENTER_RECOVERY_SCREEN; - } - } -} - -static int tui_enter_recovery_nav_mouse_select = -1; - -tui_screen_t tui_screen_enter_recovery(void) { - tui_device_is_entering_recovery = false; - tui_enter_recovery_loading_progress = 0; - tui_enter_recovery_nav_selection = 1; - redraw_screen(); - - while(1) { - int event = tui_get_event(); - switch (event) { - case TUI_EVENT_CONNECTED_DEVICES_CHANGED: - tui_enter_recovery_mode_failed = false; - return MAIN_SCREEN; - case TUI_EVENT_INPUT: { - int input = tui_last_input; - if (input == TUI_INPUT_NONE) continue; - if (tui_device_is_entering_recovery) continue; - - switch (input) { - case TUI_INPUT_LEFT: - case TUI_INPUT_RIGHT: - tui_enter_recovery_nav_selection = !tui_enter_recovery_nav_selection; - redraw_screen(); - break; - case TUI_INPUT_SELECT: - switch(tui_enter_recovery_nav_selection) { - case 0: - tui_enter_recovery_mode_failed = false; - return MAIN_SCREEN; - case 1: - tui_device_is_entering_recovery = true; - redraw_screen(); - return tui_enter_recovery(); - } - break; - case TUI_INPUT_MOUSE_MOVE: - tui_screen_enter_recovery_nav(); - fflush(stdout); - break; - case TUI_INPUT_MOUSE_DOWN: - if (tui_mouse_y == tui_y_offset + 22) { - if (tui_mouse_x >= tui_x_offset + 80 - 23 && tui_mouse_x <= tui_x_offset + 80 - 23 + 10) { - tui_enter_recovery_nav_selection = 0; - tui_enter_recovery_nav_mouse_select = 0; - tui_screen_enter_recovery_nav(); - fflush(stdout); - } else if (tui_mouse_x >= tui_x_offset + 80 - 12 && tui_mouse_x <= tui_x_offset + 80 - 12 + 10) { - tui_enter_recovery_nav_selection = 1; - tui_enter_recovery_nav_mouse_select = 1; - tui_screen_enter_recovery_nav(); - fflush(stdout); - } - } - break; - case TUI_INPUT_MOUSE_UP: - if (tui_mouse_y == tui_y_offset + 22) { - if (tui_mouse_x >= tui_x_offset + 80 - 23 && tui_mouse_x <= tui_x_offset + 80 - 23 + 10) { - return MAIN_SCREEN; - } else if (tui_mouse_x >= tui_x_offset + 80 - 12 && tui_mouse_x <= tui_x_offset + 80 - 12 + 10) { - tui_device_is_entering_recovery = true; - redraw_screen(); - return tui_enter_recovery(); - } - } - tui_enter_recovery_nav_mouse_select = -1; - break; - } - break; - } - } - } - tui_enter_recovery_mode_failed = false; - return MAIN_SCREEN; -} -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/tui_screen_jailbreak.c b/src/tui_screen_jailbreak.c deleted file mode 100644 index 7fc5af3..0000000 --- a/src/tui_screen_jailbreak.c +++ /dev/null @@ -1,176 +0,0 @@ -#ifdef TUI -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -bool tui_is_jailbreaking = false; - -static void tui_screen_jailbreak_nav(void) { - if (tui_is_jailbreaking) { - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - } else { - SETCOLOR(FG_BLACK, BG_BRIGHT_WHITE); - } - PRINTATT(80 - 11, 23, "[ Done ]"); - SETCOLOR(FG_WHITE, BG_BLACK); -} - -static pthread_t tui_jailbreak_thread_id; - -int tui_jailbreak_stage = 0; -char *tui_jailbreak_status = NULL; - -void tui_jailbreak_status_changed(void) { - tui_last_event = TUI_EVENT_JAILBREAK_STATUS_CHANGED; - sem_post(tui_event_semaphore); -} - -static void *tui_jailbreak_thread(void *arg) { - tui_jailbreak_stage = 1; - tui_jailbreak_status = "About to execute checkra1n"; - - tui_jailbreak_status_changed(); - - if (!tui_connected_devices || tui_connected_devices->next || tui_connected_devices->mode != TUI_DEVICE_MODE_DFU) { - tui_jailbreak_status = "ERROR: No single device in DFU mode found"; - tui_jailbreak_status_changed(); - pthread_exit(NULL); - return NULL; - } - - tui_jailbreak_stage = 2; - tui_jailbreak_status = "Running exploit"; - tui_jailbreak_status_changed(); - - if (exec_checkra1n() != 0) { - tui_jailbreak_status = "ERROR: Failed to run exploit"; - tui_jailbreak_status_changed(); - pthread_exit(NULL); - return NULL; - } - - tui_jailbreak_stage = 3; - tui_jailbreak_status = "Waiting for PongoOS"; - tui_jailbreak_status_changed(); - - sleep(2); - pthread_create(&pongo_thread, NULL, pongo_helper, NULL); - - // pongo helper will take care of the rest - - pthread_exit(NULL); -} - -void tui_jailbreak(void) { - tui_is_jailbreaking = true; - if (tui_options_verbose_boot) { - palerain_flags |= palerain_option_verbose_boot; - } else { - palerain_flags &= ~palerain_option_verbose_boot; - } - - if (tui_options_safe_mode) { - palerain_flags |= palerain_option_safemode; - } else { - palerain_flags &= ~palerain_option_safemode; - } - - if (tui_options_force_revert) { - palerain_flags |= palerain_option_force_revert; - } else { - palerain_flags &= ~palerain_option_force_revert; - } - - snprintf(palerain_flags_cmd, 0x30, "palera1n_flags 0x%" PRIx64, palerain_flags); - snprintf(xargs_cmd, sizeof(xargs_cmd), "xargs %s", tui_options_boot_args); - - pthread_create(&tui_jailbreak_thread_id, NULL, tui_jailbreak_thread, NULL); -} - -void tui_screen_jailbreak_redraw(void) { - PRINTATT(3, 3, "Installing jailbreak, this will take a moment. If the device asks for a"); - PRINTATT(3, 4, "passcode please enter it. Do not disconnect the device until finished."); - - if (tui_jailbreak_status) { - SETCOLOR(FG_YELLOW, BG_BLACK); - PRINTATT(3, 6, tui_jailbreak_status); - SETCOLOR(FG_WHITE, BG_BLACK); - } - - tui_draw_rectangle(5, 9, 80 - 6, 9 + 2); - MOVETOT(6 + 1, 10 + 1); - SETCOLOR(FG_BLACK, BG_WHITE); - for (int i = 0; i < ((80 - 12) * ((float)tui_jailbreak_stage / 9)); i++) { - putchar(' '); - } - SETCOLOR(FG_WHITE, BG_BLACK); - - tui_screen_jailbreak_nav(); -} - -static int tui_jailbreak_nav_mouse_select = -1; - -tui_screen_t tui_screen_jailbreak(void) { - redraw_screen(); - - while(1) { - int event = tui_get_event(); - switch (event) { - case TUI_EVENT_INPUT: { - int input = tui_last_input; - if (input == TUI_INPUT_NONE) continue; - - switch (input) { - case TUI_INPUT_SELECT: - if (!tui_is_jailbreaking) { - tui_is_restarting = true; - tui_terminate(0); - } - break; - case TUI_INPUT_MOUSE_DOWN: - if (tui_mouse_y == tui_y_offset + 24 - 2 && - tui_mouse_x >= tui_x_offset + 80 - 12 && - tui_mouse_x <= tui_x_offset + 80 - 12 + 10) { - tui_jailbreak_nav_mouse_select = 0; - redraw_screen(); - } - break; - case TUI_INPUT_MOUSE_UP: - if (tui_jailbreak_nav_mouse_select == 0) { - tui_jailbreak_nav_mouse_select = -1; - if (!tui_is_jailbreaking) { - tui_is_restarting = true; - tui_terminate(0); - } - } - break; - } - break; - } - case TUI_EVENT_JAILBREAK_STATUS_CHANGED: - redraw_screen(); - break; - } - } - - return EXIT_SCREEN; -} - -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/tui_screen_main.c b/src/tui_screen_main.c deleted file mode 100644 index cae8a4f..0000000 --- a/src/tui_screen_main.c +++ /dev/null @@ -1,380 +0,0 @@ -#ifdef TUI -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -static int tui_compare_versions(const char *firstVersion, const char *secondVersion); - -static bool showing_ecid = false; - -static char palera1n_logo[17][16] = { -" ++ ", -" #@@# ", -" +@@@@+ ", -" :@@@@@@: ", -" #@@@@@@# ", -" +@@@@@@@@+ ", -" :#*@@@@@@*#: ", -" %###@@@@###% ", -" .####%@@%####. ", -" @############@ ", -"=@@*########*@@=", -"+@@@@%####%@@@@+", -":@@@@%%**%%@@@@:", -" +@@%%*@@*%%@@+ ", -" ++%@@@@%++ ", -" :++: " -}; - -static char random_quotes[][150] = { - "panic(cpu 1 caller 0xfffffff0232bd958): SEP Panic", - "Now with Apple TV support!", - "checkra1n will open source in 2020", - "Try running palera1n on a Intel 80486!", - "\"iOS 15 with SSV is unhackable\", but here we are.", - "initproc exited -- exit reason namespace 1 subcode0x7 description: none", - "totally not checkra1n", - "Because the command line wasn't easy enough", - "Checkra1n wrapper?", - "" -}; - -#define PALERA1N_URL "https://palera.in" - -static int tui_main_nav_selection = 1; -static bool quick_mode_enabled = false; -static bool tui_can_start = false; -static int random_quote; - -bool easter_egg = false; - -void tui_screen_main_nav(void) { - MOVETOT(80 - 52, 23); - printf("[%c] %sQuick Mode " COLOR(FG_WHITE, BG_BLACK) " %s[ Options ]" COLOR(FG_WHITE, BG_BLACK) " %s[ Start ]" COLOR(FG_WHITE, BG_BLACK) " %s[ Quit ]" COLOR(FG_WHITE, BG_BLACK), quick_mode_enabled ? 'x' : ' ', - tui_main_nav_selection == 0 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : ( - ( - tui_mouse_x >= tui_x_offset + 80 - 49 && tui_mouse_x <= tui_x_offset + 80 - 49 + 10 - ) && (tui_mouse_y == tui_y_offset + 22) ? COLOR(FG_BLACK, BG_WHITE) : "" - ), - tui_main_nav_selection == 1 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : ( - ( - tui_mouse_x >= tui_x_offset + 80 - 37 && tui_mouse_x <= tui_x_offset + 80 - 37 + 10 - ) && (tui_mouse_y == tui_y_offset + 22) ? COLOR(FG_BLACK, BG_WHITE) : "" - ), - tui_main_nav_selection == 2 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : !tui_can_start ? (supports_bright_colors ? COLOR(FG_BRIGHT_BLACK, BG_BLACK) : COLOR(FG_BLUE, BG_BLACK)) : ( - ( - tui_mouse_x >= tui_x_offset + 80 - 25 && tui_mouse_x <= tui_x_offset + 80 - 25 + 10 - ) && (tui_mouse_y == tui_y_offset + 22) ? COLOR(FG_BLACK, BG_WHITE) : "" - ), - tui_main_nav_selection == 3 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : ( - ( - tui_mouse_x >= tui_x_offset + 80 - 13 && tui_mouse_x <= tui_x_offset + 80 - 13 + 10 - ) && (tui_mouse_y == tui_y_offset + 22) ? COLOR(FG_BLACK, BG_WHITE) : "" - ) - ); -} - -void tui_screen_main_redraw(void) { - PRINTATT(3, 2, "Welcome to palera1n!"); - - SETCOLOR(FG_WHITE, BG_BLACK); - PRINTATT(3, 9, "Made by: Nick Chan, Ploosh, Khcrysalis, Mineek"); - PRINTATT(3, 10, "staturnz, kok3shidoll, "); - if ((tui_mouse_y == tui_y_offset + 9 && tui_mouse_x >= tui_x_offset + 25 && tui_mouse_x <= tui_x_offset + 25 + 8) || easter_egg) { - SETCOLORA(FG_BRIGHT_WHITE, BG_BLACK, BOLD); - } - printf("HAHALOSAH"); - RESETFONT; - SETCOLOR(FG_WHITE, BG_BLACK); - PRINTATT(3, 12, "Thanks to: llsc12, nebula,"); - PRINTATT(3, 13, "nikias (libimobiledevice), checkra1n"); - PRINTATT(3, 14, "(Siguza, axi0mx, littlelailo et al.), Procursus"); - PRINTATT(3, 15, "Team (Hayden Seay, Cameron Katri, Keto et.al),"); - PRINTATT(80 - (int)sizeof(PALERA1N_URL), 21, PALERA1N_URL); - PRINTATT(80 - (int)sizeof("@palera1n"), 20, "@palera1n"); - PRINTATT(3, 20, "With <3 from HAHALOSAH"); - PRINTATT(3, 21, "Note: Backup your stuff. Use at your own risk."); - DRAWLINET(2, 22, 78); - DRAWLINET(2, 3, 50); - - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - DRAWLINET(2, 11, 50); - DRAWLINET(2, 16, 50); - - for (int y = 0; y < 16; y++) { - PRINTATLENT(80 - 22, y + 4, palera1n_logo[y], 16); - } - - SETCOLOR(FG_YELLOW, BG_BLACK); - if (tui_connected_devices == NULL) { - PRINTATT(3, 5, "Connect your iPhone, iPad, iPod Touch, or Apple"); - PRINTATT(3, 6, "TV to begin."); - tui_can_start = false; - } else if (tui_connected_devices->next != NULL) { - PRINTATT(3, 5, "Please attach only one device."); - tui_can_start = false; - } else { - if (strlen(tui_connected_devices->display_name) == 0) { - PRINTATT(3, 5, "ERROR: Failed to open device in recovery/DFU mode"); - PRINTATT(3, 6, "Please reopen palera1n and try again."); - } else if (tui_connected_devices->mode == TUI_DEVICE_MODE_NORMAL) { - MOVETOT(3, 5); - int ecid_y; - if (!tui_connected_devices->arm64) { - printf("Sorry, %s (iOS %s) is not supported.", tui_connected_devices->display_name, tui_connected_devices->version); - ecid_y = 6; - tui_can_start = false; - } else if (tui_compare_versions(tui_connected_devices->version, "15.0") < 0) { - printf("Sorry, %s is supported, but iOS", tui_connected_devices->display_name); - MOVETOT(3, 6); - printf("%s is not.", tui_connected_devices->version); - PRINTATT(3, 7, "Supported versions are 15.0+"); - ecid_y = 8; - tui_can_start = false; - } else if (tui_connected_devices->requires_passcode_disabled) { - printf("Sorry, this devices passcode must be disabled on %s.", tui_connected_devices->version); - MOVETOT(3, 6); - printf("On 16.0+, you must reset the phone to factory settings"); - MOVETOT(3, 7); - printf("and not have a passcode enabled ever since last restore."); - ecid_y = 8; - tui_can_start = false; - } else { - printf("%s (%s) connected in Normal mode.", tui_connected_devices->display_name, tui_connected_devices->version); - ecid_y = 6; - tui_can_start = true; - } - if (showing_ecid) { - MOVETOT(3, ecid_y); - printf("ECID: 0x%" PRIx64 " ", tui_connected_devices->ecid); - } else { - PRINTATT(3, ecid_y, "Press (E) to show ECID."); - } - } else if (tui_connected_devices->mode == TUI_DEVICE_MODE_RECOVERY) { - MOVETOT(3, 5); - printf("%s connected in Recovery mode.", tui_connected_devices->display_name); - if (showing_ecid) { - MOVETOT(3, 6); - printf("ECID: 0x%" PRIx64 " ", tui_connected_devices->ecid); - } else { - PRINTATT(3, 6, "Press (E) to show ECID."); - } - PRINTATT(3, 7, "NOTE: Ensure installed iOS is in range 15.0+"); - tui_can_start = true; - } else if (tui_connected_devices->mode == TUI_DEVICE_MODE_DFU) { - MOVETOT(3, 5); - printf("%s connected in DFU mode.", tui_connected_devices->display_name); - if (showing_ecid) { - MOVETOT(3, 6); - printf("ECID: 0x%" PRIx64 " ", tui_connected_devices->ecid); - } else { - PRINTATT(3, 6, "Press (E) to show ECID."); - } -#ifdef DEV_BUILD - tui_can_start = true; -#else - PRINTATT(3, 7, "Please connect device in Normal/Recovery mode"); - PRINTATT(3, 8, "or run palera1n in CLI mode"); - tui_can_start = false; -#endif - } - } - - if (!tui_can_start && tui_main_nav_selection == 2) { - tui_main_nav_selection = 1; - } - - SETCOLOR(FG_WHITE, BG_BLACK); - - for (int y = 0; y < 3; y++) { - PRINTATLEN(tui_x_offset + 3, tui_y_offset + 17 + y, random_quotes[random_quote] + y * 50, 50); - } - - tui_screen_main_nav(); - fflush(stdout); -} - -static int tui_main_nav_mouse_select = -1; - -tui_screen_t tui_screen_main(void) { - random_quote = ((unsigned int)((rand()+rand())/2)) % 8; - redraw_screen(); - - while(1) { - int event = tui_get_event(); - switch (event) { - case TUI_EVENT_CONNECTED_DEVICES_CHANGED: - redraw_screen(); - break; - case TUI_EVENT_INPUT: { - int input = tui_last_input; - - switch (input) { - case TUI_INPUT_NONE: - if (tui_last_key == 'E' || tui_last_key == 'e') { - showing_ecid = !showing_ecid; - tui_screen_main_redraw(); - } - break; - case TUI_INPUT_LEFT: - case TUI_INPUT_TAB_BACK: - if (--tui_main_nav_selection == -1) tui_main_nav_selection = 3; - if (tui_main_nav_selection == 2 && !tui_can_start) tui_main_nav_selection = 1; - tui_screen_main_nav(); - fflush(stdout); - break; - case TUI_INPUT_RIGHT: - case TUI_INPUT_TAB: - if (++tui_main_nav_selection == 4) tui_main_nav_selection = 0; - if (tui_main_nav_selection == 2 && !tui_can_start) tui_main_nav_selection = 3; - tui_screen_main_nav(); - fflush(stdout); - break; - case TUI_INPUT_SELECT: - switch(tui_main_nav_selection) { - case 0: - quick_mode_enabled = !quick_mode_enabled; - tui_screen_main_nav(); - fflush(stdout); - break; - case 1: - return OPTIONS_SCREEN; - case 2: - if (tui_can_start) { - if (tui_connected_devices->mode == TUI_DEVICE_MODE_NORMAL) { - return ENTER_RECOVERY_SCREEN; - } else if (tui_connected_devices->mode == TUI_DEVICE_MODE_RECOVERY) { - return ENTER_DFU_SCREEN; - } else if (tui_connected_devices->mode == TUI_DEVICE_MODE_DFU) { - tui_jailbreak(); - return JAILBREAK_SCREEN; - } - } - break; - case 3: - return EXIT_SCREEN; - } - break; - case TUI_INPUT_MOUSE_MOVE: - tui_screen_main_redraw(); - break; - case TUI_INPUT_MOUSE_DOWN: - if ((tui_mouse_y == tui_y_offset + 9 && tui_mouse_x >= tui_x_offset + 25 && tui_mouse_x <= tui_x_offset + 25 + 8)) { - easter_egg = true; - break; - } - if (tui_mouse_y == tui_y_offset + 22) { - if (tui_mouse_x >= tui_x_offset + 80 - 49 && tui_mouse_x <= tui_x_offset + 80 - 49 + 10) { - tui_main_nav_selection = 0; - tui_main_nav_mouse_select = 0; - } else if (tui_mouse_x >= tui_x_offset + 80 - 37 && tui_mouse_x <= tui_x_offset + 80 - 37 + 10) { - tui_main_nav_selection = 1; - tui_main_nav_mouse_select = 1; - } else if (tui_mouse_x >= tui_x_offset + 80 - 25 && tui_mouse_x <= tui_x_offset + 80 - 25 + 10) { - if (tui_can_start) { - tui_main_nav_selection = 2; - tui_main_nav_mouse_select = 2; - } - } else if (tui_mouse_x >= tui_x_offset + 80 - 13 && tui_mouse_x <= tui_x_offset + 80 - 13 + 10) { - tui_main_nav_selection = 3; - tui_main_nav_mouse_select = 3; - } - tui_screen_main_nav(); - fflush(stdout); - } - break; - case TUI_INPUT_MOUSE_UP: - if (tui_mouse_y == tui_y_offset + 22) { - if (tui_mouse_x >= tui_x_offset + 80 - 49 && tui_mouse_x <= tui_x_offset + 80 - 49 + 10 && tui_main_nav_mouse_select == 0) { - quick_mode_enabled = !quick_mode_enabled; - redraw_screen(); - } else if (tui_mouse_x >= tui_x_offset + 80 - 37 && tui_mouse_x <= tui_x_offset + 80 - 37 + 10 && tui_main_nav_mouse_select == 1) { - return OPTIONS_SCREEN; - } else if (tui_mouse_x >= tui_x_offset + 80 - 25 && tui_mouse_x <= tui_x_offset + 80 - 25 + 10 && tui_main_nav_mouse_select == 2) { - if (tui_can_start) { - if (tui_connected_devices->mode == TUI_DEVICE_MODE_NORMAL) { - return ENTER_RECOVERY_SCREEN; - } else if (tui_connected_devices->mode == TUI_DEVICE_MODE_RECOVERY) { - return ENTER_DFU_SCREEN; - } else if (tui_connected_devices->mode == TUI_DEVICE_MODE_DFU) { - tui_jailbreak(); - return JAILBREAK_SCREEN; - } - } - } else if (tui_mouse_x >= tui_x_offset + 80 - 13 && tui_mouse_x <= tui_x_offset + 80 - 13 + 10 && tui_main_nav_mouse_select == 3) { - return EXIT_SCREEN; - } - } - tui_main_nav_mouse_select = -1; - break; - } - break; - } - } - - } - - return MAIN_SCREEN; -} - -static int tui_version_extract_component(const char *version, int index) { - int component = 0; - int componentIndex = 0; - for (int i = 0; version[i] != '\0'; i++) { - if (version[i] == '.') { - componentIndex++; - if (componentIndex > index) { - break; - } - continue; - } - if (componentIndex == index) { - component *= 10; - component += version[i] - '0'; - } - } - return component; -} - -static int tui_compare_versions(const char *firstVersion, const char *secondVersion) { - if (strcmp(firstVersion, secondVersion) == 0) { - return 0; - } - - int firstVersionMajor = tui_version_extract_component(firstVersion, 0); - int firstVersionMinor = tui_version_extract_component(firstVersion, 1); - int firstVersionPatch = tui_version_extract_component(firstVersion, 2); - - int secondVersionMajor = tui_version_extract_component(secondVersion, 0); - int secondVersionMinor = tui_version_extract_component(secondVersion, 1); - int secondVersionPatch = tui_version_extract_component(secondVersion, 2); - - if (firstVersionMajor != secondVersionMajor) { - return firstVersionMajor - secondVersionMajor; - } - - if (firstVersionMinor != secondVersionMinor) { - return firstVersionMinor - secondVersionMinor; - } - - return firstVersionPatch - secondVersionPatch; -} - -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/tui_screen_options.c b/src/tui_screen_options.c deleted file mode 100644 index e01ac72..0000000 --- a/src/tui_screen_options.c +++ /dev/null @@ -1,349 +0,0 @@ -#ifdef TUI -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -static int tui_options_nav_selection = 0; -static int tui_options_nav_mouse_select = 0; - -static bool tui_options_allow_untested = false; -bool tui_options_safe_mode = false; -bool tui_options_verbose_boot = false; -bool tui_options_force_revert = false; -bool tui_options_flower_chain = true; - -bool tui_options_is_editing_boot_args = false; - -char tui_options_boot_args[0x1e0 + 1] = {0}; - -int tui_options_boot_args_cursor = 0; -int tui_options_boot_args_offset = 0; - -void tui_screen_options_nav(void) { - SETCOLOR(FG_WHITE, BG_BLACK); - MOVETOT(80 - 11, 23); - printf("%s[ Back ]" COLOR(FG_WHITE, BG_BLACK), - tui_options_nav_selection == 0 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : ( - ( - tui_mouse_x >= tui_x_offset + 80 - 12 && tui_mouse_x <= tui_x_offset + 80 - 12 + 10 - ) && (tui_mouse_y == tui_y_offset + 22) ? COLOR(FG_BLACK, BG_WHITE) : "" - ) - ); -#ifdef DEV_BUILD - PRINTATT(3, 23, "DEV_BUILD"); -#endif -} - -extern bool easter_egg; - -void tui_screen_options_options(void) { - SETCOLOR( FG_BRIGHT_BLACK, BG_BLACK); - MOVETOT(3, 8); - printf("[%c] %sAllow untested iOS/iPadOS versions" COLOR(FG_WHITE, BG_BLACK), - tui_options_allow_untested ? ' ' : ' ', - COLOR(FG_BLACK, FG_BRIGHT_BLACK)); - SETCOLOR(FG_WHITE, BG_BLACK); - MOVETOT(3, 9); - printf("[%c] %sSafe Mode " COLOR(FG_WHITE, BG_BLACK), - tui_options_safe_mode ? 'x' : ' ', - tui_options_nav_selection == 1 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : ( - ( - tui_mouse_x >= tui_x_offset + 5 && tui_mouse_x <= tui_x_offset + 5 + 34 - ) && (tui_mouse_y == tui_y_offset + 8) ? COLOR(FG_BLACK, BG_WHITE) : "" - )); - MOVETOT(3, 10); - printf("[%c] %sVerbose Boot " COLOR(FG_WHITE, BG_BLACK), - tui_options_verbose_boot ? 'x' : ' ', - tui_options_nav_selection == 2 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : ( - ( - tui_mouse_x >= tui_x_offset + 5 && tui_mouse_x <= tui_x_offset + 5 + 34 - ) && (tui_mouse_y == tui_y_offset + 9) ? COLOR(FG_BLACK, BG_WHITE) : "" - )); - MOVETOT(3, 11); - printf("[%c] %sForce Revert " COLOR(FG_WHITE, BG_BLACK), - tui_options_force_revert ? 'x' : ' ', - tui_options_nav_selection == 3 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : ( - ( - tui_mouse_x >= tui_x_offset + 5 && tui_mouse_x <= tui_x_offset + 5 + 34 - ) && (tui_mouse_y == tui_y_offset + 10) ? COLOR(FG_BLACK, BG_WHITE) : "" - )); - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - DRAWLINET(3, 13, 76); - SETCOLOR(FG_WHITE, BG_BLACK); - MOVETOT(7, 15); - printf("%sBoot Arguments: " COLOR(FG_WHITE, BG_BLACK), - tui_options_nav_selection == 4 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : ( - ( - tui_mouse_x >= tui_x_offset + 5 && tui_mouse_x <= tui_x_offset + 5 + 34 - ) && ( - tui_mouse_y == tui_y_offset + 14 || tui_mouse_y == tui_y_offset + 15 - ) ? COLOR(FG_BLACK, BG_WHITE) : "" - )); - const char* boot_args_hint = tui_options_is_editing_boot_args ? "(press ENTER when done)" : " (press ENTER to edit)"; - MOVETOT((int)(80 - 5 - strlen(boot_args_hint)), 15); - printf("%s", boot_args_hint); - MOVETOT(3, 17); - printf("[%c] %s%s " COLOR(FG_WHITE, BG_BLACK), - tui_options_flower_chain ? 'x' : ' ', - tui_options_nav_selection == 5 ? COLOR(FG_BLACK, BG_BRIGHT_WHITE) : ( - ( - tui_mouse_x >= tui_x_offset + 5 && tui_mouse_x <= tui_x_offset + 5 + 34 - ) && (tui_mouse_y == tui_y_offset + 16) ? COLOR(FG_BLACK, BG_WHITE) : "" - ), easter_egg ? "Neko Chain " : "Flower Chain"); - - MOVETOT(7, 16); - if (supports_bright_colors) { - SETCOLOR(tui_options_is_editing_boot_args ? FG_YELLOW : FG_WHITE, BG_BRIGHT_BLACK); - } else { - SETCOLOR(tui_options_is_editing_boot_args ? FG_YELLOW : FG_WHITE, BG_BLUE); - } - int boot_args_len = strlen(tui_options_boot_args); - - if ((tui_options_boot_args_cursor - tui_options_boot_args_offset) > (68 - 1)) { - tui_options_boot_args_offset += (tui_options_boot_args_cursor - tui_options_boot_args_offset) - (68 - 1); - } - if ((tui_options_boot_args_cursor - tui_options_boot_args_offset) < 0) { - tui_options_boot_args_offset = tui_options_boot_args_cursor; - } - if ((tui_options_boot_args_offset + 68 - 1) > boot_args_len && boot_args_len >= 68 - 1) { - tui_options_boot_args_offset = boot_args_len - 68 + 1; - } - - for (int i = 0; i < 68; i++) { - putchar(((i + tui_options_boot_args_offset) < boot_args_len) ? tui_options_boot_args[i + tui_options_boot_args_offset] : ' '); - } - - if (tui_options_is_editing_boot_args) { - MOVETOT((int)(7 + tui_options_boot_args_cursor - tui_options_boot_args_offset), 16); - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_YELLOW); - } else { - SETCOLOR(FG_BLUE, BG_YELLOW); - } - putchar(tui_options_boot_args_cursor < boot_args_len ? tui_options_boot_args[tui_options_boot_args_cursor] : ' '); - } - - SETCOLOR(FG_WHITE, BG_BLACK); - MOVETOT(5, 16); - printf(tui_options_boot_args_offset > 0 ? "<<" : " "); - MOVETOT(75, 16); - printf((strlen(tui_options_boot_args) - tui_options_boot_args_offset) > 68 ? ">>" : " "); -} - -void tui_screen_options_redraw(void) { - SETCOLOR(FG_WHITE, BG_BLACK); - PRINTATT(3, 3, "You may set the following options. If you don't know what they mean you'll"); - PRINTATT(3, 4, "probably have no reason to set them."); - if (supports_bright_colors) { - SETCOLOR(FG_BRIGHT_BLACK, BG_BLACK); - } else { - SETCOLOR(FG_BLUE, BG_BLACK); - } - DRAWLINET(3, 6, 76); - tui_screen_options_nav(); - tui_screen_options_options(); - fflush(stdout); -} - -tui_screen_t tui_screen_options(void) { - redraw_screen(); - - while(1) { - int event = tui_get_event(); - if (event != TUI_EVENT_INPUT) continue; - int input = tui_last_input; - - switch (input) { - case TUI_INPUT_DOWN: - case TUI_INPUT_TAB: - if (tui_options_is_editing_boot_args) break; - if (++tui_options_nav_selection > 5) tui_options_nav_selection = 0; - tui_screen_options_nav(); - tui_screen_options_options(); - fflush(stdout); - break; - case TUI_INPUT_UP: - case TUI_INPUT_TAB_BACK: - if (tui_options_is_editing_boot_args) break; - if (--tui_options_nav_selection < 0) tui_options_nav_selection = 5; - tui_screen_options_nav(); - tui_screen_options_options(); - fflush(stdout); - break; - case TUI_INPUT_SELECT: - if (tui_options_is_editing_boot_args && tui_last_key == ' ' && tui_options_boot_args[strlen(tui_options_boot_args)] == '\x00') { - size_t max_len = sizeof(tui_options_boot_args) - 1; - size_t len = strlen(tui_options_boot_args); - if (len >= max_len) { - break; - } - tui_options_boot_args[len] = ' '; - tui_options_boot_args[len + 1] = '\x00'; - tui_options_boot_args_cursor++; - tui_screen_options_options(); - fflush(stdout); - break; - } - switch(tui_options_nav_selection) { - case 0: - return MAIN_SCREEN; - // case 1: - // tui_options_allow_untested = !tui_options_allow_untested; - // break; - case 1: - tui_options_safe_mode = !tui_options_safe_mode; - break; - case 2: - tui_options_verbose_boot = !tui_options_verbose_boot; - break; - case 3: - tui_options_force_revert = !tui_options_force_revert; - break; - case 4: - tui_options_is_editing_boot_args = !tui_options_is_editing_boot_args; - tui_options_boot_args_cursor = tui_options_is_editing_boot_args ? strlen(tui_options_boot_args) : 0; - break; - case 5: - tui_options_flower_chain = !tui_options_flower_chain; - break; - } - tui_screen_options_nav(); - tui_screen_options_options(); - fflush(stdout); - break; - case TUI_INPUT_MOUSE_MOVE: - tui_screen_options_nav(); - tui_screen_options_options(); - fflush(stdout); - break; - case TUI_INPUT_MOUSE_DOWN: - if (tui_mouse_y == tui_y_offset + 24 - 2 && - tui_mouse_x >= tui_x_offset + 80 - 12 && - tui_mouse_x <= tui_x_offset + 80 - 12 + 10) { - tui_options_nav_selection = 0; - tui_options_nav_mouse_select = 0; - redraw_screen(); - } - -#define MOUSEDOWN_HANDLER(y, val) \ - if (tui_mouse_y == tui_y_offset + y && \ - tui_mouse_x >= tui_x_offset + 5 - 4 && \ - tui_mouse_x <= tui_x_offset + 5 + 34) { \ - tui_options_nav_selection = val; \ - tui_options_nav_mouse_select = val; \ - tui_screen_options_nav(); \ - tui_screen_options_options(); \ - fflush(stdout); \ - } - - if (!tui_options_is_editing_boot_args) { - MOUSEDOWN_HANDLER(8, 1); - MOUSEDOWN_HANDLER(9, 2); - MOUSEDOWN_HANDLER(10, 3); - MOUSEDOWN_HANDLER(16, 5); - } - - MOUSEDOWN_HANDLER(14, 4); - MOUSEDOWN_HANDLER(15, 4); - -#undef MOUSEDOWN_HANDLER - break; - case TUI_INPUT_MOUSE_UP: - if (tui_mouse_y == tui_y_offset + 24 - 2 && - tui_mouse_x >= tui_x_offset + 80 - 12 && - tui_mouse_x <= tui_x_offset + 80 - 12 + 10 && - tui_options_nav_mouse_select == 0) { - return MAIN_SCREEN; - } - -#define MOUSEUP_HANDLER(y, val, option, e) \ - if (tui_mouse_y == tui_y_offset + y && \ - tui_mouse_x >= tui_x_offset + 5 - 4 && \ - tui_mouse_x <= tui_x_offset + 5 + 34 && \ - tui_options_nav_mouse_select == val) { \ - tui_options_##option = !tui_options_##option; \ - e \ - tui_screen_options_nav(); \ - tui_screen_options_options(); \ - fflush(stdout); \ - } - - if (!tui_options_is_editing_boot_args) { - MOUSEUP_HANDLER(8, 1, safe_mode, ); - MOUSEUP_HANDLER(9, 2, verbose_boot, ); - MOUSEUP_HANDLER(10, 3, force_revert, ); - MOUSEUP_HANDLER(16, 5, flower_chain, ); - } - - #define BOOTARGS_HANDLER \ - tui_options_boot_args_cursor = tui_options_is_editing_boot_args ? strlen(tui_options_boot_args) : 0; - - MOUSEUP_HANDLER(14, 4, is_editing_boot_args, BOOTARGS_HANDLER); - MOUSEUP_HANDLER(15, 4, is_editing_boot_args, BOOTARGS_HANDLER); -#undef MOUSEUP_HANDLER - tui_options_nav_mouse_select = -1; - break; - case TUI_INPUT_BACKSPACE: - if (tui_options_is_editing_boot_args && tui_options_boot_args_cursor > 0) { - memmove(tui_options_boot_args + tui_options_boot_args_cursor - 1, tui_options_boot_args + tui_options_boot_args_cursor, strlen(tui_options_boot_args) - tui_options_boot_args_cursor); - tui_options_boot_args[strlen(tui_options_boot_args) - 1] = '\x00'; - tui_options_boot_args_cursor--; - tui_screen_options_options(); - fflush(stdout); - } - break; - case TUI_INPUT_NONE: - if (tui_options_is_editing_boot_args && tui_options_boot_args[strlen(tui_options_boot_args)] == '\x00') { - size_t max_len = sizeof(tui_options_boot_args) - 1; - size_t len = strlen(tui_options_boot_args); - if (len >= max_len) { - break; - } - memmove(tui_options_boot_args + tui_options_boot_args_cursor + 1, tui_options_boot_args + tui_options_boot_args_cursor, strlen(tui_options_boot_args) - tui_options_boot_args_cursor); - tui_options_boot_args[tui_options_boot_args_cursor] = tui_last_key; - tui_options_boot_args[len + 1] = '\x00'; - tui_options_boot_args_cursor++; - tui_screen_options_options(); - fflush(stdout); - } - break; - case TUI_INPUT_LEFT: - if (tui_options_is_editing_boot_args) { - if (tui_options_boot_args_cursor > 0) { - tui_options_boot_args_cursor--; - tui_screen_options_options(); - fflush(stdout); - } - } - break; - case TUI_INPUT_RIGHT: - if (tui_options_is_editing_boot_args) { - if (tui_options_boot_args_cursor < (int)strlen(tui_options_boot_args)) { - tui_options_boot_args_cursor++; - tui_screen_options_options(); - fflush(stdout); - } - } - break; - } - } -} - -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/ui/app.cpp b/src/ui/app.cpp new file mode 100644 index 0000000..3b521a2 --- /dev/null +++ b/src/ui/app.cpp @@ -0,0 +1,23 @@ +#ifdef WITH_GUI +#include "app.hpp" +#include +#include "../utils/constants.h" + +bool PalerainApp::OnInit() { + auto* frame = new wxFrame( + nullptr, + wxID_ANY, + "palera1n - Version " + wxString(PALERAIN_VERSION), + wxDefaultPosition, + wxSize(480, 360), + wxDEFAULT_FRAME_STYLE & ~(wxMAXIMIZE_BOX | wxRESIZE_BORDER) + ); + + new wxStaticText(frame, wxID_ANY, "my cute ui", wxPoint(10, 10)); + + frame->Show(true); + return true; +} + +wxIMPLEMENT_APP_NO_MAIN(PalerainApp); +#endif // WITH_GUI diff --git a/src/ui/app.hpp b/src/ui/app.hpp new file mode 100644 index 0000000..4d70423 --- /dev/null +++ b/src/ui/app.hpp @@ -0,0 +1,10 @@ +#ifdef WITH_GUI +#pragma once +#include + +class PalerainApp : public wxApp { +public: + bool OnInit() override; +}; + +#endif // WITH_GUI diff --git a/src/usb.xml b/src/usb.xml deleted file mode 100644 index 24e1c53..0000000 --- a/src/usb.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - platform-application - - com.apple.private.security.no-container - - com.apple.security.iokit-user-client-class - - IOUserClient - - - diff --git a/src/usb_iokit.c b/src/usb_iokit.c deleted file mode 100644 index e797995..0000000 --- a/src/usb_iokit.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - * pongoOS - https://checkra.in - * - * Copyright (C) 2019-2022 checkra1n team - * - * This file is part of pongoOS. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ -#ifndef USE_LIBUSB -#include -#include // open -#include -#include -#include -#include -#include // exit, strtoull -#include // strlen, strerror, memcpy, memmove -#include // close -#include -#include // mmap, munmap -#include // fstst -#include - -#include -#include - -#define ERR(...) LOG(LOG_VERBOSE, __VA_ARGS__) - -const char *usb_strerror(usb_ret_t err) -{ - return mach_error_string(err); -} - -usb_ret_t USBControlTransfer(usb_device_handle_t handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint32_t wLength, void *data, uint32_t *wLenDone) -{ - IOUSBDevRequest request = - { - .bmRequestType = bmRequestType, - .bRequest = bRequest, - .wValue = wValue, - .wIndex = wIndex, - .wLength = wLength, - .pData = data, - }; - usb_ret_t ret = (*handle)->ControlRequest(handle, 0, &request); - if(wLenDone) *wLenDone = request.wLenDone; - return ret; -} - -usb_ret_t USBBulkUpload(usb_device_handle_t handle, void *data, uint32_t len) -{ - return (*handle)->WritePipe(handle, 2, data, len); -} - -static void FoundDevice(void *refCon, io_iterator_t it) -{ - stuff_t *stuff = refCon; - if(stuff->regID) - { - return; - } - io_service_t usbDev = MACH_PORT_NULL; - while((usbDev = IOIteratorNext(it))) - { - uint64_t regID; - kern_return_t ret = IORegistryEntryGetRegistryEntryID(usbDev, ®ID); - if(ret != KERN_SUCCESS) - { - ERR("IORegistryEntryGetRegistryEntryID: %s", mach_error_string(ret)); - goto next; - } - SInt32 score = 0; - IOCFPlugInInterface **plugin = NULL; - ret = IOCreatePlugInInterfaceForService(usbDev, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &score); - if(ret != KERN_SUCCESS) - { - ERR("IOCreatePlugInInterfaceForService(usbDev): %s", mach_error_string(ret)); - goto next; - } - HRESULT result = (*plugin)->QueryInterface(plugin, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID*)&stuff->dev); - (*plugin)->Release(plugin); - if(result != 0) - { - ERR("QueryInterface(dev): 0x%x", result); - goto next; - } - ret = (*stuff->dev)->USBDeviceOpenSeize(stuff->dev); - if(ret != KERN_SUCCESS) - { - ERR("USBDeviceOpenSeize: %s", mach_error_string(ret)); - } - else - { - ret = (*stuff->dev)->SetConfiguration(stuff->dev, 1); - if(ret != KERN_SUCCESS) - { - ERR("SetConfiguration: %s", mach_error_string(ret)); - } - else - { - IOUSBFindInterfaceRequest request = - { - .bInterfaceClass = kIOUSBFindInterfaceDontCare, - .bInterfaceSubClass = kIOUSBFindInterfaceDontCare, - .bInterfaceProtocol = kIOUSBFindInterfaceDontCare, - .bAlternateSetting = kIOUSBFindInterfaceDontCare, - }; - io_iterator_t iter = MACH_PORT_NULL; - ret = (*stuff->dev)->CreateInterfaceIterator(stuff->dev, &request, &iter); - if(ret != KERN_SUCCESS) - { - ERR("CreateInterfaceIterator: %s", mach_error_string(ret)); - } - else - { - io_service_t usbIntf = MACH_PORT_NULL; - while((usbIntf = IOIteratorNext(iter))) - { - ret = IOCreatePlugInInterfaceForService(usbIntf, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin, &score); - IOObjectRelease(usbIntf); - if(ret != KERN_SUCCESS) - { - ERR("IOCreatePlugInInterfaceForService(usbIntf): %s", mach_error_string(ret)); - continue; - } - result = (*plugin)->QueryInterface(plugin, CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID), (LPVOID*)&stuff->handle); - (*plugin)->Release(plugin); - if(result != 0) - { - ERR("QueryInterface(intf): 0x%x", result); - continue; - } - ret = (*stuff->handle)->USBInterfaceOpen(stuff->handle); - if(ret != KERN_SUCCESS) - { - ERR("USBInterfaceOpen: %s", mach_error_string(ret)); - } - else - { - io_start(stuff); - stuff->regID = regID; - while((usbIntf = IOIteratorNext(iter))) IOObjectRelease(usbIntf); - IOObjectRelease(iter); - while((usbDev = IOIteratorNext(it))) IOObjectRelease(usbDev); - IOObjectRelease(usbDev); - return; - } - (*stuff->handle)->Release(stuff->handle); - stuff->handle = NULL; - } - IOObjectRelease(iter); - } - } - } - - next:; - if(stuff->dev) - { - (*stuff->dev)->USBDeviceClose(stuff->dev); - (*stuff->dev)->Release(stuff->dev); - stuff->dev = NULL; - } - IOObjectRelease(usbDev); - } -} - -static void LostDevice(void *refCon, io_iterator_t it) -{ - stuff_t *stuff = refCon; - io_service_t usbDev = MACH_PORT_NULL; - while((usbDev = IOIteratorNext(it))) - { - uint64_t regID; - kern_return_t ret = IORegistryEntryGetRegistryEntryID(usbDev, ®ID); - IOObjectRelease(usbDev); - if(ret == KERN_SUCCESS && stuff->regID == regID) - { - io_stop(stuff); - stuff->regID = 0; - (*stuff->handle)->USBInterfaceClose(stuff->handle); - (*stuff->handle)->Release(stuff->handle); - (*stuff->dev)->USBDeviceClose(stuff->dev); - (*stuff->dev)->Release(stuff->dev); - } - } -} - -static const int pongo_usb_vendor = PONGO_USB_VENDOR; -static const int pongo_usb_product = PONGO_USB_PRODUCT; - -int wait_for_pongo(void) { - kern_return_t ret; - stuff_t stuff = {0}; - io_iterator_t found, lost; - - void* cfdict_keys[3]; - void* cfdict_values[3]; - - cfdict_keys[0] = (void*)CFSTR("IOProviderClass"); - cfdict_keys[1] = (void*)CFSTR("idVendor"); - cfdict_keys[2] = (void*)CFSTR("idProduct"); - - cfdict_values[0] = (void*)CFSTR("IOUSBDevice"); - cfdict_values[1] = (void*)CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pongo_usb_vendor); - cfdict_values[2] = (void*)CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &pongo_usb_product); - - CFDictionaryRef cfdict = CFDictionaryCreate(kCFAllocatorDefault, (const void**)cfdict_keys, (const void**)cfdict_values, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - IONotificationPortRef notifyPort = IONotificationPortCreate(kIOMasterPortDefault); - - CFRetain(cfdict); - // CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notifyPort), kCFRunLoopDefaultMode); - - ret = IOServiceAddMatchingNotification(notifyPort, kIOFirstMatchNotification, cfdict, &FoundDevice, &stuff, &found); - if(ret != KERN_SUCCESS) - { - ERR("IOServiceAddMatchingNotification: %s", mach_error_string(ret)); - return -1; - } - FoundDevice(&stuff, found); - - CFRetain(cfdict); - ret = IOServiceAddMatchingNotification(notifyPort, kIOTerminatedNotification, cfdict, &LostDevice, &stuff, &lost); - if(ret != KERN_SUCCESS) - { - ERR("IOServiceAddMatchingNotification: %s", mach_error_string(ret)); - return -1; - } - LostDevice(&stuff, lost); - // CFRunLoopRun(); - while (get_spin()) { - sleep(1); - } - CFRelease(cfdict); - return 0; -} -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/usb_libusb.c b/src/usb_libusb.c deleted file mode 100644 index a3b7626..0000000 --- a/src/usb_libusb.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * pongoOS - https://checkra.in - * - * Copyright (C) 2019-2023 checkra1n team - * - * This file is part of pongoOS. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ -#ifdef USE_LIBUSB -#include -#include // open -#include -#include -#include -#include -#include // exit, strtoull -#include // strlen, strerror, memcpy, memmove -#include // close -#include // mmap, munmap -#include // fstst - -#include -#define ERR(...) LOG(LOG_ERROR, __VA_ARGS__) - -void io_start(stuff_t *stuff); -void io_stop(stuff_t *stuff); - -const char *usb_strerror(usb_ret_t err) -{ - return libusb_error_name(err); -} - -usb_ret_t USBControlTransfer(usb_device_handle_t handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint32_t wLength, void *data, uint32_t *wLenDone) -{ - usb_ret_t r = libusb_control_transfer(handle, bmRequestType, bRequest, wValue, wIndex, data, wLength, 0); - if(r < 0) return r; - if(wLenDone) *wLenDone = r; - return USB_RET_SUCCESS; -} - -usb_ret_t USBBulkUpload(usb_device_handle_t handle, void *data, int len) -{ - static uint32_t maxLen = 0; - int transferred = 0; - usb_ret_t r; - if(maxLen == 0) - { - r = libusb_bulk_transfer(handle, 2, data, len, &transferred, 0); - if(r == LIBUSB_SUCCESS) - { - return transferred == len ? USB_RET_SUCCESS : LIBUSB_ERROR_INTERRUPTED; - } - else if(r != LIBUSB_ERROR_NO_MEM) - { - return r; - } -#if defined(__linux__) - // We only get here on ENOMEM - FILE *f = fopen("/sys/module/usbcore/parameters/usbfs_memory_mb", "r"); - if(f) - { - char str[32]; // More than enough to hold a uint64 in decimal - size_t s = fread(str, 1, sizeof(str), f); - fclose(f); - if(s == 0 || s >= sizeof(str)) return r; - str[s] = '\0'; - char *end = NULL; - unsigned long long max = strtoull(str, &end, 0); - // Using the limit as-is will lead to ENOMEM, so we multiply - // by half a MB and impose an appropriate max value. - if(*end == '\n') ++end; - if(*end != '\0' || max == 0 || max >= 0x2000) return r; - maxLen = (uint32_t)(max << 19); - } - else -#endif - { - // Just 1MB by default? - maxLen = 0x100000; - } - } - // If we get here, we have to chunk our data - for(int done = transferred; done < len; ) - { - uint32_t chunk = len - done; - if(chunk > maxLen) chunk = maxLen; - transferred = 0; - r = libusb_bulk_transfer(handle, 2, (unsigned char*)data + done, chunk, &transferred, 0); - done += transferred; - if(r == LIBUSB_SUCCESS) continue; - if(r != LIBUSB_ERROR_NO_MEM || maxLen <= 0x40) return r; - maxLen /= 2; - } - return LIBUSB_SUCCESS; -} - -static int FoundDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *arg) -{ - stuff_t *stuff = arg; - if(stuff->handle) - { - return LIBUSB_SUCCESS; - } - LOG(LOG_VERBOSE, "PongoOS USB Device connected"); - - libusb_device_handle *handle; - int r = libusb_open(dev, &handle); - if(r != LIBUSB_SUCCESS) - { - ERR("libusb_open: %s", libusb_error_name(r)); - return r; - } - -/* nah there would not be a kernel driver for pongoOS in Darwin */ -#if !defined(__APPLE__) - r = libusb_detach_kernel_driver(handle, 0); - if(r != LIBUSB_SUCCESS && r != LIBUSB_ERROR_NOT_FOUND) - { - ERR("libusb_detach_kernel_driver: %s", libusb_error_name(r)); - return r; - } -#endif - - r = libusb_set_configuration(handle, 1); - if(r != LIBUSB_SUCCESS) - { - ERR("libusb_set_configuration: %s", libusb_error_name(r)); - return r; - } - - r = libusb_claim_interface(handle, 0); - if(r != LIBUSB_SUCCESS) - { - ERR("libusb_claim_interface: %s", libusb_error_name(r)); - return r; - } - - stuff->dev = dev; - stuff->handle = handle; - io_start(stuff); - - return LIBUSB_SUCCESS; -} - -static int LostDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *arg) -{ - stuff_t *stuff = arg; - if(stuff->dev != dev) - { - return LIBUSB_SUCCESS; - } - LOG(LOG_VERBOSE, "PongoOS USB Device disconnected"); - - io_stop(stuff); - libusb_close(stuff->handle); - libusb_unref_device(dev); - stuff->handle = NULL; - stuff->dev = NULL; - - return LIBUSB_SUCCESS; -} - -int wait_for_pongo(void) -{ - stuff_t stuff = {0}; - libusb_hotplug_callback_handle hp[2]; - libusb_context* ctx = NULL; - - int r = libusb_init(&ctx); - if(r != LIBUSB_SUCCESS) - { - ERR("libusb_init: %s", libusb_error_name(r)); - return -1; - } - - if(!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) - { - ERR("libusb: no hotplug capability"); - libusb_exit(ctx); - return -1; - } - - r = libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, PONGO_USB_VENDOR, PONGO_USB_PRODUCT, LIBUSB_HOTPLUG_MATCH_ANY, LostDevice, &stuff, &hp[1]); - if(r != LIBUSB_SUCCESS) - { - ERR("libusb_hotplug: %s", libusb_error_name(r)); - libusb_exit(ctx); - return -1; - } - - while (1) { - r = libusb_handle_events(ctx); - if(r != LIBUSB_SUCCESS) - { - ERR("libusb_handle_events: %s", libusb_error_name(r)); - break; - } - - libusb_device **list; - ssize_t sz = libusb_get_device_list(ctx, &list); - bool done = false; - if(sz < 0) - { - ERR("libusb_get_device_list: %s", libusb_error_name((int)sz)); - libusb_exit(ctx); - return -1; - } - - for(ssize_t i = 0; i < sz; ++i) - { - struct libusb_device_descriptor desc; - r = libusb_get_device_descriptor(list[i], &desc); - if(r != LIBUSB_SUCCESS) - { - ERR("libusb_get_device_descriptor: %s", libusb_error_name(r)); - // continue anyway - } - if(desc.idVendor != PONGO_USB_VENDOR || desc.idProduct != PONGO_USB_PRODUCT) - { - libusb_unref_device(list[i]); - continue; - } - r = FoundDevice(ctx, list[i], LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, &stuff); - for (ssize_t j = i; j < sz; ++j) { - libusb_unref_device(list[j]); - } - - if(r != LIBUSB_SUCCESS) - { - libusb_free_device_list(list, 0); - libusb_exit(ctx); - return -1; - } else { - done = true; - } - break; - } - - libusb_free_device_list(list, 0); - - if (done) goto end; - } - - end: - libusb_exit(ctx); - return 0; -} -#else -/* ISO C forbids an empty translation unit */ -extern char** environ; -#endif diff --git a/src/utils/constants.cpp b/src/utils/constants.cpp new file mode 100644 index 0000000..b9aa5b6 --- /dev/null +++ b/src/utils/constants.cpp @@ -0,0 +1,3 @@ +#include "constants.h" + +uint64_t palerain_flags = 0; diff --git a/src/utils/constants.h b/src/utils/constants.h new file mode 100644 index 0000000..1cb9f67 --- /dev/null +++ b/src/utils/constants.h @@ -0,0 +1,10 @@ +#ifndef CONSTANTS_H +#define CONSTANTS_H + +#define PALERAIN_VERSION "3.0.0" + +#include + +extern uint64_t palerain_flags; + +#endif // CONSTANTS_H diff --git a/src/utils/log.h b/src/utils/log.h new file mode 100644 index 0000000..5f03493 --- /dev/null +++ b/src/utils/log.h @@ -0,0 +1,17 @@ +#ifndef LOG_H +#define LOG_H + +#define RESET_COLOR "\033[0m" +#define RED_COLOR "\033[31m" +#define GREEN_COLOR "\033[32m" +#define YELLOW_COLOR "\033[33m" +#define BLUE_COLOR "\033[34m" +#define MAGENTA_COLOR "\033[35m" +#define CYAN_COLOR "\033[36m" +#define WHITE_COLOR "\033[37m" +#define GRAY_COLOR "\033[90m" + +#define LOG(fmt, ...) \ +printf("(%s:%d) => " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) + +#endif // LOG_H diff --git a/include/paleinfo.h b/src/utils/paleinfo.h similarity index 98% rename from include/paleinfo.h rename to src/utils/paleinfo.h index b2bd696..f84b713 100644 --- a/include/paleinfo.h +++ b/src/utils/paleinfo.h @@ -2,7 +2,7 @@ * jbinit - https://github.com/palera1n/jbinit * * This file is part of jbinit - * + * * SPDX-License-Identifier: MIT */ @@ -26,7 +26,7 @@ typedef uint64_t palerain_option_t; // (UINT64_C(1) << 8) /* reserved */ #define palerain_option_clean_fakefs (UINT64_C(1) << 9) /* clean fakefs, but does not delete it */ #define palerain_option_tui (UINT64_C(1) << 10) /* terminal user interface */ -// #define palerain_option_gui (UINT64_C(1) << 11) /* graphical user interface*/ +#define palerain_option_gui (UINT64_C(1) << 11) /* graphical user interface*/ #define palerain_option_dfuhelper_only (UINT64_C(1) << 12) /* dfuhelper only */ #define palerain_option_pongo_exit (UINT64_C(1) << 13) /* boot to clean pongo shell */ #define palerain_option_demote (UINT64_C(1) << 14) /* Demote effective production fuse status */