Compare commits

..
27 Commits
Author SHA1 Message Date
Nick Chan 91c5de6408 docs: s/17.0/17.1/ 2023-10-26 10:33:14 +08:00
samara d65877f851 chore: why use mirror 2023-10-23 20:59:31 -07:00
Nick Chan 3df6791ebd actions: build a static linux usbmuxd 2023-10-14 18:23:02 +08:00
samara 06a93e697b chore: minor spelling mistake 2023-10-02 16:41:51 -07:00
Nick Chan ffad44ce10 docs/palera1n.1: minor formatting and version fixes 2023-10-02 23:02:55 +08:00
alexia 4775c8ab23 chore: update palera1n-ios description (#399)
Added a note saying it is not an untether, and about bad success rate.
2023-08-08 04:28:43 -07:00
kok3shidoll 7992b1e2a9 Makefile: Change Pongo.bin and kpf paths 2023-07-28 03:18:02 +09:00
samara 3fdb75b9fa chore: change readme 2023-07-27 05:57:29 -07:00
samara 3b0d8ece54 chore: Update Makefile 2023-07-16 11:09:47 -07:00
Nebula 7a20bc0ad9 ci(darwin-dist): cp palera1n-iphoneos-arm64 to ready/ 2023-07-14 13:43:48 -04:00
Nebula 0194d5296a ci(sftp): temporarily downgrade sftp-upload-action to v1.4.8 2023-07-14 13:24:54 -04:00
Nick Chan ef55859eb0 optparse: remove some dead dtpatch code 2023-07-08 20:03:15 +08:00
Nick Chan b5db51c1ac docs: s/16.5/16.5.1/g 2023-07-08 18:35:46 +08:00
Nick Chan 5106372a4b dfuhelper: changes 2023-07-08 04:41:43 +08:00
Nick Chan 6686fdd1a4 Makefile: Update NAME 2023-07-08 04:41:41 +08:00
Nick Chan 48eb11ada0 tui: fix options menu 2023-07-08 03:55:19 +08:00
Nick Chan f72ad75db2 chore: fix tui build compiler errors 2023-07-08 03:55:19 +08:00
Nick Chan 4a8fb113ae increase size of palera1n_flags 2023-07-08 03:55:18 +08:00
Nick Chan 03a0a5db6b paleinfo v2 2023-07-08 03:53:55 +08:00
samara 8b56b01cee chore: Update README.md :3c 2023-07-06 02:59:30 -07:00
Nick Chan 52d20c8e5b docs: do not mention options that does not appear in help menu 2023-07-02 03:56:55 +08:00
Nick Chan b0ac19e4d1 Do not implicitly set any build settings 2023-07-02 03:47:00 +08:00
Nebula e8d4e857dd fix(ci): make upload action use password 2023-07-01 14:34:18 -04:00
Nebula bf549b8f86 ci(sftp): update to sftp-upload-action v2.0.2 2023-06-28 15:38:43 -04:00
Nick Chan b79ac3176f ci: do not use palera1n-ios, just palera1n-iphoneos-arm64 2023-06-27 19:12:40 +08:00
flower e12216dc5e feat: update docs link 2023-06-22 17:42:45 -07:00
Tom E f7603371f6 Update to checkra1n 0.1337.2 2023-06-06 10:11:11 -04:00
33 changed files with 294 additions and 1564 deletions

No files matched your search

+49 -17
View File
@@ -50,9 +50,9 @@ jobs:
host: ${{ secrets.NICKCHAN_FTP_HOST }}
port: ${{ secrets.NICKCHAN_FTP_PORT }}
username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }}
password: ${{ secrets.NICKCHAN_FTP_PASS }}
forceUpload: true
dryRun: true
dryRun: false
localDir: 'ready/'
remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref_name }}/${{ github.run_number }}"
@@ -340,9 +340,9 @@ jobs:
host: ${{ secrets.NICKCHAN_FTP_HOST }}
port: ${{ secrets.NICKCHAN_FTP_PORT }}
username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }}
password: ${{ secrets.NICKCHAN_FTP_PASS }}
forceUpload: true
dryRun: true
dryRun: false
localDir: 'ready/'
remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref }}/${{ github.run_number }}"
@@ -377,7 +377,7 @@ jobs:
with:
packages: sed coreutils
cache: true
mirror: 'https://procursus.itsnebula.net/'
mirror: 'https://apt.procurs.us/'
- name: Download all Darwin artifacts
uses: actions/download-artifact@v3
@@ -393,8 +393,8 @@ jobs:
cp palera1n-macos ready/palera1n-macos-universal
cp ./palera1n-macosx-x86_64/palera1n-macosx-x86_64 ready/palera1n-macos-x86_64
cp ./palera1n-macosx-arm64/palera1n-macosx-arm64 ready/palera1n-macos-arm64
cp ./palera1n-iphoneos-arm64/palera1n-iphoneos-arm64 ready/palera1n-ios
zip -r9 ready/palera1n-ios.dSYM.zip palera1n-iphoneos-arm64.dSYM
cp ./palera1n-iphoneos-arm64/palera1n-iphoneos-arm64 ready/palera1n-iphoneos-arm64
zip -r9 ready/palera1n-iphoneos-arm64.dSYM.zip palera1n-iphoneos-arm64.dSYM
zip -r9 ready/palera1n-macos.dSYM.zip palera1n-macos.dSYM
- name: Build debs
@@ -445,7 +445,7 @@ jobs:
gsed 's|@DEB_ARCH@|iphoneos-arm|g' -i stage/DEBIAN/control
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
ginstall -Dm644 ready/palera1n-ios stage/usr/bin/palera1n
ginstall -Dm644 ready/palera1n-iphoneos-arm64 stage/usr/bin/palera1n
ginstall -Dm644 docs/palera1n.1 stage/usr/share/man/man1/palera1n.1
chmod +x stage/usr/bin/palera1n
@@ -462,7 +462,7 @@ jobs:
gsed 's|@DEB_ARCH@|iphoneos-arm64|g' -i stage/DEBIAN/control
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
ginstall -Dm644 ready/palera1n-ios stage/var/jb/usr/bin/palera1n
ginstall -Dm644 ready/palera1n-iphoneos-arm64 stage/var/jb/usr/bin/palera1n
ginstall -Dm644 docs/palera1n.1 stage/var/jb/usr/share/man/man1/palera1n.1
chmod +x stage/var/jb/usr/bin/palera1n
@@ -490,9 +490,9 @@ jobs:
host: ${{ secrets.NICKCHAN_FTP_HOST }}
port: ${{ secrets.NICKCHAN_FTP_PORT }}
username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }}
password: ${{ secrets.NICKCHAN_FTP_PASS }}
forceUpload: true
dryRun: true
dryRun: false
localDir: 'ready/'
remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref }}/${{ github.run_number }}"
@@ -601,6 +601,7 @@ jobs:
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
- name: Build Mbed TLS
run: |
@@ -750,9 +751,25 @@ jobs:
sudo rm /usr/local
sudo mv /usr/local.bak /usr/local
- name: Build usbmuxd
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 sysroot/${{ env.PREFIX }}/{include,lib} dep_root
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)
@@ -763,13 +780,15 @@ jobs:
${{ matrix.triple }}-strip --strip-debug --strip-unneeded src/palera1n
${{ matrix.triple }}-objcopy --add-gnu-debuglink=palera1n.debug src/palera1n
chmod -x palera1n.debug
- name: Prepare artifact
run: |
mkdir ready
mkdir ready usbmuxd-static
mv palera1n.debug ready/palera1n-${{ env.CHECKRA1N_NAME }}.debug
mv src/palera1n ready/palera1n-${{ env.CHECKRA1N_NAME }}
tar -zcf ready/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: |
@@ -803,12 +822,25 @@ jobs:
host: ${{ secrets.NICKCHAN_FTP_HOST }}
port: ${{ secrets.NICKCHAN_FTP_PORT }}
username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }}
password: ${{ secrets.NICKCHAN_FTP_PASS }}
forceUpload: true
dryRun: true
dryRun: false
localDir: 'ready/'
remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref }}/${{ github.run_number }}"
- name: Upload usbmuxd artifact
if: ${{ github.event_name != 'pull_request' }}
uses: wangyucode/[email protected]
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"
finish-build:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' }}
@@ -829,5 +861,5 @@ jobs:
- 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 }}/palera1n.1.html)\"},{\"name\":\"Main Artifacts\",\"value\":\"- [palera1n-ios](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-ios)\n- [palera1n-linux-arm64](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-linux-arm64)\n- [palera1n-linux-armel](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-linux-armel)\n- [palera1n-linux-x86](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/$${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/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 }}/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 }}/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\"}")
(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 }}/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 }}/palera1n-iphoneos-arm64)\n- [palera1n-linux-arm64](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-linux-arm64)\n- [palera1n-linux-armel](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-linux-armel)\n- [palera1n-linux-x86](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/$${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/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 }}/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 }}/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\"}")
+2 -11
View File
@@ -1,14 +1,12 @@
NAME = bakepale
NAME = Dusk
SRC = $(shell pwd)
DEP = $(SRC)/dep_root
STRIP = strip
CC ?= cc
CXX ?= c++
CFLAGS += -I$(DEP)/include -I$(SRC)/include -I$(SRC) -D_XOPEN_SOURCE=500
CFLAGS += -Wall -Wextra -Wno-unused-parameter -DPALERAIN_VERSION=\"2.0.0\"
CFLAGS += -Wno-unused-variable -I$(SRC)/src -std=c99 -pedantic-errors -D_C99_SOURCE -D_POSIX_C_SOURCE=200112L
CXXFLAGS += -I$(DEP)/include -I$(SRC)/include -I$(SRC) -std=c++11
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),)
@@ -33,13 +31,6 @@ ifeq ($(TARGET_OS),Linux)
LIBS += $(DEP)/lib/libgpm.a
endif
endif
ifeq ($(GUI),1)
LIBS += $(DEP)/lib/libguira1n.a
ifeq ($(TARGET_OS),Darwin)
LIBS += -framework Foundation -framework AppKit
CXXFLAGS += -x objective-c++
endif
endif
ifeq ($(DEV_BUILD),1)
CFLAGS += -O0 -g -DDEV_BUILD -fno-omit-frame-pointer
ifeq ($(ASAN),1)
@@ -73,7 +64,7 @@ CFLAGS += -DBUILD_WHOAMI="\"$(BUILD_WHOAMI)\"" -DBUILD_TAG="\"$(BUILD_TAG)\""
CFLAGS += -DBUILD_NUMBER="\"$(BUILD_NUMBER)\"" -DBUILD_BRANCH="\"$(BUILD_BRANCH)\""
CFLAGS += -DBUILD_COMMIT="\"$(BUILD_COMMIT)\""
export SRC DEP CC CXX CFLAGS CXXFLAGS LDFLAGS LIBS TARGET_OS DEV_BUILD BUILD_DATE BUILD_TAG BUILD_WHOAMI BUILD_STYLE BUILD_NUMBER BUILD_BRANCH
export SRC DEP CC CFLAGS LDFLAGS LIBS TARGET_OS DEV_BUILD BUILD_DATE BUILD_TAG BUILD_WHOAMI BUILD_STYLE BUILD_NUMBER BUILD_BRANCH
all: palera1n
+24 -45
View File
@@ -1,23 +1,34 @@
<picture>
<source media="(prefers-color-scheme: light)" srcset="https://cdn.discordapp.com/attachments/1028398976640229380/1088049124441604136/IMG_0033.png">
<img align="left" height="120" src="https://cdn.discordapp.com/attachments/1017854329887129611/1073858292159352862/thing.png" alt="palera1n logo" style="float: left;"/>
</picture>
<center>
<a href="#"><img src="https://cdn.discordapp.com/attachments/1103485261196832779/1126450758523572285/pxd.png" alt="Logo"></a>
</center>
<br clear="both"/>
<p align="center">
<a href="https://cdn.nickchan.lol/palera1n/c-rewrite/releases/v2.0.0-beta.7/palera1n.1.html">Documentation</a> •
<a href="https://ios.cfw.guide/installing-palera1n">Installation Guide</a> •
<a href="#requirements">Requirements</a> •
<a href="https://discord.gg/palera1n">Support Discord</a> •
<a href="https://palera.in">Website</a>
</p>
## Information
- Guides to palera1n can be found [here](https://ios.cfw.guide/installing-palera1n).
- Full documentation can be also found [here](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/palera1n.1.html).
This is the official repo for the palera1n project, a jailbreak for arm64 devices on iOS 15.0+
- Loader application used in palera1n can be found [here](https://github.com/palera1n/loader).
- palera1ns jbinit can be found [here](https://github.com/palera1n/jbinit).
- palera1ns custom PongoOS can be found [here](https://github.com/palera1n/pongoos).
Website & credits can be found at https://palera.in (scroll down for credits).
## Warnings
- We are **NOT** responsible for any data loss, or the result of a device being bricked. The user of this program accepts responsibility should something happen to their device. While nothing should happen, jailbreaking has risks in itself.
- If your device is stuck in recovery, please run futurerestore `--exit-recovery`, or use `irecovery -n`.
We are **NOT** responsible for any data loss, or the result of a device being bricked. The user of this program accepts responsibility should something happen to their device. While nothing should happen, jailbreaking has risks in itself.
- If your device is stuck in recovery, please run futurerestore `--exit-recovery`, or use `irecovery -n`.
- If you're unable to get out of recovery via these methods please restore with iTunes or Finder.
- palera1n will never work in VirtualBox, VMware or any virtual machine that doesn't support PCI passthrough.
## Requirements
- A checkm8 vulnerable iOS device on iOS 15.x or 16.x (`A8` - `A11`)
- If using rootful, you will need **5-10GB of space** for the fakefs. This means 16GB devices cannot use the full fakefs creation. However, you can change the arguments to `-Bf` to create a fakefs with bind mounts, so it uses a smaller size, at the expense having unwritable parts in rarely-written paths, and then boot it
- A checkm8 vulnerable iOS device on iOS 15+ (`A8` - `A11`)
- On `A11`, **you must disable your passcode while in the jailbroken state** (on iOS 16, you need to **reset your device** before proceeding with palera1n).
- **USB-A** cables are recommended to use, USB-C may have issues with palera1n and getting into DFU mode.<details><summary>Technical explanation</summary>The BootROM will only enter DFU if it detects USB voltage, which boils down to checking whether a certain pin is asserted from the Tristar chip. The Tristar does this based on the cable's accessory ID, and apparently USB-A and USB-C cables have different accessory IDs, and the one of the USB-C cables makes the Tristar not assert the USB voltage pin.</details>
@@ -28,7 +39,7 @@
- Apple Silicon Macs with USB-C
- 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 USBHub.
- This problem may be solved by connecting via USB hub, though extensions can vary.
## Need help?
@@ -40,36 +51,4 @@ Make sure you provide full details on your device, such as:
Using `-VvL` would help with debugging.
Join the [Support Discord](https://dsc.gg/palera1n), and create a thread in [#support](https://discord.com/channels/1028398973452570725/1028730487700738130) or ask in [#general](https://discord.com/channels/1028398973452570725/1028398976640229380).
## Credits
<details><summary>Credits</summary>
<p>
- [Lakhan Lothiyi](https://github.com/llsc12) for older palera1n loader app
- [checkra1n](https://github.com/checkra1n) for the base of the kpf
- [the Procursus Team](https://github.com/ProcursusTeam) for the amazing [bootstrap](https://github.com/ProcursusTeam/Procursus)
- [Évelyne](https://github.com/evelyneee) for [ElleKit](https://github.com/evelyneee/ellekit), rootless tweak injection
- [Sam Bingner](https://github.com/sbingner) for [Substitute](https://github.com/sbingner/substitute), rootful tweak injection
</details>
</p>
<br>
<p align="center">
Thank you so much to our Patreons that make the future development possible! You may sub <a href="https://patreon.com/palera1n">here</a>, if you'd like to.</br>
</p>
<p align="center">
<a href="https://github.com/samh06"><img width=64 style="border-radius: 25%;" src="https://user-images.githubusercontent.com/18669106/206333607-881d7ca1-f3bf-4e18-b620-25de0c527315.png"></img></a>
<a href="https://havoc.app"><img width=64 style="border-radius: 25%;" src="https://docs.havoc.app/img/standard_icon.png"></img></a>
<a href="https://twitter.com/yyyyyy_public"><img width=64 style="border-radius: 25%;" src="https://cdn.discordapp.com/attachments/1054239098006683688/1072587455779328040/image.png?size=400"></img></a>
<a href="https://twitter.com/0xSp00kyb0t"><img width=64 style="border-radius: 25%;" src="https://pbs.twimg.com/profile_images/1603601553226620935/1t4yD1bD_400x400.jpg"></img></a>
<a href="https://chariz.com"><img width=64 src="https://chariz.com/img/favicon.png"></img></a>
<a href="https://twitter.com/stars6220"><img width=64 style="border-radius: 25%;" src="https://pbs.twimg.com/profile_images/1621062976982728706/pWVZQ-NO_400x400.jpg"></img></a>
<a href="https://github.com/TheFunnyMan16"><img width=64 style="border-radius: 25%;" src="https://cdn.discordapp.com/attachments/1050068822473842778/1082867264807772281/IMG_3942.jpg">
<a href="https://github.com/beast9265"><img width=64 style="border-radius: 25%;" src="https://avatars.githubusercontent.com/u/79794946?v=4"></img></a>
<a href="https://twitter.com/0x7FF7"><img width=64 style="border-radius: 25%;" src="https://pbs.twimg.com/profile_images/1630818481191919618/8MWaJ1F7_400x400.jpg"></img></a>
<a href="https://sideloadly.io/"><img width=64 style="border-radius: 25%;" src="https://sideloadly.io/icon.png"></img></a>
<a href="https://blog.stevesec.com/"><img width=64 style="border-radius: 25%;" src="https://blog.stevesec.com/img/avatar.jpg"></img>
<a href="https://github.com/0xilis/"><img width=64 style="border-radius: 25%;" src="https://github.com/0xilis.png"></img></a>
</p>
Join the [Support Discord](https://dsc.gg/palera1n)
+12 -97
View File
@@ -2,14 +2,14 @@
.\" Copyright (c) 2023 Nick Chan
.\" SPDX-License-Identifier: MIT
.\"
.Dd "20 March 2023"
.Dd "26 October 2023"
.Dt palera1n 1
.Sh NAME
.Nm palera1n
.Nd iOS 15.0-16.5 arm64 iOS/iPadOS jailbreaking tool
.Nd iOS 15.0-17.1 arm64 iOS/iPadOS jailbreaking tool
.Sh SYNOPSIS
.Nm
.Op Fl cCdDEfhIlLnpRsSvV
.Op Fl dDEhILnpRsSvV
.Op Fl e Ar Boot arguments
.Op Fl k Ar Pongo image
.Op Fl o Ar overlay file
@@ -20,15 +20,11 @@
.Op Fl -force-revert
.Sh DESCRIPTION
.Nm
jailbreaks any iOS/iPadOS device with an arm64 (arm64e excluded) on iOS 15.0-16.5,
jailbreaks any iOS/iPadOS device with an arm64 (arm64e excluded) on iOS 15.0-16.5.1,
utilizing the
.Em checkm8
bootROM exploit.
.Pp
.Nm
is able to jailbreak the device in fakefs-rootful mode, where /
is writable, as well as rootless mode, where / cannot be written to.
.Pp
Due to the nature of the
.Em checkm8
exploit,
@@ -52,7 +48,7 @@ In the remainder of this document, the term "iOS" and "iPadOS" will be used inte
as the difference is negligible as far as the jailbreak is concerened.
.Pp
.Sh SUPPORTED DEVICES
As described above, arm64 iOS 15.0-16.5 devices are supported, here is an explicit
As described above, arm64 iOS 15.0-16.5.1 devices are supported, here is an explicit
list of supported devicecs:
.Bl -tag -compact
@@ -95,36 +91,7 @@ Prints the program version and exit.
Remove the jailbreak while keeping user data. Some jailbreak files may remain
after running this command. Additionally, jailbreak apps will 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 option currently does not work on iOS 16.
.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.
.It Fl C , -clean-fakefs
This reverts the fakefs to the
.Em orig-fs
snapshot that is created when the fakefs
is first created, then the device will continue to boot jailbroken. This option
allows resetting the rootful environment without deleting the entire fakefs.
Note that this option will not work if the fakefs is created in an older version
of palera1n that does not create the
.Em orig-fs
snapshot on the fakefs. This option will also remove some jailbreak files inside
of /var. The files in /var will not be deleted when a userspace reboot is done
with this flag set.
still has their icons.
.It Fl d , -demote
Set the effective production fuse to 0, so as to enable hardware debugging features.
.It Fl D , -dfuhelper
@@ -135,13 +102,9 @@ Specify custom XNU kernel command line. The
.Em rootdev=md0
argument is used by
.Nm
and cannot be overriden. Additionally, the
.Em wdt=-1
argument is used during fakefs setup.
and cannot be overriden.
.It Fl E , -enter-recovery
Exit after entering recovery mode.
.It Fl f , -fakefs
Proceed in rootful mode. This applies to both full fakefs and partial fakefs.
.It Fl h , -help
Prints help text.
.It Fl i , -checkra1n-file Ar checkra1n file
@@ -157,12 +120,6 @@ root filesystem in paleinfo with
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 is the default when neither
.Fl l , -rootless
and
.Fl f , -fakefs
is specified.
.Fl L , -jbinit-log-to-file
Makes jbinit log to
.Em /cores/jbinit.log
@@ -221,32 +178,10 @@ To (re-)jailbreak in rootless mode:
.Pp
.Dl "palera1n"
.Pp
To setup fakefs for rootful mode:
.Pp
.Dl "palera1n -fc"
.Pp
After the device has rebooted, 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"
@@ -260,8 +195,6 @@ To verbose boot, use the
.Fl V , -verbose-boot
option when jailbreaking.
.Pp
Fakefs takes up around 5-10 GB of storage, and take 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
@@ -269,11 +202,6 @@ version of the Procursus fork of
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.
.Sh POST INSTALLATION
The palera1n loader app will take up to 30 seconds to appear on the homescreen after the
device has booted. If it does not appear, you can try using the shortcut:
@@ -298,18 +226,11 @@ The location of the temporary filesystem where jailbreak files are stash during
When
.Fl L
is used, the log file of jbinit.
.It Pa /Library/LaunchDaemons
The directory where jailbreak-specific
.Xr launchd.plist 5
property list files should be placed on rootful.
The log file of jbinit.
.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 filse that needs to be executed during boot, before
daemons are launched, are placed 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
@@ -330,15 +251,8 @@ injects a dylib into launchd to allow the
.Sy launchctl runstats
command to be used on the device.
.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 fakefs functionality was removed.
.Sh SEE ALSO
.Xr launchd 8
.Xr launchd.plist 5
@@ -353,4 +267,5 @@ December 13, 2022. Later, the first attempt to rewrite palera1n into C begins on
01 2023. The
.Nm
utility described here is the second attempt, which first started on January 16, 2023,
using checkra1n 1337 and the plush KPF.
using checkra1n 1337 and a custom KPF.
Something happened on August 15, 2023.
-20
View File
@@ -1,20 +0,0 @@
curl -LOOOOOO \
https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v3.3.0.tar.gz \
https://github.com/libusb/libusb/releases/download/v1.0.26/libusb-1.0.26.tar.bz2 \
https://mirror-hk.koddos.net/gnu/readline/readline-8.2.tar.gz \
https://www.jedsoft.org/releases/slang/slang-2.3.3.tar.bz2 \
https://releases.pagure.org/newt/newt-0.52.23.tar.gz \
https://github.com/rpm-software-management/popt/archive/master-release.tar.gz
tar xf v3.3.0.tar.gz
tar xf libusb-1.0.26.tar.bz2
tar xf readline-8.2.tar.gz
tar xf slang-2.3.3.tar.bz2
tar xf newt-0.52.23.tar.gz
tar xf master-release.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
-33
View File
@@ -1,33 +0,0 @@
#ifndef COMMON_H
#define COMMON_H
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
extern "C" {
#include <palerain.h>
#include <gui.h>
}
#define DISCONNECTED 0
#define NORMAL 1
#define RECOVERY 2
#define DFU 3
#define rest(a) std::this_thread::sleep_for(std::chrono::seconds(a))
#define FLOAT_TO_INT(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
void guifree(void);
void dfuhelper();
void send_alert(const char *title, const char *msg);
extern devinfo_t dev;
extern bool waiting_for_device;
extern bool unsupported_device;
extern bool supported_device;
extern bool recovery_wait;
extern bool jailbreak;
extern bool enter_dfu;
extern bool dfu_helper;
extern int device_status;
#endif
-55
View File
@@ -1,55 +0,0 @@
#ifndef DESIGN_H
#define DESIGN_H
#define set_pos(a,b) ImGui::SetCursorPos(ImVec2(a,b))
#define font(a) ImGui::PushFont(io.Fonts->Fonts[a])
#define btn_text_on colors[ImGuiCol_Text] = ImVec4{.05f, .05f, .05f, 1.0f}
#define btn_text_off colors[ImGuiCol_Text] = ImVec4{1.0f, 1.0f, 1.0f, 1.0f}
#define dfu_text_light colors[ImGuiCol_Text] = ImVec4{1.0f, 1.0f, 1.0f, 1.0f}
#define dfu_text_dark colors[ImGuiCol_Text] = ImVec4{1.0f, 1.0f, 1.0f, 0.3f}
#define size(x,y) ImVec2(x,y)
#define pos(x,y) ImVec2(x,y)
/* Fonts we have loaded into memory */
#define SF_Reg 0
#define SF_Med 2
#define SF_Bold 1
#define SF_Sm_Bold 3
#define Hack 4
#define SF_RoundBold 5
#define SF_RegMed 6
#define SF_BoldLarge 7
#define WHITE ImVec4{1.0f, 1.0f, 1.0f, 1.0f}
void ImageRotated(ImTextureID tex_id, ImVec2 center, ImVec2 size, float angle);
void draw_box(ImVec2 location, ImVec2 size, ImVec4 color, float radius);
void reset_design(void);
void reset_views(void);
bool is_hovered(const char* id, int w, int h);
bool is_pressed(const char* id, int w, int h);
void anim_btn(const char* id, ImVec2 size, ImVec2 size_to, ImVec2 pos, ImVec2 pos_to);
void anim_box(const char* id, ImVec2 size, ImVec2 size_to, ImVec2 pos, ImVec2 pos_to);
void label(const char *text, ImVec2 location, ImVec4 color, int font);
void rotate_image(const char *image, ImVec2 pos, ImVec2 size, float angle, float speed);
std::string addstr2(const char *str1, const char *str2);
std::string addstr3(const char *str1, const char *str2, const char *str3);
std::string addstr4(const char *str1, const char *str2, const char *str3, const char *str4);
void image_btn_style_alt(void);
void init_style(void);
void init_colors(void);
ImVec4 hex_color(int hex, float alpha);
ImColor hex_imcolor(int hex, float alpha);
void image_btn_style();
extern float btn_w;
extern float btn_h;
extern float btn_x;
extern float btn_y;
extern float box_w;
extern float box_h;
extern float box_x;
extern float box_y;
#endif
-36
View File
@@ -1,36 +0,0 @@
#ifndef GUI_H
#define GUI_H
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#define WINDOW_X 0
#define WINDOW_Y 0
#define WINDOW_SIZE_X 550
#define WINDOW_SIZE_Y 300
#define WINDOW_TITLE "palera1n"
#define WINDOW_RESIZE false
#define WINDOW_RESTORE true
#define WINDOW_ALLOW_FULLSCREEN false
#define WINDOW_BORDERLESS false
#define WINDOW_DECORATIONS true
#define IDLE false
#define TARGET_FPS 60
#define CONFIG_FILE "palera1n.ini"
#define EMBED_ASSETS true
#define ASSETS_DIRECTORY "assets"
#define NORMAL_MODE 1
#define RECOVERY_MODE 2
#define DFU_MODE 3
#define NONE 4
#define PONGO_MODE 5
int palera1n(int argc, char *argv[]);
#endif
-135
View File
@@ -1,135 +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 _KERNINFO_H
#define _KERNINFO_H
#include <stdbool.h>
#include <stdint.h>
#define MAX_BOOTARGS_LEN 256
#define checkrain_option_none 0x00000000
#define checkrain_option_all 0x7fffffff
#define checkrain_option_failure 0x80000000
// Host options
#define checkrain_option_verbose_logging (1 << 0)
#define checkrain_option_demote (1 << 1)
#define checkrain_option_early_exit (1 << 2)
#define checkrain_option_quick_mode (1 << 3)
#define checkrain_option_pongo_shell (1 << 4)
#define checkrain_option_pongo_full (1 << 5)
// KPF options
#define checkrain_option_verbose_boot (1 << 0)
// Global options
#define checkrain_option_safemode (1 << 0)
#define checkrain_option_bind_mount (1 << 1)
#define checkrain_option_overlay (1 << 2)
#define checkrain_option_force_revert (1 << 7) /* keep this at 7 */
// palera1n option
#define palerain_option_rootful (1 << 0) /* rootful jailbreak */
#define palerain_option_jbinit_log_to_file (1 << 1) /* log to /cores/jbinit.log */
#define palerain_option_setup_rootful (1 << 2) /* create fakefs */
#define palerain_option_setup_rootful_forced (1 << 3) /* create fakefs over an existing one */
#define palerain_option_setup_partial_root (1 << 4) /* fakefs creating should be partial */
#define palerain_option_checkrain_is_clone (1 << 5) /* supplied checkra1n is checkra1n clone */
#define palerain_option_rootless_livefs (1 << 6) /* mount root livefs on rootless */
/* reserved values */
// #define palerain_option_no_ssv (1 << 7) /* no signed system volume */
// #define palerain_option_force_fakefs (1 << 8) /* force fakefs, even without SSV */
// #define palerain_option_rootless (1 << 9) /* rootless jailbreak */
#define palerain_option_clean_fakefs (1 << 10) /* clean fakefs, but does not delete it */
#ifdef DEV_BUILD
#define palerain_option_test1 (1 << 29)
#define palerain_option_test2 (1 << 30)
#endif
// palerain host options
#define host_option_dfuhelper_only (1 << 0) /* dfuhelper only */
#define host_option_pongo_exit (1 << 1) /* boot to clean pongo shell */
#ifdef TUI
#define host_option_tui (1 << 2) /* use terminal user interface */
#else
#define host_option_res1 (1 << 2) /* reserved */
#endif
#define host_option_demote (1 << 3) /* Demote effective production fuse status */
// (1 << 4) is removed
#define host_option_pongo_full (1 << 5) /* Boot to pongo with default images and options */
#define host_option_palerain_version (1 << 6) /* Print version */
#define host_option_exit_recovery (1 << 7) /* Exit recovery mode */
#define host_option_reboot_device (1 << 8) /* Reboot device in normal mode */
#define host_option_enter_recovery (1 << 9) /* Enter recovery mode */
#define host_option_device_info (1 << 10) /* Print device info */
#define host_option_no_colors (1 << 11) /* no colors */
#define PALEINFO_MAGIC 'PLSH'
#define PALEINFO_CIGAM 'HSLP'
typedef uint32_t checkrain_option_t, *checkrain_option_p;
typedef enum {
jailbreak_capability_tfp0 = 1 << 0,
jailbreak_capability_userspace_reboot = 1 << 1,
jailbreak_capability_dyld_ignore_os = 1 << 2, // TODO: This needs a better name
} jailbreak_capability_t, *jailbreak_capability_p;
#define DEFAULT_CAPABILITIES (jailbreak_capability_tfp0|jailbreak_capability_userspace_reboot)
struct kerninfo {
uint64_t size;
uint64_t base;
uint64_t slide;
checkrain_option_t flags;
};
struct paleinfo {
uint32_t magic; // 'PLSH' / 0x504c5348
uint32_t version; // 1
checkrain_option_t flags;
char rootdev[0x10];
};
struct kpfinfo {
struct kerninfo k;
checkrain_option_t kpf_flags;
char bootargs[MAX_BOOTARGS_LEN];
};
#define checkrain_set_option(options, option, enabled) do { \
if (enabled) \
options = (checkrain_option_t)(options | option); \
else \
options = (checkrain_option_t)(options & ~option); \
} while (0);
static inline bool checkrain_options_enabled(checkrain_option_t flags, checkrain_option_t opt)
{
return (flags & opt) != 0;
}
#endif
+65
View File
@@ -0,0 +1,65 @@
/*
* jbinit - https://github.com/palera1n/jbinit
*
* This file is part of jbinit
*
* SPDX-License-Identifier: MIT
*/
#ifndef PALEINFO_H
#define PALEINFO_H
#include <stdint.h>
#define PALEINFO_VERSION 2U
typedef uint64_t palerain_option_t;
// unified palera1n options
#define palerain_option_rootful (UINT64_C(1) << 0) /* rootful jailbreak */
#define palerain_option_rootless (UINT64_C(1) << 1) /* rootless jailbreak */
#define palerain_option_setup_rootful (UINT64_C(1) << 2) /* create fakefs */
/* reserved */
#define palerain_option_setup_partial_root (UINT64_C(1) << 4) /* fakefs creating should be partial */
#define palerain_option_checkrain_is_clone (UINT64_C(1) << 5) /* supplied checkra1n is checkra1n clone */
#define palerain_option_rootless_livefs (UINT64_C(1) << 6) /* mount root livefs on rootless */
// #define palerain_option_no_ssv (UINT64_C(1) << 7) /* no signed system volume */
// #define palerain_option_force_fakefs (UINT64_C(1) << 8) /* force fakefs, even without SSV */
#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_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 */
#define palerain_option_pongo_full (UINT64_C(1) << 15) /* Boot to pongo with default images and options */
#define palerain_option_palerain_version (UINT64_C(1) << 16) /* Print version */
#define palerain_option_exit_recovery (UINT64_C(1) << 17) /* Exit recovery mode */
#define palerain_option_reboot_device (UINT64_C(1) << 18) /* Reboot device in normal mode */
#define palerain_option_enter_recovery (UINT64_C(1) << 19) /* Enter recovery mode */
#define palerain_option_device_info (UINT64_C(1) << 20) /* Print device info */
#define palerain_option_no_colors (UINT64_C(1) << 21) /* no colors */
#define palerain_option_bind_mount (UINT64_C(1) << 22) /* bind mounts should be used (always true iOS 15+)*/
#define palerain_option_overlay (UINT64_C(1) << 23) /* there is an overlay (should always be true) */
#define palerain_option_force_revert (UINT64_C(1) << 24) /* Unjailbreak */
#define palerain_option_safemode (UINT64_C(1) << 25) /* Enter safe mode */
#define palerain_option_verbose_boot (UINT64_C(1) << 26) /* verbose boot */
#define palerain_option_jbinit_log_to_file (UINT64_C(1) << 50) /* make ramdisk log to file (jbinit2) */
#define palerain_option_setup_rootful_forced (UINT64_C(1) << 51) /* create fakefs over an existing one (jbinit2) */
#define palerain_option_flower_chain (UINT64_C(1) << 61) /* Flower chain */
#define palerain_option_test1 (UINT64_C(1) << 62) /* Developer test option 1 */
#define palerain_option_test2 (UINT64_C(1) << 63) /* Developer test option 2 */
#define PALEINFO_MAGIC 'PLSH'
/* paleinfo version 2, appended to ramdisk */
struct paleinfo {
uint32_t magic; /* 'PLSH' */
uint32_t version; /* 2 */
uint64_t kbase; /* kernel base */
uint64_t kslide; /* kernel slide */
uint64_t flags; /* unified palera1n flags */
char rootdev[0x10]; /* ex. disk0s1s8 */
}__attribute__((packed));
#endif
+6 -10
View File
@@ -6,7 +6,7 @@
#endif
#include "xxd-embedded.h"
#include "kerninfo.h"
#include "paleinfo.h"
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
@@ -155,8 +155,8 @@ extern char* pongo_path;
extern bool tui_started;
#endif
extern checkrain_option_t host_flags;
extern checkrain_option_p host_flags_p;
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;
@@ -165,7 +165,7 @@ extern niarelap_file_t *kpf_to_upload_1, *ramdisk_to_upload_1, *overlay_to_uploa
extern niarelap_file_t **kpf_to_upload, **ramdisk_to_upload, **overlay_to_upload;
extern override_file_t override_ramdisk, override_kpf, override_overlay;
extern uint32_t checkrain_flags, palerain_flags, kpf_flags;
extern uint64_t palerain_flags;
extern pthread_mutex_t log_mutex;
extern pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex;
@@ -173,11 +173,7 @@ 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 checkrain_flags_cmd[0x20];
extern char palerain_flags_cmd[0x20];
extern char kpf_flags_cmd[0x20];
extern char dtpatch_cmd[0x20];
extern char rootfs_cmd[512];
extern char palerain_flags_cmd[0x30];
extern char* ext_checkra1n;
void thr_cleanup(void* ptr);
@@ -230,7 +226,7 @@ void print_credits(void);
#ifdef TUI
#include <newt.h>
newtComponent get_tui_log();
newtComponent get_tui_log(void);
newtComponent set_tui_log(newtComponent co);
#endif
#endif
+10 -10
View File
@@ -11,7 +11,7 @@
#include <locale.h>
#include <unistd.h>
#include <newt.h>
#include <kerninfo.h>
#include <paleinfo.h>
#define WIDTH 76
#define HEIGHT 19
@@ -20,7 +20,7 @@
#define PI_STEP_CURRENT NEWT_COLORSET_CUSTOM(1)
#define PI_STEP_OTHER NEWT_COLORSET_CUSTOM(2)
#define CHECKBOX_STATE(flags, opt) checkrain_options_enabled(flags, opt) ? '*' : ' '
#define CHECKBOX_STATE(flags, opt) (flags & opt) != 0 ? '*' : ' '
typedef enum tui_screens {
ERROR_SCREEN = -1,
@@ -33,17 +33,17 @@ typedef enum tui_screens {
} tui_screen_t;
typedef struct bitfield_checkbox_info {
checkrain_option_p flags_p;
checkrain_option_t opt;
uint64_t* flags_p;
uint64_t opt;
} tui_bit_info_t;
tui_screen_t tui_screen_main();
tui_screen_t tui_screen_options();
tui_screen_t tui_screen_enter_recovery();
tui_screen_t tui_screen_enter_dfu();
tui_screen_t tui_screen_jailbreak();
tui_screen_t tui_screen_main(void);
tui_screen_t tui_screen_options(void);
tui_screen_t tui_screen_enter_recovery(void);
tui_screen_t tui_screen_enter_dfu(void);
tui_screen_t tui_screen_jailbreak(void);
int redraw_screen();
int redraw_screen(void);
#endif
+7 -2
View File
@@ -8,10 +8,15 @@ Depends: usbmuxd
Section: Utilities
Priority: optional
Homepage: https://palera.in
Description: iOS 15.0-16.5 semi-tethered checkm8 jailbreak
palera1n is an iOS/iPadOS 15.0-16.5 semi tethered jailbreak
Description: iOS 15.0-16.5.1 semi-tethered checkm8 jailbreak
palera1n is an iOS/iPadOS 15.0-16.5.1 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.
-27
View File
@@ -1,27 +0,0 @@
class Palera1n < Formula
desc "iOS 15.0-16.3.1 semi-tethered checkm8 jailbreak"
homepage "https://palera.in/"
url ""
version "2.0.0"
sha256 ""
license "MIT"
depends_on "cmake" => :build
depends_on "libimobiledevice" => :build
depends_on "libirecovery" => :build
depends_on "libusb" => :build
depends_on "libusbmuxd" => :build
depends_on "mbedtls" => :build
depends_on "pkg-config" => :build
depends_on "readline" => :build
def install
system "cmake", "."
system "make"
bin.install "output/palera1n" => "palera1n"
end
test do
system "false"
end
end
-6
View File
@@ -1,6 +0,0 @@
[Desktop Entry]
Name=palera1n
Exec=~/usr/local/bin
Icon=~/.palera1n/icon.ico
Terminal=false
Type=Application
+4 -17
View File
@@ -56,13 +56,7 @@ BUILD_OPTIONS += TUI
CFLAGS += -DTUI
endif
ifeq ($(GUI),1)
CXXOBJECTS = gui_alerts.o gui_design.o gui_device.o gui_main.o
BUILD_OPTIONS += GUI
CFLAGS += -DGUI
endif
CHECKRA1N_VERSION ?= 0.1337.1
CHECKRA1N_VERSION ?= 0.1337.2
LIPO = lipo
LDID = ldid
@@ -86,7 +80,7 @@ CFLAGS += -DUSE_LIBUSB=1
LIBS += $(DEP)/lib/libusb-1.0.a
endif
ifneq ($(ROOTFUL),0)
ifeq ($(ROOTFUL),1)
CFLAGS += -DROOTFUL=1
BUILD_OPTIONS += ROOTFUL
endif
@@ -131,15 +125,8 @@ xxd-%.c: %
%.o: %.c $(wildcard ../include/*.h)
$(CC) -c $(CFLAGS) $<
%.o: %.cpp $(wildcard ../include/*.h)
$(CXX) -c $(CXXFLAGS) $<
palera1n: $(OBJECTS)
ifeq ($(GUI),1)
$(CXX) $(LDFLAGS) $(OBJECTS) $(CXXOBJECTS) $(LIBS) -o palera1n
else
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $(LIBS) -o palera1n
endif
ifeq (,$(findstring macosx, $(CFLAGS)))
ifneq (,$(findstring version-min=, $(CFLAGS)))
$(LDID) -Susb.xml palera1n
@@ -150,7 +137,7 @@ libcheckra1nhelper.dylib: chkstk.S
$(CC) $(CFLAGS) $(LDFLAGS) -shared chkstk.S -o libcheckra1nhelper.dylib
checkra1n-kpf-pongo:
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/checkra1n-kpf-pongo
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/iOS15/checkra1n-kpf-pongo
ramdisk.dmg:
curl -LO https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg
@@ -159,7 +146,7 @@ binpack.dmg:
curl -LO https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg
Pongo.bin:
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/Pongo.bin
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/iOS15/Pongo.bin
clean:
rm -rf *.o palera1n checkra1n checkra1n.c palera1n.dSYM libcheckra1nhelper.dylib
+25 -19
View File
@@ -37,7 +37,7 @@ int dfuhelper_thr_running = false;
void step(int time, int time2, char *text, bool (*cond)(uint64_t), uint64_t cond_arg) {
for (int i = time2; i < time; i++) {
printf(
checkrain_options_enabled(host_flags, host_option_no_colors)
(palerain_flags & palerain_option_no_colors)
? "\r\033[K%s (%d)"
: BCYN "\r\033[K%s (%d)" CRESET, text, time - i + time2
);
@@ -46,7 +46,7 @@ void step(int time, int time2, char *text, bool (*cond)(uint64_t), uint64_t cond
if (cond != NULL && cond(cond_arg)) pthread_exit(NULL);
}
printf(
checkrain_options_enabled(host_flags, host_option_no_colors)
(palerain_flags & palerain_option_no_colors)
? "\r%s (%d)"
: CYN "\r%s (%d)" CRESET, text, time2
);
@@ -68,7 +68,7 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
return -1;
}
if (!strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) {
if (!checkrain_options_enabled(host_flags, host_option_device_info))
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);
@@ -79,14 +79,14 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
}
if (passcode_state) {
LOG(LOG_ERROR, "Passcode must be disabled on this device");
if (!checkrain_options_enabled(host_flags, host_option_device_info))
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 (checkrain_options_enabled(host_flags, host_option_device_info)) {
if ((palerain_flags & palerain_option_device_info)) {
printf("Mode: normal\n");
printf("ProductType: %s\n", dev.productType);
printf("Architecture: %s\n", dev.CPUArchitecture);
@@ -98,10 +98,16 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
unsubscribe_cmd();
return 0;
}
LOG(LOG_INFO, "Telling device with udid %s to enter recovery mode immediately", usbmuxd_device->udid);
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 (checkrain_options_enabled(host_flags, host_option_enter_recovery)) {
if ((palerain_flags & palerain_option_enter_recovery)) {
device_has_booted = true;
set_spin(0);
unsubscribe_cmd();
@@ -181,9 +187,9 @@ void device_event_cb(const usbmuxd_event_t *event, void* userdata) {
switch (event->event) {
case UE_DEVICE_ADD:
LOG(LOG_VERBOSE, "Normal mode device connected");
if (checkrain_options_enabled(host_flags, host_option_exit_recovery)) {
if ((palerain_flags & palerain_option_exit_recovery)) {
break;
} else if (checkrain_options_enabled(host_flags, host_option_reboot_device)) {
} else if ((palerain_flags & palerain_option_reboot_device)) {
int ret = reboot_cmd(event->device.udid);
if (!ret) {
LOG(LOG_INFO, "Restarted device");
@@ -211,9 +217,9 @@ void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) {
event->mode == IRECV_K_RECOVERY_MODE_2 ||
event->mode == IRECV_K_RECOVERY_MODE_3 ||
event->mode == IRECV_K_RECOVERY_MODE_4) {
if (!checkrain_options_enabled(host_flags, host_option_device_info))
if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_VERBOSE, "Recovery mode device %ld connected", event->device_info->ecid);
if (checkrain_options_enabled(host_flags, host_option_exit_recovery)) {
if ((palerain_flags & palerain_option_exit_recovery)) {
ret = exitrecv_cmd(event->device_info->ecid);
if (!ret) {
LOG(LOG_INFO, "Exited recovery mode");
@@ -228,7 +234,7 @@ void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) {
break;
}
if (checkrain_options_enabled(host_flags, host_option_device_info)) {
if ((palerain_flags & palerain_option_device_info)) {
recvinfo_t info;
ret = recvinfo_cmd(&info, event->device_info->ecid);
if (ret) {
@@ -247,14 +253,14 @@ void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) {
break;
}
if (checkrain_options_enabled(host_flags, host_option_enter_recovery) ||
checkrain_options_enabled(host_flags, host_option_reboot_device)) return;
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 (!checkrain_options_enabled(host_flags, host_option_device_info))
if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_VERBOSE, "DFU mode device %ld connected", event->device_info->ecid);
if (checkrain_options_enabled(host_flags, host_option_device_info)) {
if ((palerain_flags & palerain_option_device_info)) {
recvinfo_t info;
ret = recvinfo_cmd(&info, event->device_info->ecid);
if (ret) {
@@ -274,9 +280,9 @@ void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) {
}
if (
checkrain_options_enabled(host_flags, host_option_exit_recovery) ||
checkrain_options_enabled(host_flags, host_option_enter_recovery) ||
checkrain_options_enabled(host_flags, host_option_reboot_device)) {
(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);
+3 -3
View File
@@ -126,11 +126,11 @@ int exec_checkra1n(void) {
#endif
checkra1n_exec: {};
char args[0x10] = "-E";
if (checkrain_options_enabled(host_flags, host_option_demote)) strncat(args, "d", 0xf);
if (!checkrain_options_enabled(host_flags, palerain_option_checkrain_is_clone)) {
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 (checkrain_options_enabled(host_flags, host_option_no_colors)) strncat(args, "n", 0xf);
if ((palerain_flags & palerain_option_no_colors)) strncat(args, "n", 0xf);
} else {
strncat(args, "R", 0xf);
}
-67
View File
@@ -1,67 +0,0 @@
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <gui.h>
// 50/50 chance this will be removed for in-window alerts
#if __APPLE__
#include <CoreFoundation/CoreFoundation.h>
#define IDOK 1
#define IDCANCEL 2
#define AL kCFUserNotificationNoteAlertLevel
#elif _WIN32
#include <windows.h>
#include <winuser.h>
#elif __linux__
// #include <gtk/gtk.h>
#elif BSD
#elif __ANDROID__
#else
#endif
void send_alert(const char *title, const char *msg) {
#if __APPLE__
CFStringRef header_ref = CFStringCreateWithCString(NULL, title, strlen(title));
CFStringRef message_ref = CFStringCreateWithCString(NULL, msg, strlen(msg));
// CFStringRef url_ref = CFStringCreateWithCString( NULL, "", strlen("") );
CFURLRef icon_ref = CFURLCreateWithString(kCFAllocatorDefault, NULL, NULL);
CFOptionFlags result;
CFUserNotificationDisplayAlert(0, AL, icon_ref, NULL, NULL, header_ref, message_ref, NULL, NULL, NULL, &result);
CFRelease(header_ref);
CFRelease(message_ref);
#elif _WIN32
MessageBox(0, msg, title, MB_OK);
#elif __linux__
char line[256];
FILE *fp;
fp=popen("zenity --version","r");
if (fp==NULL) {
perror("Pipe returned a error");
} else {
while (fgets(line,sizeof(line),fp)) printf("%s",line);
pclose(fp);
}
char *str_msg = (char*)malloc(40+strlen(title)+strlen(msg)+1);
sprintf(str_msg, "zenity --info --title '%s' --text '%s'", title, msg);
fp=popen(str_msg, "r");
if (fp==NULL) {
perror("Pipe returned a error");
} else {
printf("Exit code: %i\n",WEXITSTATUS(pclose(fp)));
}
#elif BSD
#elif __ANDROID__
#else
#endif
}
-372
View File
@@ -1,372 +0,0 @@
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include <stdarg.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <hello_imgui/hello_imgui.h>
#include <imgui/imgui_internal.h>
#include <common.h>
#include <design.h>
/* ----------------- [ Animation Varibles ] ----------------- */
float btn_w = 0.0f;
float btn_h = 0.0f;
float btn_x = 0.0f;
float btn_y = 0.0f;
float box_w = 0.0f;
float box_h = 0.0f;
float box_x = 0.0f;
float box_y = 0.0f;
/* ----------------- [ UI Init/Reset ] ----------------- */
void init_colors() {
auto &colors = ImGui::GetStyle().Colors;
colors[ImGuiCol_WindowBg] = ImVec4{0.21f, 0.23f, 0.31f, 1.0f};
colors[ImGuiCol_MenuBarBg] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
// Border
colors[ImGuiCol_Border] = ImVec4{0.44f, 0.37f, 0.61f, 0.0f};
colors[ImGuiCol_BorderShadow] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
// Text
colors[ImGuiCol_Text] = ImVec4{1.0f, 1.0f, 1.0f, 1.0f};
colors[ImGuiCol_TextDisabled] = ImVec4{0.5f, 0.5f, 0.5f, 1.0f};
// Headers
colors[ImGuiCol_Header] = ImVec4{0.13f, 0.13f, 0.17, 1.0f};
colors[ImGuiCol_HeaderHovered] = ImVec4{0.19f, 0.2f, 0.25f, 1.0f};
colors[ImGuiCol_HeaderActive] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
// Buttons
colors[ImGuiCol_Button] = ImVec4{0.9f, 0.9f, 0.9f, 1.0f};
colors[ImGuiCol_ButtonHovered] = ImVec4{0.9f, 0.9f, 0.9f, 1.0f};
colors[ImGuiCol_ButtonActive] = ImVec4{0.9f, 0.9f, 0.9f, 1.0f};
colors[ImGuiCol_CheckMark] = ImVec4{0.9f, 0.9f, 0.9f, 1.0f};
// Popups
colors[ImGuiCol_PopupBg] = ImVec4{0.1f, 0.1f, 0.13f, 0.92f};
// Slider
colors[ImGuiCol_SliderGrab] = ImVec4{0.44f, 0.37f, 0.61f, 0.54f};
colors[ImGuiCol_SliderGrabActive] = ImVec4{0.74f, 0.58f, 0.98f, 0.54f};
// Frame BG
colors[ImGuiCol_FrameBg] = ImVec4{0.13f, 0.13f, 0.15f, 0.7f};
colors[ImGuiCol_FrameBgHovered] = ImVec4{0.13f, 0.13f, 0.15f, 0.7f};
colors[ImGuiCol_FrameBgActive] = ImVec4{0.13f, 0.13f, 0.15f, 0.7f};
// Tabs
colors[ImGuiCol_Tab] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_TabHovered] = ImVec4{0.24, 0.24f, 0.32f, 1.0f};
colors[ImGuiCol_TabActive] = ImVec4{0.2f, 0.22f, 0.27f, 1.0f};
colors[ImGuiCol_TabUnfocused] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_TabUnfocusedActive] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
// Title
colors[ImGuiCol_TitleBg] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_TitleBgActive] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_TitleBgCollapsed] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
// Scrollbar
colors[ImGuiCol_ScrollbarBg] = ImVec4{0.1f, 0.1f, 0.13f, 1.0f};
colors[ImGuiCol_ScrollbarGrab] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4{0.19f, 0.2f, 0.25f, 1.0f};
colors[ImGuiCol_ScrollbarGrabActive] = ImVec4{0.24f, 0.24f, 0.32f, 1.0f};
// Seperator
colors[ImGuiCol_Separator] = ImVec4{0.44f, 0.37f, 0.61f, 1.0f};
colors[ImGuiCol_SeparatorHovered] = ImVec4{0.74f, 0.58f, 0.98f, 1.0f};
colors[ImGuiCol_SeparatorActive] = ImVec4{0.84f, 0.58f, 1.0f, 1.0f};
// Resize Grip
colors[ImGuiCol_ResizeGrip] = ImVec4{0.44f, 0.37f, 0.61f, 0.29f};
colors[ImGuiCol_ResizeGripHovered] = ImVec4{0.74f, 0.58f, 0.98f, 0.29f};
colors[ImGuiCol_ResizeGripActive] = ImVec4{0.84f, 0.58f, 1.0f, 0.29f};
// Docking
colors[ImGuiCol_DockingPreview] = ImVec4{0.44f, 0.37f, 0.61f, 1.0f};
}
void init_style() {
auto &style = ImGui::GetStyle();
style.TabRounding = 0;
style.ScrollbarRounding = 0;
style.WindowRounding = 0;
style.GrabRounding = 0;
style.FrameRounding = 20;
style.PopupRounding = 0;
style.ChildRounding = 0;
}
void reset_design() {
ImGui::SetCursorPos(ImVec2(0, 0));
init_colors();
init_style();
}
void reset_views() {
waiting_for_device = false;
unsupported_device = false;
supported_device = false;
recovery_wait = false;
jailbreak = false;
enter_dfu = false;
dfu_helper = false;
}
/* ----------------- [ UI Element Styles ] ----------------- */
void image_btn_style() {
auto &colors = ImGui::GetStyle().Colors;
colors[ImGuiCol_Button] = ImVec4{1.0f, 1.0f, 1.0f, 1.0f};
colors[ImGuiCol_ButtonHovered] = ImVec4{0.95f, 0.95f, 0.95f, 1.0f};
colors[ImGuiCol_ButtonActive] = ImVec4{0.95f, 0.95f, 0.95f, 1.0f};
colors[ImGuiCol_CheckMark] = ImVec4{0.95f, 0.95f, 0.95f, 1.0f};
colors[ImGuiCol_Text] = ImVec4{0.1f, 0.1f, 0.1f, 1.0f};
}
void image_btn_style_alt() {
auto &colors = ImGui::GetStyle().Colors;
colors[ImGuiCol_Button] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
colors[ImGuiCol_ButtonHovered] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
colors[ImGuiCol_ButtonActive] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
colors[ImGuiCol_CheckMark] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
colors[ImGuiCol_Text] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
}
/* ----------------- [ IDK Anymore ] ----------------- */
std::string addstr2(const char *str1, const char *str2) {
size_t str1_len = strlen(str1);
size_t str2_len = strlen(str2);
int buf_size = (int)str1_len + (int)str2_len + 1;
char buffer[buf_size];
sprintf(buffer, str1, str2);
return buffer;
}
std::string addstr3(const char *str1, const char *str2, const char *str3) {
size_t str1_len = strlen(str1);
size_t str2_len = strlen(str2);
size_t str3_len = strlen(str3);
int buf_size = (int)str1_len + (int)str2_len + (int)str3_len + 1;
char buffer[buf_size];
sprintf(buffer, str1, str2, str3);
return buffer;
}
std::string addstr4(const char *str1, const char *str2, const char *str3, const char *str4) {
size_t str1_len = strlen(str1);
size_t str2_len = strlen(str2);
size_t str3_len = strlen(str3);
size_t str4_len = strlen(str4);
int buf_size = (int)str1_len + (int)str2_len + (int)str3_len + (int)str4_len + 1;
char buffer[buf_size];
sprintf(buffer, str1, str2, str3, str4);
return buffer;
}
/* ----------------- [ UI Colors ] ----------------- */
ImVec4 hex_color(int hex, float alpha) {
float r = ((hex >> 16) & 0xFF) / 255.0f;
float g = ((hex >> 8) & 0xFF) / 255.0f;
float b = ((hex) & 0xFF) / 255.0f;
return ImVec4{r, g, b, alpha};
}
ImColor hex_imcolor(int hex, float alpha) {
float r = ((hex >> 16) & 0xFF) / 255.0f;
float g = ((hex >> 8) & 0xFF) / 255.0f;
float b = ((hex) & 0xFF) / 255.0f;
return ImColor{r, g, b, alpha};
}
/* ----------------- [ UI Element States ] ----------------- */
bool is_hovered(const char* id, int w, int h) {
ImGuiContext& g = *GImGui;
ImGuiWindow* window = ImGui::GetCurrentWindow();
ImGuiID btn_id = window->GetID(id);
const ImRect bb(window->DC.CursorPos, ImVec2(window->DC.CursorPos.x + w, window->DC.CursorPos.x + h));
bool hovered = false;
ImGui::ButtonBehavior(bb,btn_id,&hovered,NULL);
return hovered;
}
bool is_pressed(const char* id, int w, int h) {
ImGuiContext& g = *GImGui;
ImGuiWindow* window = ImGui::GetCurrentWindow();
ImGuiID btn_id = window->GetID(id);
const ImRect bb(window->DC.CursorPos, ImVec2(window->DC.CursorPos.x + w, window->DC.CursorPos.x + h));
bool pressed = false;
ImGui::ButtonBehavior(bb,btn_id,NULL,&pressed);
return pressed;
}
/* ----------------- [ Common UI Types ] ----------------- */
void label(const char *text, ImVec2 location, ImVec4 color, int font) {
auto &style = ImGui::GetStyle();
ImGuiIO &io = ImGui::GetIO();
ImGui::SetCursorPos(location);
ImGui::PushFont(io.Fonts->Fonts[font]);
auto &colors = ImGui::GetStyle().Colors;
colors[ImGuiCol_Text] = color;
ImGui::Text(text);
ImGui::PopFont();
reset_design();
}
void draw_box(ImVec2 location, ImVec2 size, ImVec4 color, float radius) {
auto &colors = ImGui::GetStyle().Colors;
auto &style = ImGui::GetStyle();
float temp_rounding = style.FrameRounding;
ImVec4 temp_color_idle = colors[ImGuiCol_FrameBg];
ImVec4 temp_color_hover = colors[ImGuiCol_FrameBgHovered];
ImVec4 temp_color_active = colors[ImGuiCol_FrameBgActive];
style.FrameRounding = radius;
colors[ImGuiCol_FrameBg] = color;
colors[ImGuiCol_FrameBgHovered] = color;
colors[ImGuiCol_FrameBgActive] = color;
ImGui::SetCursorPos(location);
ImGui::ProgressBar(0.0f, size, "");
style.FrameRounding = temp_rounding;
colors[ImGuiCol_FrameBg] = temp_color_idle;
colors[ImGuiCol_FrameBgHovered] = temp_color_hover;
colors[ImGuiCol_FrameBgActive] = temp_color_active;
}
/* ----------------- [ Animation Systems ] ----------------- */
void anim_btn(const char* id, ImVec2 size, ImVec2 size_to, ImVec2 pos, ImVec2 pos_to) {
ImGuiIO &io = ImGui::GetIO();
float global = 25.0f;
bool new_w_positive,new_h_positive,new_x_positive,new_y_positive = false;
float new_w,new_h,new_x,new_y = 0.0f;
float lrg_size,lrg_pos,lrg = 0.0f;
if (size.x > size_to.x) {new_w = size.x - size_to.x; new_w_positive = false;}
else {new_w = size_to.x - size.x; new_w_positive = true;}
if (size.y > size_to.y) {new_h = size.y - size_to.y; new_h_positive = false;}
else {new_h = size_to.y - size.y;new_h_positive = true;}
if (pos.x > pos_to.x) {new_x = pos.x - pos_to.x; new_x_positive = false;}
else {new_x = pos_to.x - pos.x;new_x_positive = true;}
if (pos.y > pos_to.y) {new_y = pos.y - pos_to.y; new_y_positive = false;}
else {new_y = pos_to.y - pos.y;new_y_positive = true;}
if (new_w > new_h) lrg_size = new_w;
else lrg_size = new_h;
if (new_x > new_y) lrg_pos = new_x;
else lrg_pos = new_y;
if (lrg_size > lrg_pos) lrg = lrg_size;
else lrg = lrg_pos;
if (new_w_positive) {if (btn_w < size_to.x) btn_w += (new_w / lrg) * global * io.DeltaTime;}
else {if (btn_w > size_to.x) btn_w -= (new_w / lrg) * global * io.DeltaTime;}
if (new_h_positive) {if (btn_h < size_to.y) btn_h += (new_h / lrg) * global * io.DeltaTime;}
else {if (btn_h > size_to.y) btn_h -= (new_h / lrg) * global * io.DeltaTime;}
if (new_x_positive) {if (btn_x < pos_to.x) btn_x += (new_x / lrg) * global * io.DeltaTime;}
else {if (btn_x > pos_to.x) btn_x -= (new_x / lrg) * global * io.DeltaTime;}
if (new_y_positive) {if (btn_y < pos_to.y) btn_y += (new_y / lrg) * global * io.DeltaTime;}
else {if (btn_y > pos_to.y) btn_y -= (new_y / lrg) * global * io.DeltaTime;}
}
void anim_box(const char* id, ImVec2 size, ImVec2 size_to, ImVec2 pos, ImVec2 pos_to) {
ImGuiIO &io = ImGui::GetIO();
float global = 500.0f;
bool new_w_positive,new_h_positive,new_x_positive,new_y_positive = false;
float new_w,new_h,new_x,new_y = 0.0f;
float lrg_size,lrg_pos,lrg = 0.0f;
if (size.x > size_to.x) {new_w = size.x - size_to.x; new_w_positive = false;}
else {new_w = size_to.x - size.x; new_w_positive = true;}
if (size.y > size_to.y) {new_h = size.y - size_to.y; new_h_positive = false;}
else {new_h = size_to.y - size.y;new_h_positive = true;}
if (pos.x > pos_to.x) {new_x = pos.x - pos_to.x; new_x_positive = false;}
else {new_x = pos_to.x - pos.x;new_x_positive = true;}
if (pos.y > pos_to.y) {new_y = pos.y - pos_to.y; new_y_positive = false;}
else {new_y = pos_to.y - pos.y;new_y_positive = true;}
if (new_w > new_h) lrg_size = new_w;
else lrg_size = new_h;
if (new_x > new_y) lrg_pos = new_x;
else lrg_pos = new_y;
if (lrg_size > lrg_pos) lrg = lrg_size;
else lrg = lrg_pos;
if (new_w_positive) {if (box_w < size_to.x) box_w += (new_w / lrg) * global * io.DeltaTime;}
else {if (box_w > size_to.x) box_w -= (new_w / lrg) * global * io.DeltaTime;}
if (new_h_positive) {if (box_h < size_to.y) box_h += (new_h / lrg) * global * io.DeltaTime;}
else {if (box_h > size_to.y) box_h -= (new_h / lrg) * global * io.DeltaTime;}
if (new_x_positive) {if (box_x < pos_to.x) box_x += (new_x / lrg) * global * io.DeltaTime;}
else {if (box_x > pos_to.x) box_x -= (new_x / lrg) * global * io.DeltaTime;}
if (new_y_positive) {if (box_y < pos_to.y) box_y += (new_y / lrg) * global * io.DeltaTime;}
else {if (box_y > pos_to.y) box_y -= (new_y / lrg) * global * io.DeltaTime;}
}
static inline ImVec2 operator+(const ImVec2 &lhs, const ImVec2 &rhs) {
return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y);
}
void ImageRotated(ImTextureID tex_id, ImVec2 center, ImVec2 size, float angle) {
ImDrawList *draw_list = ImGui::GetWindowDrawList();
float cos_a = cosf(angle);
float sin_a = sinf(angle);
ImVec2 pos[4] = {
center + ImRotate(ImVec2(-size.x * 0.5f, -size.y * 0.5f), cos_a, sin_a),
center + ImRotate(ImVec2(+size.x * 0.5f, -size.y * 0.5f), cos_a, sin_a),
center + ImRotate(ImVec2(+size.x * 0.5f, +size.y * 0.5f), cos_a, sin_a),
center + ImRotate(ImVec2(-size.x * 0.5f, +size.y * 0.5f), cos_a, sin_a)};
ImVec2 uvs[4] = {
ImVec2(0.0f, 0.0f),
ImVec2(1.0f, 0.0f),
ImVec2(1.0f, 1.0f),
ImVec2(0.0f, 1.0f)};
draw_list->AddImageQuad(tex_id, pos[0], pos[1], pos[2], pos[3], uvs[0], uvs[1], uvs[2], uvs[3], IM_COL32_WHITE);
}
void rotate_image(const char *image, ImVec2 pos, ImVec2 size, float angle, float speed) {
ImGuiIO &io = ImGui::GetIO();
ImTextureID image_texture = HelloImGui::ImTextureIdFromAsset(image);
static float image_angle = angle;
image_angle += io.DeltaTime * speed;
ImVec2 image_center = ImVec2(pos.x, pos.y);
ImGui::SetCursorPos(pos);
ImageRotated(image_texture, image_center, size, image_angle);
}
-133
View File
@@ -1,133 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdbool.h>
#include <unistd.h>
#include <ctype.h>
#include <libimobiledevice/libimobiledevice.h>
#include <libimobiledevice/lockdown.h>
#include <libimobiledevice/diagnostics_relay.h>
#include <plist/plist.h>
#include <libirecovery.h>
#include <usbmuxd.h>
#include <common.h>
extern "C" {
#include <palerain.h>
#include <gui.h>
}
/*
This will all be removed and merged
into devhelper.c and dfuhelper.c
later on, so for now it stays ig
*/
irecv_device_event_context_t irecvctx_gui = NULL;
usbmuxd_subscription_context_t usbmuxdctx_gui = NULL;
int device_status = DISCONNECTED;
devinfo_t dev;
char const *udid_gui;
int connected_normal_mode_gui(const usbmuxd_device_info_t *usbmuxd_device) {
int ret;
ret = devinfo_cmd(&dev, usbmuxd_device->udid);
if (ret != 0) {
LOG(LOG_ERROR, "Unable to get device information");
return 0;
}
udid_gui = usbmuxd_device->udid;
device_status = NORMAL;
if (strcmp(dev.CPUArchitecture, "arm64")) {
LOG(LOG_WARNING, "Ignoring non-arm64 device...");
return -1;
}
if (!strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) {
if (!checkrain_option_enabled(host_flags, host_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 (!checkrain_option_enabled(host_flags, host_option_device_info))
LOG(LOG_ERROR, "Additionally, passcode must never be set since restore on iOS 16+");
devinfo_free(&dev);
return -1;
}
}
}
void device_event_cb_gui(const usbmuxd_event_t *event, void* userdata) {
if (event->device.conn_type != CONNECTION_TYPE_USB) return;
switch (event->event) {
case UE_DEVICE_ADD:
fprintf(stderr, "Normal mode device connected\n");
connected_normal_mode_gui(&event->device);
break;
case UE_DEVICE_REMOVE:
fprintf(stderr, "Normal mode device disconnected\n");
device_status = DISCONNECTED;
devinfo_free(&dev);
if (supported_device || unsupported_device) {
supported_device = false;
unsupported_device = false;
waiting_for_device = true;
}
break;
}
}
void irecv_device_event_cb_gui(const irecv_device_event_t *event, void* userdata) {
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) {
fprintf(stderr, "Recovery mode device %llu connected\n", event->device_info->ecid);
recvinfo_t info;
recvinfo_cmd(&info, event->device_info->ecid);
printf("Mode: recovery\n");
printf("ProductType: %s\n", info.product_type);
printf("DisplayName: %s\n", info.display_name);
device_status = RECOVERY;
if (waiting_for_device) {
device_status = RECOVERY;
exitrecv_cmd(event->device_info->ecid);
send_alert("Device in Recovery", "Exiting recovery, device must start from normal mode.");
}
} else if (event->mode == IRECV_K_DFU_MODE) {
device_status == DFU;
fprintf(stderr, "DFU mode device %llu connected\n", event->device_info->ecid);
}
break;
case IRECV_DEVICE_REMOVE:
fprintf(stderr, "Recovery mode device disconnected\n");
device_status = DISCONNECTED;
if (enter_dfu) {
device_status = DISCONNECTED;
enter_dfu = false;
waiting_for_device = true;
}
break;
}
}
void dfuhelper() {
subscribe_cmd(device_event_cb_gui, irecv_device_event_cb_gui);
}
void guifree() {
devinfo_free(&dev);
unsubscribe_cmd();
}
-350
View File
@@ -1,350 +0,0 @@
#include <thread>
#include <iostream>
#include <math.h>
#include<unistd.h>
#include <imgui/imgui_internal.h>
#include <hello_imgui/hello_imgui.h>
#include <hello_imgui/app_window_params.h>
#include <design.h>
#include <common.h>
extern "C" {
#include <gui.h>
}
/* Bools for which view to show */
bool waiting_for_device = true;
bool unsupported_device = false;
bool supported_device = false;
bool recovery_wait = false;
bool jailbreak = false;
bool enter_dfu = false;
bool dfu_helper = false;
bool settings = false;
bool execjb = false;
uint64_t ms() {
using namespace std::chrono;
return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}
/* ----------------- [ Main Function ] ----------------- */
int main(int argc, char *argv[]) {
if (argc >= 2) {
// temp for testing
return palera1n(argc, argv);
}
dfuhelper();
/* Vars for DFU Healper */
int dfu_step1 = 3;
int dfu_step2 = 5;
int dfu_step3 = 10;
bool dfu_done = false;
bool set_ms = true;
auto desired = ms() + 1000;
/* HelloImGui Stuff */
HelloImGui::RunnerParams params;
params.fpsIdling.fpsIdle = 60.f;
params.appWindowParams.borderless = false;
params.appWindowParams.resizable = false;
params.appWindowParams.windowGeometry.size = {550, 300};
params.appWindowParams.windowTitle = "palera1n";
params.appWindowParams.restorePreviousGeometry = false;
params.imGuiWindowParams.defaultImGuiWindowType = HelloImGui::DefaultImGuiWindowType::NoDefaultWindow;
/* Color & Size Stuff */
bool open = true;
ImColor grad_color_left = ImColor(255, 177, 35);
ImColor grad_color_right = ImColor(4, 121, 168);
int grad_color_left_r = 255;
float text_alpha = 0.0f;
bool reverse_gradient = false;
/* ImGui Loop */
params.callbacks.ShowGui = [&]() {
{
/* Init colors, style, and fonts */
auto &colors = ImGui::GetStyle().Colors;
auto &style = ImGui::GetStyle();
ImGuiIO &io = ImGui::GetIO();
init_colors();
init_style();
/* Init window size and start ImGui */
ImGui::SetNextWindowSize(ImVec2(560, 300));
ImGui::SetNextWindowPos(ImVec2(-5, 0));
ImGui::Begin("palera1n", &open, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar);
/* Set our background gradient */
ImGui::SetCursorPos(ImVec2(0, 0));
ImGuiWindow* window = ImGui::GetCurrentWindow();
if (!reverse_gradient) grad_color_left_r -= FLOAT_TO_INT(io.DeltaTime * 100.f) /2;
else grad_color_left_r += FLOAT_TO_INT(io.DeltaTime * 100.f) /2;
if (grad_color_left_r <= 140) reverse_gradient = true;
if (grad_color_left_r >= 255) reverse_gradient = false;
grad_color_left = ImColor(135, 63, grad_color_left_r) ;
grad_color_right = ImColor(4, 160, grad_color_left_r) ;
auto dl(ImGui::GetWindowDrawList());
dl->AddRectFilledMultiColor(ImVec2(0, 0), // pos - x y
ImVec2(560, 300), // size - width height
grad_color_left, // color top left
hex_imcolor(0x2390b4, 1.0f), // color
hex_imcolor(0x04c2a8, 1.0f), // color
grad_color_right); // color
if (!recovery_wait && !dfu_helper && !jailbreak) {
ImTextureID settings_icon = HelloImGui::ImTextureIdFromAsset("s60.png"); // pngs will be embedded soon
ImTextureID about_icon = HelloImGui::ImTextureIdFromAsset("i60.png"); // pngs will be embedded soon
image_btn_style_alt();
ImGui::SetCursorPos(ImVec2(455, 245));
ImGui::ImageButton(about_icon, ImVec2(33.0f, 33.0f));
ImGui::SetCursorPos(ImVec2(500, 245));
ImGui::ImageButton(settings_icon, ImVec2(33.0f, 33.0f));
reset_design();
}
/* Waiting for device view */
if (waiting_for_device) {
if (device_status == NORMAL) {
const char *name = dev.displayName;
char *arch = dev.CPUArchitecture;
char *type = dev.productType;
char *version = dev.productVersion;
if (strcmp("arm64", arch) != 0) {
waiting_for_device = false;
unsupported_device = true;
btn_x = 213.0f;
btn_y = 190.0f;
btn_w = 125.0f;
btn_h = 35.0f;
} else if (strstr(version, "15") != 0 || strstr(version, "16") != 0) {
waiting_for_device = false;
supported_device = true;
btn_x = 213.0f;
btn_y = 190.0f;
btn_w = 125.0f;
btn_h = 35.0f;
}
}
box_x = 55.0f; box_y = 75.0f; box_w = 450.0f; box_h = 150.0f;
draw_box(pos(55, 75), size(450, 150), hex_color(0x000000, 0.25f), 20.0f); // box in center
rotate_image("spinner.png", pos(95, 150), size(40, 40), 0.0f, 4.0f); // loading anim in box
label("Waiting for connection...", pos(135,122), WHITE, SF_BoldLarge); // Large title
label("Connect your device in normal mode to get started!", pos(138, 157), WHITE, SF_Reg); // Sub title
/* Unsupported device view */
} else if (unsupported_device) {
anim_box("Jailbreak", ImVec2(450,150),ImVec2(300,200),ImVec2(54,75),ImVec2(129,50));
draw_box(ImVec2(box_x, box_y),ImVec2(box_w, box_h), hex_color(0x000000, 0.25f), 20.0f);
set_pos(167, 90); font(SF_Bold);
ImGui::Text("%s", dev.displayName);
ImGui::PopFont();
set_pos(167, 120); font(SF_RegMed);
ImGui::Text("%s running iOS %s (%s)", dev.productType, dev.productVersion, dev.CPUArchitecture);
colors[ImGuiCol_Text] = hex_color(0xEB5160, 1.0f);
set_pos(167, 147); ImGui::Text(ICON_FA_BAN);
colors[ImGuiCol_Text] = hex_color(0xFFFFFF, 1.0f);
ImGui::SameLine(); ImGui::Text("Unsupported device connected");
ImGui::PopFont();
set_pos(213, 190); font(SF_RoundBold); btn_text_on;
bool hovered = is_hovered("Exit", 125, 35);
bool pressed = is_pressed("Exit", 125, 35);
ImVec2 btn_size = ImVec2(120, 30);
if (hovered) {
anim_btn("Exit", ImVec2(125,35),ImVec2(127,37),ImVec2(213,190),ImVec2(212,189));
btn_size = ImVec2(btn_w, btn_h);
ImGui::SetCursorPos(ImVec2(btn_x,btn_y));
} else {
anim_btn("Exit", ImVec2(127,37),ImVec2(125,35),ImVec2(212,189),ImVec2(213,190));
btn_size = ImVec2(btn_w, btn_h);
ImGui::SetCursorPos(ImVec2(btn_x,btn_y));
}
ImGui::Button("Exit", btn_size);
if (pressed) {
exit(0);
}
/* Supported device view */
} else if (supported_device) {
anim_box("Jailbreak", ImVec2(450,150),ImVec2(300,200),ImVec2(54,75),ImVec2(129,50));
draw_box(ImVec2(box_x, box_y),ImVec2(box_w, box_h), hex_color(0x000000, 0.25f), 20.0f);
set_pos(167, 90); font(SF_Bold);
ImGui::Text("%s", dev.displayName);
ImGui::PopFont();
set_pos(167, 120); font(SF_RegMed);
ImGui::Text("%s running iOS %s (%s)", dev.productType, dev.productVersion, dev.CPUArchitecture);
colors[ImGuiCol_Text] = hex_color(0x3CFF55, 1.0f);
set_pos(167, 147); ImGui::Text(ICON_FA_CHECK_CIRCLE);
colors[ImGuiCol_Text] = hex_color(0xFFFFFF, 1.0f);
ImGui::SameLine(); ImGui::Text("Connected and ready.");
ImGui::PopFont();
set_pos(213, 190); font(SF_RoundBold); btn_text_on;
bool hovered = is_hovered("Jailbreak", 125, 35);
bool pressed = is_pressed("Jailbreak", 125, 35);
ImVec2 btn_size = ImVec2(120, 30);
if (hovered) {
anim_btn("Jailbreak", ImVec2(125,35),ImVec2(127,37),ImVec2(213,190),ImVec2(212,189));
btn_size = ImVec2(btn_w, btn_h);
ImGui::SetCursorPos(ImVec2(btn_x,btn_y));
} else {
anim_btn("Jailbreak", ImVec2(127,37),ImVec2(125,35),ImVec2(212,189),ImVec2(213,190));
btn_size = ImVec2(btn_w, btn_h);
ImGui::SetCursorPos(ImVec2(btn_x,btn_y));
}
ImGui::Button("Jailbreak", btn_size);
if (pressed) {
enter_recovery_cmd(0);
box_x = 140.0f; box_y = 55.0f; box_w = 320.0f; box_h = 240.0f;
supported_device = false;
recovery_wait = true;
btn_text_off;
ImGui::PopFont();
}
/* Waiting for recovery view */
} else if (recovery_wait) {
draw_box(ImVec2(125, 105),ImVec2(300, 90), hex_color(0x000000, 0.25f), 20.0f);
//ImageRotated(loader, ImVec2(160, 150), ImVec2(40.0f, 40.0f), angle);
set_pos(210, 138); font(SF_Bold);
ImGui::Text("Entering recovery...");
ImGui::PopFont();
if (device_status == RECOVERY) {
recovery_wait = false;
enter_dfu = true;
}
/* Ready for DFU view */
} else if (enter_dfu) {
draw_box(ImVec2(65, 105),ImVec2(450, 90), hex_color(0x000000, 0.25f), 20.0f);
set_pos(110, 128); font(SF_Bold);
ImGui::Text("Time to enter DFU mode!");
ImGui::PopFont();
set_pos(110, 153); font(SF_Reg);
ImGui::Text("Locate the power and volume down button before you proceed.");
set_pos(108, 210); font(SF_Sm_Bold); btn_text_on;
if (ImGui::Button("Start", ImVec2(125, 35))) {
enter_dfu = false;
dfu_helper = true;
btn_text_off;
ImGui::PopFont();
}
/* DFU helper view */
} else if (dfu_helper) {
draw_box(ImVec2(75, 65),ImVec2(450, 220), hex_color(0x000000, 0.5f), 20.0f);
if (dfu_step1 > 0) dfu_text_light;
else dfu_text_dark;
set_pos(110, 110); font(SF_Reg);
ImGui::Text("1. Get Ready! %d", dfu_step1);
if (dfu_step2 > 0 && dfu_step1 == 0) dfu_text_light;
else dfu_text_dark;
set_pos(110, 160); ImGui::Text("2. Hold volume down + side button %d", dfu_step2);
if (dfu_step3 > 0 && dfu_step2 == 0) dfu_text_light;
else dfu_text_dark;;
set_pos(110, 210);ImGui::Text("3. Release side button, but keep holding volume down %d", dfu_step3);
ImGui::PopFont();
if (!dfu_done) {
if (set_ms) {
desired = ms() + 1000;
set_ms = false;
}
if (ms() >= desired) {
set_ms = true;
if (dfu_step1 > 0) dfu_step1 -= 1;
else if (dfu_step2 > 0) dfu_step2 -= 1;
else if (dfu_step3 > 0) dfu_step3 -= 1;
else dfu_done = true;
}
}
if (dfu_step2 == 2) exitrecv_cmd(dev.ecid);
if (dfu_done) {
if (device_status == DFU) {
guifree();
dfu_helper = false;
jailbreak = true;
} else {
send_alert("Failed to enter DFU", "Device failed to enter DFU mode, please try again.");
dfu_step1 = 3; dfu_step2 = 5; dfu_step3 = 10;
dfu_done = false;
dfu_helper = false;
waiting_for_device = true;
}
}
/* Main Jailbreak view */
} else if (jailbreak) {
pthread_t jb;
draw_box(ImVec2(25, 70),ImVec2(500, 200), hex_color(0x000000, 0.25f), 20.0f);
set_pos(20, 15); font(SF_Bold);
ImGui::Text("Installing jailbreak...");
ImGui::PopFont();
set_pos(20, 40); font(SF_Reg);
ImGui::Text("This will take a moment to jailbreak, hang tight!");
set_pos(50, 100); font(Hack);
if (!execjb) {
execjb = true;
palera1n(1, NULL);
}
// redirect logs here...
ImGui::Text("[*] Running...");
set_pos(50, 125); ImGui::Text("[*] Some epic log stuff will go here :3");
set_pos(50, 150); ImGui::Text("[*] lorem ipsum :frcoal:");
ImGui::PopFont();
} else {
}
if (settings) {
draw_box(ImVec2(50.0f, 65.0f),ImVec2(230.0f, 230.0f), hex_color(0x000000, 0.5f), 20.0f);
draw_box(ImVec2(320.0f, 65.0f),ImVec2(230.0f, 230.0f), hex_color(0x000000, 0.5f), 20.0f);
}
ImGui::End();
}
};
HelloImGui::Run(params);
return 0;
}
+2 -2
View File
@@ -27,7 +27,7 @@
#include <ANSI-color-codes.h>
#include <palerain.h>
#include <xxd-embedded.h>
#include <kerninfo.h>
#include <paleinfo.h>
pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex;
#ifdef TUI
@@ -90,7 +90,7 @@ uint64_t set_ecid_wait_for_dfu(uint64_t ecid) {
}
#ifdef TUI
newtComponent get_tui_log() {
newtComponent get_tui_log(void) {
pthread_mutex_lock(&tui_log_mutex);
newtComponent ret = tui_log_output;
pthread_mutex_unlock(&tui_log_mutex);
+10 -10
View File
@@ -12,7 +12,7 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
{
if (verbose >= 5
#ifdef TUI
&& !checkrain_options_enabled(host_flags, host_option_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;
@@ -57,12 +57,12 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
snprintf(colour_bold, 0x10, "%s", BWHT);
break;
}
if (checkrain_options_enabled(host_flags, host_option_no_colors)) {
if ((palerain_flags & palerain_option_no_colors)) {
colour[0] = '\0';
colour_bold[0] = '\0';
}
#ifdef TUI
if (checkrain_options_enabled(host_flags, host_option_tui) && tui_started) {
if ((palerain_flags & palerain_option_tui) && tui_started) {
newtComponent co = get_tui_log();
if (co == NULL) {
return 0; /* 0 bytes printed */
@@ -79,26 +79,26 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
time_t curtime;
time(&curtime);
struct tm* timeinfo = localtime(&curtime);
if (!checkrain_options_enabled(host_flags, host_option_no_colors))
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 && !checkrain_options_enabled(host_flags, host_option_no_colors)) {
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 (!checkrain_options_enabled(host_flags, host_option_no_colors)) {
} else if (!(palerain_flags & palerain_option_no_colors)) {
printf(" - %s %s<%s>%s: ", timestring, colour_bold, type, CRESET);
} else if (verbose >= 2 && checkrain_options_enabled(host_flags, host_option_no_colors)) {
} 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 (checkrain_options_enabled(host_flags, host_option_no_colors)) {
} 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 && !checkrain_options_enabled(host_flags, host_option_no_colors))
if (verbose < 2 && !(palerain_flags & palerain_option_no_colors))
printf(CRESET "\n");
else if (!checkrain_options_enabled(host_flags, host_option_no_colors))
else if (!(palerain_flags & palerain_option_no_colors))
printf("\n%s-%s\n", colour, CRESET);
else if (verbose < 2)
printf("\n");
+13 -17
View File
@@ -27,15 +27,13 @@
#include <ANSI-color-codes.h>
#include <palerain.h>
#include <xxd-embedded.h>
#include <kerninfo.h>
#include <gui.h>
#include <paleinfo.h>
#define CMD_LEN_MAX 512
#define OVERRIDE_MAGIC 0xd803b376
unsigned int verbose = 0;
char xargs_cmd[0x270] = "xargs ", checkrain_flags_cmd[0x20] = "deadbeef", palerain_flags_cmd[0x20] = "deadbeef";
char kpf_flags_cmd[0x20] = "deadbeef", dtpatch_cmd[0x20] = "deadbeef", rootfs_cmd[512] = "deadbeef";
char xargs_cmd[0x270] = "xargs ", palerain_flags_cmd[0x30] = "deadbeef";
extern char** environ;
niarelap_file_t* kpf_to_upload_1 = &checkra1n_kpf_pongo;
@@ -48,7 +46,7 @@ niarelap_file_t** overlay_to_upload = &overlay_to_upload_1;
override_file_t override_ramdisk, override_kpf, override_overlay;
uint32_t checkrain_flags = 0, palerain_flags = 0, kpf_flags = 0;
uint64_t palerain_flags = 0;
pthread_mutex_t log_mutex;
pthread_t dfuhelper_thread, pongo_thread;
@@ -74,7 +72,7 @@ int build_checks(void) {
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) {
host_flags |= palerain_option_checkrain_is_clone;
palerain_flags |= palerain_option_checkrain_is_clone;
}
#endif
#ifndef NO_KPF
@@ -112,9 +110,9 @@ int palera1n(int argc, char *argv[]) {
pthread_mutex_init(&ecid_dfu_wait_mutex, NULL);
if ((ret = build_checks())) return ret;
if ((ret = optparse(argc, argv))) goto cleanup;
if (!checkrain_options_enabled(host_flags, host_option_device_info) && checkrain_options_enabled(host_flags, host_option_palerain_version)) goto normal_exit;
if (!(palerain_flags & palerain_option_device_info) && (palerain_flags & palerain_option_palerain_version)) goto normal_exit;
#ifdef TUI
if (checkrain_options_enabled(host_flags, host_option_tui)) {
if ((palerain_flags & palerain_option_tui)) {
ret = tui();
if (ret) goto cleanup;
else goto normal_exit;
@@ -134,7 +132,7 @@ int palera1n(int argc, char *argv[]) {
}
#endif
if (!checkrain_options_enabled(host_flags, host_option_device_info))
if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_INFO, "Waiting for devices");
if (access("/var/run/usbmuxd", F_OK) != 0)
@@ -144,16 +142,16 @@ int palera1n(int argc, char *argv[]) {
pthread_create(&dfuhelper_thread, NULL, dfuhelper, NULL);
pthread_join(dfuhelper_thread, NULL);
set_spin(0);
if (checkrain_options_enabled(host_flags, host_option_dfuhelper_only |
host_option_reboot_device |
host_option_exit_recovery |
host_option_enter_recovery |
host_option_device_info
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;
if (exec_checkra1n()) goto cleanup;
if (checkrain_options_enabled(host_flags, host_option_pongo_exit | host_option_demote))
if ((palerain_flags & (palerain_option_pongo_exit | palerain_option_demote)))
goto normal_exit;
set_spin(1);
sleep(2);
@@ -186,8 +184,6 @@ cleanup:
}
#ifndef GUI
int main (int argc, char* argv[]) {
return palera1n(argc, argv);
}
#endif
+39 -43
View File
@@ -13,9 +13,9 @@
#include <errno.h>
#include <palerain.h>
#include <sys/mman.h>
#include <inttypes.h>
checkrain_option_t host_flags = 0;
checkrain_option_p host_flags_p = &host_flags;
uint64_t* palerain_flags_p = &palerain_flags;
static bool force_use_verbose_boot = false;
static struct option longopts[] = {
@@ -31,7 +31,6 @@ static struct option longopts[] = {
{"boot-args", required_argument, NULL, 'e'},
{"fakefs", no_argument, NULL, 'f'},
{"rootless", no_argument, NULL, 'l'},
{"jbinit-log-to-file", 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'},
@@ -60,19 +59,19 @@ static int usage(int e, char* prog_name)
{
fprintf(stderr,
"Usage: %s [-"
"DEhpvVldsSLRnPI"
"DEhpvVdsSLRnPI"
#ifdef DEV_BUILD
"12"
#endif
#ifdef ROOTFUL
"cCfB"
"cCfBl"
#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) 2023, palera1n team, All Rights Reserved.\n\n"
"iOS/iPadOS 15.0-16.5 arm64 jailbreaking tool\n\n"
"iOS/iPadOS 15.0-16.5.1 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
@@ -95,7 +94,9 @@ static int usage(int e, char* prog_name)
"\t-i, --override-checkra1n <file>\t\tOverride checkra1n\n"
"\t-k, --override-pongo <file>\t\tOverride Pongo image\n"
"\t-K, --override-kpf <file>\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"
@@ -124,7 +125,7 @@ int optparse(int argc, char* argv[]) {
int opt;
int index;
while ((opt = getopt_long(argc, argv,
"DEhpvVldsSLtRnPIe:o:r:K:k:i:"
"DEhpvVlLdsStRnPIe:o:r:K:k:i:"
#ifdef DEV_BUILD
"12"
#endif
@@ -135,23 +136,23 @@ int optparse(int argc, char* argv[]) {
case 'B':
palerain_flags |= palerain_option_setup_partial_root;
palerain_flags |= palerain_option_setup_rootful;
kpf_flags |= checkrain_option_verbose_boot;
palerain_flags |= palerain_option_verbose_boot;
break;
case 'c':
palerain_flags |= palerain_option_setup_rootful;
kpf_flags |= checkrain_option_verbose_boot;
palerain_flags |= palerain_option_verbose_boot;
break;
case 'C':
palerain_flags |= palerain_option_clean_fakefs;
break;
case 'p':
host_flags |= host_option_pongo_exit;
palerain_flags |= palerain_option_pongo_exit;
break;
case 'P':
host_flags |= host_option_pongo_full;
palerain_flags |= palerain_option_pongo_full;
break;
case 'D':
host_flags |= host_option_dfuhelper_only;
palerain_flags |= palerain_option_dfuhelper_only;
break;
case 'h':
usage(0, argv[0]);
@@ -160,7 +161,7 @@ int optparse(int argc, char* argv[]) {
verbose++;
break;
case 'V':
kpf_flags |= checkrain_option_verbose_boot;
palerain_flags |= palerain_option_verbose_boot;
force_use_verbose_boot = true;
break;
case 'e':
@@ -174,24 +175,24 @@ int optparse(int argc, char* argv[]) {
snprintf(xargs_cmd, sizeof(xargs_cmd), "xargs %s", optarg);
break;
case 'f':
snprintf(rootfs_cmd, sizeof(rootfs_cmd), "rootfs %s", optarg);
snprintf(dtpatch_cmd, 0x20, "dtpatch %s", optarg);
palerain_flags |= palerain_option_rootful;
palerain_flags &= ~palerain_option_rootless;
break;
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':
host_flags |= host_option_demote;
palerain_flags |= palerain_option_demote;
break;
case 'E':
host_flags |= host_option_enter_recovery;
palerain_flags |= palerain_option_enter_recovery;
break;
case 's':
checkrain_flags |= checkrain_option_safemode;
palerain_flags |= palerain_option_safemode;
break;
case 'k':
if (access(optarg, F_OK) != 0) {
@@ -252,12 +253,12 @@ int optparse(int argc, char* argv[]) {
}
if (boyermoore_horspool_memmem(addr, st.st_size, (const unsigned char*)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL)
{
host_flags |= palerain_option_checkrain_is_clone;
palerain_flags |= palerain_option_checkrain_is_clone;
LOG(LOG_VERBOSE3, "%s is checkra1n clone", optarg);
}
else
{
host_flags &= ~palerain_option_checkrain_is_clone;
palerain_flags &= ~palerain_option_checkrain_is_clone;
LOG(LOG_VERBOSE3, "%s is checkra1n", optarg);
}
munmap(addr, st.st_size);
@@ -266,20 +267,20 @@ int optparse(int argc, char* argv[]) {
snprintf(ext_checkra1n, strlen(optarg) + 1, "%s", optarg);
break;
case 'R':
host_flags |= host_option_reboot_device;
palerain_flags |= palerain_option_reboot_device;
break;
case 'n':
host_flags |= host_option_exit_recovery;
palerain_flags |= palerain_option_exit_recovery;
break;
case 'I':
host_flags |= host_option_device_info;
palerain_flags |= palerain_option_device_info;
break;
case 'S':
host_flags |= host_option_no_colors;
palerain_flags |= palerain_option_no_colors;
break;
#ifdef TUI
case 't':
host_flags |= host_option_tui;
palerain_flags |= palerain_option_tui;
break;
#endif
#ifdef DEV_BUILD
@@ -291,17 +292,17 @@ int optparse(int argc, char* argv[]) {
break;
#endif
case palerain_option_case_force_revert:
checkrain_flags |= checkrain_option_force_revert;
palerain_flags |= palerain_option_force_revert;
break;
case palerain_option_case_version:
host_flags |= host_option_palerain_version;
palerain_flags |= palerain_option_palerain_version;
break;
default:
usage(1, argv[0]);
break;
}
}
if (checkrain_options_enabled(host_flags, host_option_palerain_version)) {
if ((palerain_flags & palerain_option_palerain_version)) {
printf(
"palera1n " PALERAIN_VERSION "\n"
BUILD_COMMIT " " BUILD_NUMBER " (" BUILD_BRANCH ")\n\n"
@@ -319,17 +320,12 @@ int optparse(int argc, char* argv[]) {
return 0;
}
if ((strstr(xargs_cmd, "serial=") != NULL) && !force_use_verbose_boot && checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful)) {
kpf_flags &= ~checkrain_option_verbose_boot;
if ((strstr(xargs_cmd, "serial=") != NULL) && !force_use_verbose_boot && (palerain_flags & palerain_option_setup_rootful)) {
palerain_flags &= ~palerain_option_verbose_boot;
}
snprintf(checkrain_flags_cmd, 0x20, "checkra1n_flags 0x%x", checkrain_flags);
snprintf(palerain_flags_cmd, 0x20, "palera1n_flags 0x%x", palerain_flags);
snprintf(kpf_flags_cmd, 0x20, "kpf_flags 0x%x", kpf_flags);
LOG(LOG_VERBOSE3, "checkrain_flags: %s", checkrain_flags_cmd);
snprintf(palerain_flags_cmd, 0x30, "palera1n_flags 0x%" PRIx64, palerain_flags);
LOG(LOG_VERBOSE3, "palerain_flags: %s", palerain_flags_cmd);
LOG(LOG_VERBOSE3, "kpf_flags: %s", kpf_flags_cmd);
LOG(LOG_VERBOSE3, "host_flags: 0x%x", host_flags);
if (override_kpf.magic == OVERRIDE_MAGIC) {
LOG(LOG_VERBOSE4, "kpf override length %u -> %u", override_kpf.orig_len, checkra1n_kpf_pongo_len);
LOG(LOG_VERBOSE4, "kpf override ptr %p -> %p", override_kpf.orig_ptr, **kpf_to_upload);
@@ -343,17 +339,17 @@ int optparse(int argc, char* argv[]) {
LOG(LOG_VERBOSE4, "overlay override ptr %p -> %p", override_overlay.orig_ptr, **overlay_to_upload);
}
if (!checkrain_options_enabled(palerain_flags, palerain_option_rootful)) {
if (checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful) || checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful_forced)) {
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;
}
}
if (!(
checkrain_options_enabled(host_flags, host_option_dfuhelper_only) ||
checkrain_options_enabled(host_flags, host_option_enter_recovery) ||
checkrain_options_enabled(host_flags, host_option_exit_recovery) ||
checkrain_options_enabled(host_flags, host_option_reboot_device)))
(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)
@@ -361,7 +357,7 @@ int optparse(int argc, char* argv[]) {
LOG(LOG_FATAL, "checkra1n omitted in build but no override specified");
return -1;
}
if (!(checkrain_options_enabled(host_flags, host_option_pongo_exit) || checkrain_options_enabled(host_flags, host_option_pongo_exit)))
if (!((palerain_flags & palerain_option_pongo_exit) || (palerain_flags & palerain_option_pongo_exit)))
{
#ifdef NO_KPF
if (checkra1n_kpf_pongo_len == 0)
+6 -8
View File
@@ -33,7 +33,7 @@ void *pongo_usb_callback(stuff_t *arg) {
if (get_found_pongo())
return NULL;
set_found_pongo(1);
if (checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful)) {
if ((palerain_flags & palerain_option_setup_rootful)) {
strncat(xargs_cmd, " wdt=-1", 0x270 - strlen(xargs_cmd) - 1);
}
LOG(LOG_INFO, "Found PongoOS USB Device");
@@ -43,10 +43,8 @@ void *pongo_usb_callback(stuff_t *arg) {
issue_pongo_command(handle, "sep auto");
upload_pongo_file(handle, **kpf_to_upload, checkra1n_kpf_pongo_len);
issue_pongo_command(handle, "modload");
issue_pongo_command(handle, kpf_flags_cmd);
issue_pongo_command(handle, checkrain_flags_cmd);
issue_pongo_command(handle, palerain_flags_cmd);
if (checkrain_options_enabled(palerain_flags, palerain_option_rootful))
if ((palerain_flags & palerain_option_rootful))
{
issue_pongo_command(handle, "rootfs");
}
@@ -66,13 +64,13 @@ void *pongo_usb_callback(stuff_t *arg) {
issue_pongo_command(handle, "overlay");
}
issue_pongo_command(handle, xargs_cmd);
if (checkrain_options_enabled(host_flags, host_option_pongo_full)) goto done;
if ((palerain_flags & palerain_option_pongo_full)) goto done;
issue_pongo_command(handle, "bootx");
LOG(LOG_INFO, "Booting Kernel...");
if (checkrain_options_enabled(palerain_flags, palerain_option_setup_partial_root)) {
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 boots up to iOS, run again without the -B (Create BindFS) option to jailbreak.");
} else if (checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful)) {
} 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 boots up to iOS, run again without the -c (Create FakeFS) option to jailbreak.");
}
@@ -163,7 +161,7 @@ int upload_pongo_file(usb_device_handle_t handle, unsigned char *buf, unsigned i
if (verbose < 3 || verbose > 4) {
LOG(LOG_VERBOSE, "Uploaded %llu bytes to PongoOS", (unsigned long long)buf_len);
} else {
if (checkrain_options_enabled(host_flags, host_option_no_colors))
if ((palerain_flags & palerain_option_no_colors))
printf("/send mem:%p:%p\nUploaded %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);
+4 -4
View File
@@ -12,15 +12,15 @@
#include <palerain.h>
#include <tui.h>
int redraw_screen() {
int redraw_screen(void) {
return 0;
}
int destroy_window() {
int destroy_window(void) {
return 0;
}
int init_window() {
int init_window(void) {
setlocale(LC_ALL, NULL);
setenv(
"NEWT_COLORS",
@@ -61,7 +61,7 @@ int init_window() {
return 0;
}
int tui() {
int tui(void) {
int ret = 0;
if ((ret = init_window())) return ret;
ret = MAIN_SCREEN;
+1 -1
View File
@@ -12,4 +12,4 @@
#include <palerain.h>
#include <tui.h>
tui_screen_t tui_screen_enter_dfu() { return JAILBREAKING_SCREEN; }
tui_screen_t tui_screen_enter_dfu(void) { return JAILBREAKING_SCREEN; }
+1 -1
View File
@@ -12,4 +12,4 @@
#include <palerain.h>
#include <tui.h>
tui_screen_t tui_screen_enter_recovery() { return ENTER_DFU_SCREEN; }
tui_screen_t tui_screen_enter_recovery(void) { return ENTER_DFU_SCREEN; }
+1 -1
View File
@@ -12,4 +12,4 @@
#include <palerain.h>
#include <tui.h>
tui_screen_t tui_screen_jailbreak() { return EXIT_SCREEN; }
tui_screen_t tui_screen_jailbreak(void) { return EXIT_SCREEN; }
+1 -1
View File
@@ -12,7 +12,7 @@
#include <palerain.h>
#include <tui.h>
tui_screen_t tui_screen_main() {
tui_screen_t tui_screen_main(void) {
int ret = MAIN_SCREEN;
bool can_start = false;
newtCenteredWindow(WIDTH, HEIGHT, NULL);
+9 -11
View File
@@ -21,16 +21,14 @@ void bitfield_check_cb(newtComponent box, void* data) {
}
tui_screen_t tui_screen_options() {
tui_bit_info_t verbose_info = { &kpf_flags, checkrain_option_verbose_boot };
tui_screen_t tui_screen_options(void) {
tui_bit_info_t verbose_info = { &palerain_flags, palerain_option_verbose_boot };
tui_bit_info_t rootful_info = { &palerain_flags, palerain_option_rootful };
tui_bit_info_t setup_rootful_info = { &palerain_flags, palerain_option_setup_rootful };
tui_bit_info_t force_revert_info = { &checkrain_flags, checkrain_option_force_revert };
tui_bit_info_t safemode_info = { &checkrain_flags, checkrain_option_safemode };
tui_bit_info_t force_revert_info = { &palerain_flags, palerain_option_force_revert };
tui_bit_info_t safemode_info = { &palerain_flags, palerain_option_safemode };
tui_bit_info_t flower_chain_info = { &palerain_flags, palerain_option_flower_chain };
static checkrain_option_t flower_flags = 0, flower_option_flower_chain = (1 << 0);
tui_bit_info_t flower_chain_info = { &flower_flags, flower_option_flower_chain };
const char* bootargs_entered = NULL;
int ret = MAIN_SCREEN;
@@ -41,11 +39,11 @@ tui_screen_t tui_screen_options() {
newtTextboxSetText(optionsNotice, "You may set the following options. If you don't know what they mean you'll probably have no reason to set them.");
// newtTextboxSetColors(optionsNotice, NEWT_COLORSET_LABEL, NEWT_COLORSET_LABEL);
newtComponent verboseBootBox = newtCheckbox(1, 3, "Verbose boot", CHECKBOX_STATE(kpf_flags, checkrain_option_verbose_boot), NULL, NULL);
newtComponent verboseBootBox = newtCheckbox(1, 3, "Verbose boot", CHECKBOX_STATE(palerain_flags, palerain_option_verbose_boot), NULL, NULL);
newtComponent rootfulBox = newtCheckbox(1, 4, "Rootful", CHECKBOX_STATE(palerain_flags, palerain_option_rootful), NULL, NULL);
newtComponent rootfulSetupBox = newtCheckbox(1, 5, "Setup fakefs", CHECKBOX_STATE(palerain_flags, palerain_option_setup_rootful), NULL, NULL);
newtComponent forceRevertBox = newtCheckbox(1, 6, "Restore system", CHECKBOX_STATE(checkrain_flags, checkrain_option_force_revert), NULL, NULL);
newtComponent safeModeBox = newtCheckbox(1, 7, "Safe mode", CHECKBOX_STATE(checkrain_flags, checkrain_option_safemode), NULL, NULL);
newtComponent forceRevertBox = newtCheckbox(1, 6, "Restore system", CHECKBOX_STATE(palerain_flags, palerain_option_force_revert), NULL, NULL);
newtComponent safeModeBox = newtCheckbox(1, 7, "Safe mode", CHECKBOX_STATE(palerain_flags, palerain_option_safemode), NULL, NULL);
newtComponentAddCallback(verboseBootBox, bitfield_check_cb, &verbose_info);
newtComponentAddCallback(rootfulBox, bitfield_check_cb, &rootful_info);
@@ -56,7 +54,7 @@ tui_screen_t tui_screen_options() {
newtComponent bootCmdlineLabel = newtLabel(1, 8, "Kernel command line:");
newtComponent bootCmdlineEntry = newtEntry(1, 9, &xargs_cmd[6], WIDTH - 2, &bootargs_entered, NEWT_ENTRY_SCROLL);
newtComponent flowerChainBox = newtCheckbox(1, 10, "Flower chain", CHECKBOX_STATE(flower_flags, flower_option_flower_chain), NULL, NULL);
newtComponent flowerChainBox = newtCheckbox(1, 10, "Flower chain", CHECKBOX_STATE(palerain_flags, palerain_option_flower_chain), NULL, NULL);
newtComponentAddCallback(flowerChainBox, bitfield_check_cb, &flower_chain_info);