mirror of
https://github.com/palera1n/palera1n.git
synced 2026-10-21 09:47:01 +02:00
Compare commits
145
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a30e2ef32a | ||
|
|
2825ccaf17 | ||
|
|
e1e0304b98 | ||
|
|
5f4ef51da9 | ||
|
|
98f7d032eb | ||
|
|
5b32d61a1e | ||
|
|
fd80f9e63f | ||
|
|
52ff0b2e62 | ||
|
|
aa0c3a77b3 | ||
|
|
a5fbf1b18b | ||
|
|
7d3bf14ea6 | ||
|
|
a8325474cf | ||
|
|
8a09d2670a | ||
|
|
30d8241e2d | ||
|
|
e33d50860b | ||
|
|
3b4340525d | ||
|
|
e6033f31cc | ||
|
|
c14d93b008 | ||
|
|
ed48d4fcb4 | ||
|
|
2541330a07 | ||
|
|
58aaf508fc | ||
|
|
e6644c0601 | ||
|
|
194f568363 | ||
|
|
963fbb6ed8 | ||
|
|
88185b7a88 | ||
|
|
3c6213774b | ||
|
|
c35d199809 | ||
|
|
67ca5a9d24 | ||
|
|
8edc991786 | ||
|
|
f59ef6dcee | ||
|
|
1ca25ceca8 | ||
|
|
0a0410d506 | ||
|
|
5f8b503ae3 | ||
|
|
9e253f98f4 | ||
|
|
d17af1fbc7 | ||
|
|
f3920b883d | ||
|
|
1abfdf5441 | ||
|
|
1c3613c669 | ||
|
|
627f9b3363 | ||
|
|
388ae6f296 | ||
|
|
24a09bc44d | ||
|
|
5ea3237772 | ||
|
|
9c094fc19f | ||
|
|
2912dfd8c0 | ||
|
|
a3fa59eaa8 | ||
|
|
290bcb143e | ||
|
|
bb9fdde26e | ||
|
|
a9e72b579e | ||
|
|
fe565b97ad | ||
|
|
1422d45a9f | ||
|
|
869f0fc070 | ||
|
|
cc1a865a86 | ||
|
|
5ce2196268 | ||
|
|
fe50b7c966 | ||
|
|
e02d977c5d | ||
|
|
d82965f140 | ||
|
|
2623569d67 | ||
|
|
2637758372 | ||
|
|
87a2f6b60b | ||
|
|
5e1291d7c4 | ||
|
|
1214aed3a7 | ||
|
|
e96cd19295 | ||
|
|
f37643b93e | ||
|
|
2a9f65c870 | ||
|
|
11b594bec6 | ||
|
|
047b334752 | ||
|
|
c2bb49287a | ||
|
|
2d932dd26b | ||
|
|
03e6739bc9 | ||
|
|
b360e8dd02 | ||
|
|
d72e95fccc | ||
|
|
60f241e0db | ||
|
|
9a7d6151ae | ||
|
|
ac34d4d2be | ||
|
|
8cae820cb8 | ||
|
|
b89fd2b915 | ||
|
|
4070ed9da9 | ||
|
|
6c7f666bb3 | ||
|
|
36fc50d2f1 | ||
|
|
15b2372daa | ||
|
|
b7b52febe3 | ||
|
|
a29a279693 | ||
|
|
b693f1af29 | ||
|
|
41f7909597 | ||
|
|
52167fc32d | ||
|
|
a060fe7374 | ||
|
|
f6450e0a5d | ||
|
|
6dec16ff2b | ||
|
|
8807f4775f | ||
|
|
4b0457b6ee | ||
|
|
6e05ecd1f9 | ||
|
|
16cbb134aa | ||
|
|
f267c3e714 | ||
|
|
e4f46c4276 | ||
|
|
67b9b86940 | ||
|
|
3f73bd0b31 | ||
|
|
8aca098801 | ||
|
|
831794f5eb | ||
|
|
5eb0a08727 | ||
|
|
4572ed5984 | ||
|
|
e81a06513a | ||
|
|
c17107da40 | ||
|
|
a8a7fbdae8 | ||
|
|
2990d9ab75 | ||
|
|
132eb393d0 | ||
|
|
8f81f9b523 | ||
|
|
b28e882b9c | ||
|
|
f5cc175adc | ||
|
|
2a7df193ce | ||
|
|
d974100585 | ||
|
|
9bf956e2da | ||
|
|
bb1bef3676 | ||
|
|
da21a56783 | ||
|
|
749578716a | ||
|
|
9153d71626 | ||
|
|
fae5eaf07e | ||
|
|
df0c0f346d | ||
|
|
75ae960d1a | ||
|
|
06be39a71c | ||
|
|
01bcc332cb | ||
|
|
f519162c61 | ||
|
|
21786017b0 | ||
|
|
79c45399b8 | ||
|
|
6f34b90e15 | ||
|
|
520d79b399 | ||
|
|
7f68777418 | ||
|
|
05eb1d791b | ||
|
|
cad3a8d233 | ||
|
|
fe970cfe2c | ||
|
|
d4052bfe6e | ||
|
|
4836b08998 | ||
|
|
fa7e58f45f | ||
|
|
0aec2f123d | ||
|
|
025baf4d74 | ||
|
|
49f0f74338 | ||
|
|
fd75256cbd | ||
|
|
4b4bc0c97e | ||
|
|
118d826f40 | ||
|
|
bfbdc82d22 | ||
|
|
6edcf92e7d | ||
|
|
79d258814e | ||
|
|
87dae1a7e2 | ||
|
|
4043f8534f | ||
|
|
9df5f68590 | ||
|
|
623cd45286 |
No files matched your search
+197
-39
@@ -11,12 +11,20 @@ on:
|
||||
- 'CMakeLists.txt'
|
||||
- '.github/workflows/build.yml'
|
||||
pull_request:
|
||||
paths:
|
||||
- 'src/**'
|
||||
- 'docs/**'
|
||||
- 'patches/**'
|
||||
- 'include/**'
|
||||
- 'Makefile'
|
||||
- 'CMakeLists.txt'
|
||||
- '.github/workflows/build.yml'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-docs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
@@ -31,6 +39,10 @@ jobs:
|
||||
mkdir ready
|
||||
cp docs/*.html docs/mandoc.css docs/palera1n.1 ready
|
||||
|
||||
- name: Get branch name
|
||||
id: branch-name
|
||||
uses: tj-actions/branch-names@v7
|
||||
|
||||
- name: Upload artifact
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: wangyucode/[email protected]
|
||||
@@ -42,7 +54,7 @@ jobs:
|
||||
forceUpload: true
|
||||
dryRun: false
|
||||
localDir: 'ready/'
|
||||
remoteDir: '/palera1n/artifacts/c-rewrite'
|
||||
remoteDir: '/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}'
|
||||
|
||||
build-darwin:
|
||||
strategy:
|
||||
@@ -59,10 +71,10 @@ jobs:
|
||||
- arch: arm64
|
||||
gnu_triple: aarch64-apple-darwin
|
||||
os: iphoneos
|
||||
minos: 14.0
|
||||
runs-on: macos-latest
|
||||
minos: 7.0
|
||||
runs-on: macos-12
|
||||
env:
|
||||
MBEDTLS_VERSION: 3.3.0
|
||||
MBEDTLS_VERSION: 3.4.0
|
||||
READLINE_VERSION: 8.2
|
||||
SLANG_VERSION: 2.3.3
|
||||
NEWT_VERSION: 0.52.23
|
||||
@@ -106,6 +118,10 @@ jobs:
|
||||
git clone --depth=1 https://github.com/libimobiledevice/libusbmuxd
|
||||
git clone --depth=1 https://github.com/libimobiledevice/libimobiledevice
|
||||
|
||||
- name: Select correct Xcode
|
||||
run: |
|
||||
sudo xcode-select -s /Applications/Xcode_14.2.app
|
||||
|
||||
- name: Setup environment
|
||||
run: |
|
||||
mkdir sysroot
|
||||
@@ -116,7 +132,7 @@ jobs:
|
||||
echo "CC=$(xcrun --find cc)" >> $GITHUB_ENV
|
||||
echo "CXX=$(xcrun --find c++)" >> $GITHUB_ENV
|
||||
echo "CPP=$(xcrun --find cc) -E" >> $GITHUB_ENV
|
||||
echo "CFLAGS=-g -Os -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isysroot ${{ env.SDK }} -isystem $(pwd)/sysroot/usr/local/include -Os" >> $GITHUB_ENV
|
||||
echo "CFLAGS=-g -Os -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isysroot ${{ env.SDK }} -isystem $(pwd)/sysroot/usr/local/include -Os -g -flto=full -Wl,-object_path_lto,lto.o" >> $GITHUB_ENV
|
||||
echo "CPPFLAGS=-g -Os -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isysroot ${{ env.SDK }} -isystem $(pwd)/sysroot/usr/local/include -Wno-error-implicit-function-declaration -Os" >> $GITHUB_ENV
|
||||
echo "CXXFLAGS=-stdlib=libc++ -g -Os -isysroot ${{ env.SDK }} -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isystem $(pwd)/sysroot/usr/local/include -Os" >> $GITHUB_ENV
|
||||
echo "LDFLAGS=-g -Wl,-dead_strip -arch ${{ matrix.arch }} -isysroot ${{ env.SDK }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -L$(pwd)/sysroot/usr/local/lib" >> $GITHUB_ENV
|
||||
@@ -127,6 +143,13 @@ jobs:
|
||||
mkdir -p $(pwd)/sysroot/usr/local/lib
|
||||
ln -sf $(pwd)/sysroot/usr/local/lib{,64}
|
||||
|
||||
- name: Prepare iPhoneOS environment
|
||||
if: matrix.os == 'iphoneos'
|
||||
run: |
|
||||
echo "FAKE_PLATFORM=2" >> $GITHUB_ENV
|
||||
echo "FAKE_SDK=7.0" >> $GITHUB_ENV
|
||||
echo "FAKE_MINOS=7.0" >> $GITHUB_ENV
|
||||
|
||||
- name: Prepare headers
|
||||
if: matrix.os != 'macosx'
|
||||
run: |
|
||||
@@ -293,20 +316,9 @@ jobs:
|
||||
cp -a sysroot/${{ env.PREFIX }}/{include,lib} dep_root
|
||||
find dep_root -name '*.dylib' -delete
|
||||
find dep_root -name '*.la' -delete
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. -DSTATIC=1 -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_CROSSCOMPILING=true \
|
||||
-DCMAKE_SYSTEM_NAME=Darwin \
|
||||
-DCMAKE_C_COMPILER="${{ env.CC }}" \
|
||||
-DCMAKE_C_FLAGS='${{ env.CFLAGS }}' \
|
||||
-DCMAKE_FIND_ROOT_PATH="${{ env.DESTDIR }}" \
|
||||
-DCMAKE_INSTALL_PREFIX="${{ env.PREFIX }}" \
|
||||
-DSTATIC=1
|
||||
make -j$(sysctl -n hw.ncpu)
|
||||
cd ..
|
||||
gmake -j$(sysctl -n hw.ncpu)
|
||||
mkdir -p ready
|
||||
mv build/src/palera1n palera1n-${{ matrix.os }}-${{ matrix.arch }}
|
||||
mv src/palera1n palera1n-${{ matrix.os }}-${{ matrix.arch }}
|
||||
dsymutil palera1n-${{ matrix.os }}-${{ matrix.arch }}
|
||||
strip palera1n-${{ matrix.os }}-${{ matrix.arch }}
|
||||
if [ "${{ matrix.os }}" == "macosx" ]; then
|
||||
@@ -317,6 +329,10 @@ jobs:
|
||||
mkdir -p ready
|
||||
tar -zcf ready/dep_root-${{ matrix.os }}-${{ matrix.arch }}.tgz dep_root
|
||||
|
||||
- name: Get branch name
|
||||
id: branch-name
|
||||
uses: tj-actions/branch-names@v7
|
||||
|
||||
- name: Upload artifact
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: wangyucode/[email protected]
|
||||
@@ -328,7 +344,7 @@ jobs:
|
||||
forceUpload: true
|
||||
dryRun: false
|
||||
localDir: 'ready/'
|
||||
remoteDir: '/palera1n/artifacts/c-rewrite'
|
||||
remoteDir: '/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}'
|
||||
|
||||
- name: Upload ${{ matrix.os }} thin ${{ matrix.arch }} build
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
@@ -345,12 +361,24 @@ jobs:
|
||||
name: palera1n-${{ matrix.os }}-${{ matrix.arch }}.dSYM
|
||||
path: palera1n-${{ matrix.os }}-${{ matrix.arch }}.dSYM
|
||||
retention-days: 1
|
||||
|
||||
|
||||
darwin-dist:
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
runs-on: macos-latest
|
||||
needs: build-darwin
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Procursus
|
||||
uses: beerpiss/[email protected]
|
||||
with:
|
||||
packages: sed coreutils
|
||||
cache: true
|
||||
mirror: 'https://procursus.itsnebula.net/'
|
||||
|
||||
- name: Download all Darwin artifacts
|
||||
uses: actions/download-artifact@v3
|
||||
|
||||
@@ -369,6 +397,92 @@ jobs:
|
||||
zip -r9 ready/palera1n-ios.dSYM.zip palera1n-iphoneos-arm64.dSYM
|
||||
zip -r9 ready/palera1n-macos.dSYM.zip palera1n-macos.dSYM
|
||||
|
||||
- name: Build debs
|
||||
run: |
|
||||
make -j$(sysctl -n hw.ncpu) docs
|
||||
version=$(git describe --dirty --tags --abbrev=7 | sed 's|^v||' | sed 's|-beta|~beta|')
|
||||
|
||||
# Darwin x86_64
|
||||
mkdir -p stage/DEBIAN
|
||||
mkdir -p stage/opt/procursus/bin
|
||||
mkdir -p stage/opt/procursus/usr/share/man/man1
|
||||
cp packaging/control.macosx stage/DEBIAN/control
|
||||
|
||||
gsed 's|@DEB_ARCH@|darwin-amd64|g' -i stage/DEBIAN/control
|
||||
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
|
||||
|
||||
ginstall -Dm644 ready/palera1n-macos-x86_64 stage/opt/procursus/bin/palera1n
|
||||
ginstall -Dm644 docs/palera1n.1 stage/opt/procursus/usr/share/man/man1/palera1n.1
|
||||
chmod +x stage/opt/procursus/bin/palera1n
|
||||
|
||||
dpkg-deb -Zzstd -b stage palera1n_darwin-amd64.deb
|
||||
mv palera1n*.deb ready/
|
||||
rm -rf stage
|
||||
|
||||
# Darwin arm64
|
||||
mkdir -p stage/DEBIAN
|
||||
mkdir -p stage/opt/procursus/bin
|
||||
mkdir -p stage/opt/procursus/usr/share/man/man1
|
||||
cp packaging/control.macosx stage/DEBIAN/control
|
||||
|
||||
gsed 's|@DEB_ARCH@|darwin-arm64|g' -i stage/DEBIAN/control
|
||||
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
|
||||
|
||||
ginstall -Dm644 ready/palera1n-macos-arm64 stage/opt/procursus/bin/palera1n
|
||||
ginstall -Dm644 docs/palera1n.1 stage/opt/procursus/usr/share/man/man1/palera1n.1
|
||||
chmod +x stage/opt/procursus/bin/palera1n
|
||||
|
||||
dpkg-deb -Zzstd -b stage palera1n_darwin-arm64.deb
|
||||
mv palera1n*.deb ready/
|
||||
rm -rf stage
|
||||
|
||||
# iPhoneOS
|
||||
mkdir -p stage/DEBIAN
|
||||
mkdir -p stage/usr/bin
|
||||
mkdir -p stage/usr/share/man/man1
|
||||
cp packaging/control stage/DEBIAN/control
|
||||
|
||||
gsed 's|@DEB_ARCH@|iphoneos-arm|g' -i stage/DEBIAN/control
|
||||
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
|
||||
|
||||
ginstall -Dm644 ready/palera1n-ios stage/usr/bin/palera1n
|
||||
ginstall -Dm644 docs/palera1n.1 stage/usr/share/man/man1/palera1n.1
|
||||
chmod +x stage/usr/bin/palera1n
|
||||
|
||||
dpkg-deb -Zzstd -b stage palera1n_iphoneos-arm.deb
|
||||
mv palera1n*.deb ready/
|
||||
rm -rf stage
|
||||
|
||||
# iPhoneOS (rootless)
|
||||
mkdir -p stage/DEBIAN
|
||||
mkdir -p stage/var/jb/usr/bin
|
||||
mkdir -p stage/var/jb/usr/share/man/man1
|
||||
cp packaging/control stage/DEBIAN/control
|
||||
|
||||
gsed 's|@DEB_ARCH@|iphoneos-arm64|g' -i stage/DEBIAN/control
|
||||
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
|
||||
|
||||
ginstall -Dm644 ready/palera1n-ios 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
|
||||
|
||||
dpkg-deb -Zzstd -b stage palera1n_iphoneos-arm64.deb
|
||||
mv palera1n*.deb ready/
|
||||
rm -rf stage
|
||||
|
||||
- name: Save build tag
|
||||
run: echo "$(git describe --dirty --tags --abbrev=7 | sed 's|-dirty||')" > build-tag.txt
|
||||
|
||||
- name: Upload build tag
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: build-tag
|
||||
path: build-tag.txt
|
||||
|
||||
- name: Get branch name
|
||||
id: branch-name
|
||||
uses: tj-actions/branch-names@v7
|
||||
|
||||
- name: Upload artifact
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: wangyucode/[email protected]
|
||||
@@ -380,7 +494,7 @@ jobs:
|
||||
forceUpload: true
|
||||
dryRun: false
|
||||
localDir: 'ready/'
|
||||
remoteDir: '/palera1n/artifacts/c-rewrite'
|
||||
remoteDir: '/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}'
|
||||
|
||||
build-Linux:
|
||||
strategy:
|
||||
@@ -392,7 +506,7 @@ jobs:
|
||||
- aarch64-linux-musl
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
MBEDTLS_VERSION: 3.3.0
|
||||
MBEDTLS_VERSION: 3.4.0
|
||||
LIBUSB_VERSION: 1.0.26
|
||||
READLINE_VERSION: 8.2
|
||||
SLANG_VERSION: 2.3.3
|
||||
@@ -409,7 +523,7 @@ jobs:
|
||||
- name: Install build dependencies (packages)
|
||||
run: |
|
||||
sudo apt-get remove -y libssl-dev libreadline-dev
|
||||
sudo apt-get install -y pkg-config autoconf automake autopoint
|
||||
sudo apt-get install -y pkg-config autoconf automake autopoint mandoc
|
||||
sudo pip3 install jsonschema jinja2
|
||||
|
||||
- name: Download toolchain checksum
|
||||
@@ -437,15 +551,19 @@ jobs:
|
||||
case ${{ matrix.triple }} in
|
||||
i486-linux-musl)
|
||||
echo "CHECKRA1N_NAME=linux-x86" >> $GITHUB_ENV
|
||||
echo "ARCH_NAME=i386" >> $GITHUB_ENV
|
||||
;;
|
||||
x86_64-linux-musl)
|
||||
echo "CHECKRA1N_NAME=linux-x86_64" >> $GITHUB_ENV
|
||||
echo "ARCH_NAME=amd64" >> $GITHUB_ENV
|
||||
;;
|
||||
armel-linux-musleabi)
|
||||
echo "CHECKRA1N_NAME=linux-armel" >> $GITHUB_ENV
|
||||
echo "ARCH_NAME=armel" >> $GITHUB_ENV
|
||||
;;
|
||||
aarch64-linux-musl)
|
||||
echo "CHECKRA1N_NAME=linux-arm64" >> $GITHUB_ENV
|
||||
echo "ARCH_NAME=arm64" >> $GITHUB_ENV
|
||||
;;
|
||||
esac
|
||||
echo "PKG_CONFIG_PATH=$(pwd)/sysroot/usr/local/lib/pkgconfig" >> $GITHUB_ENV
|
||||
@@ -459,6 +577,7 @@ jobs:
|
||||
echo "CROSS_COMPILE=${{ matrix.triple }}-" >> $GITHUB_ENV
|
||||
mkdir -p $(pwd)/sysroot/usr/local/lib
|
||||
ln -sf $(pwd)/sysroot/usr/local/lib{,64}
|
||||
|
||||
- name: Download dependencies (source code)
|
||||
run: |
|
||||
curl -LOOOOOOO \
|
||||
@@ -636,31 +755,47 @@ jobs:
|
||||
cp -a sysroot/${{ env.PREFIX }}/{include,lib} dep_root
|
||||
find dep_root -name '*.so' -delete
|
||||
find dep_root -name '*.la' -delete
|
||||
mkdir build
|
||||
cd build
|
||||
CC="${{ matrix.triple }}-gcc" cmake .. -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX=${{ env.PREFIX }} \
|
||||
-DCMAKE_FIND_ROOT_PATH=${{ env.DESTDIR }}${{ env.PREFIX }} \
|
||||
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
|
||||
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY \
|
||||
-DCMAKE_C_FLAGS="-I${{ env.DESTDIR }}${{ env.PREFIX }}/include \
|
||||
-L${{ env.DESTDIR }}${{ env.PREFIX }}/lib -Wl,-rpath,${{ env.PREFIX }}/lib" -DSTATIC=1
|
||||
make -j$(nproc) CC="${{ matrix.triple }}-gcc"
|
||||
CC="${{ matrix.triple }}-gcc" make -j$(nproc)
|
||||
|
||||
- name: Seperate debug symbols
|
||||
run: |
|
||||
${{ matrix.triple }}-objcopy --only-keep-debug build/src/palera1n palera1n.debug
|
||||
${{ matrix.triple }}-strip --strip-debug --strip-unneeded build/src/palera1n
|
||||
${{ matrix.triple }}-objcopy --add-gnu-debuglink=palera1n.debug build/src/palera1n
|
||||
${{ matrix.triple }}-objcopy --only-keep-debug src/palera1n palera1n.debug
|
||||
${{ 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
|
||||
mv palera1n.debug ready/palera1n-${{ env.CHECKRA1N_NAME }}.debug
|
||||
mv build/src/palera1n ready/palera1n-${{ env.CHECKRA1N_NAME }}
|
||||
mv src/palera1n ready/palera1n-${{ env.CHECKRA1N_NAME }}
|
||||
tar -zcf ready/dep_root_${{ matrix.triple }}.tgz dep_root
|
||||
|
||||
- name: Build debs
|
||||
run: |
|
||||
version=$(git describe --dirty --tags --abbrev=7 | sed 's|^v||' | sed 's|-beta|~beta|')
|
||||
|
||||
make -j$(nproc) docs
|
||||
mkdir -p stage/DEBIAN
|
||||
mkdir -p stage/usr/bin
|
||||
mkdir -p stage/usr/share/man/man1
|
||||
cp packaging/control stage/DEBIAN/control
|
||||
|
||||
sed 's|@DEB_ARCH@|${{ env.ARCH_NAME }}|g' -i stage/DEBIAN/control
|
||||
sed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
|
||||
|
||||
install -Dm644 ready/palera1n-${{ env.CHECKRA1N_NAME }} stage/usr/bin/palera1n
|
||||
install -Dm644 docs/palera1n.1 stage/usr/share/man/man1/palera1n.1
|
||||
chmod +x stage/usr/bin/palera1n
|
||||
|
||||
dpkg-deb -b stage palera1n_${{ env.ARCH_NAME }}.deb
|
||||
mv palera1n*.deb ready/
|
||||
rm -rf stage
|
||||
|
||||
- name: Get branch name
|
||||
id: branch-name
|
||||
uses: tj-actions/branch-names@v7
|
||||
|
||||
- name: Upload artifact
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: wangyucode/[email protected]
|
||||
@@ -672,4 +807,27 @@ jobs:
|
||||
forceUpload: true
|
||||
dryRun: false
|
||||
localDir: 'ready/'
|
||||
remoteDir: '/palera1n/artifacts/c-rewrite'
|
||||
remoteDir: '/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}'
|
||||
|
||||
finish-build:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
needs: [build-docs, build-darwin, darwin-dist, build-Linux]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Get branch name
|
||||
id: branch-name
|
||||
uses: tj-actions/branch-names@v7
|
||||
|
||||
- name: Download build tag
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: build-tag
|
||||
|
||||
- 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\"}")
|
||||
|
||||
@@ -20,3 +20,6 @@ docs/*.html
|
||||
build
|
||||
src/*.dmg.c
|
||||
.idea
|
||||
src/stage2/
|
||||
src/libcheckra1nhelper.dylib*
|
||||
src/Pongo.bin
|
||||
@@ -1,22 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
project(palera1n)
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
|
||||
set(CMAKE_CXX_STANDARD 99)
|
||||
set(SRC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(DEP ${SRC}/dep_root)
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
set(STATIC 0)
|
||||
set(CMAKE_SUPPRESS_REGENERATION ON)
|
||||
|
||||
set(CMAKE_BUILD_TYPE BUILD_TYPE)
|
||||
|
||||
|
||||
add_custom_target(distclean
|
||||
COMMAND sh -c "find src -name '*.o' -type f -delete"
|
||||
COMMAND sh -c "find src -perm -u+x -type f -delete"
|
||||
)
|
||||
#add_custom_target(distclean
|
||||
# COMMAND sh -c "rm -rf *"
|
||||
# )
|
||||
add_subdirectory(src)
|
||||
add_subdirectory(docs)
|
||||
@@ -1,14 +1,14 @@
|
||||
NAME = The Beginning of the End
|
||||
NAME = bakepale
|
||||
|
||||
SRC = $(shell pwd)
|
||||
DEP = $(SRC)/dep_root
|
||||
STRIP = strip
|
||||
CC ?= cc
|
||||
CFLAGS += -I$(DEP)/include -I$(SRC)/include -I$(SRC)
|
||||
CFLAGS += -Wall -Wextra -DPALERAIN_VERSION=\"2.0.0\" -Wall -Wextra -Wno-unused-parameter
|
||||
CFLAGS += -Wno-unused-variable -I$(SRC)/src -std=c99 -pedantic-errors -D_C99_SOURCE -D_POSIX_C_SOURCE=199506L -D_DARWIN_C_SOURCE
|
||||
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
|
||||
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
|
||||
LIBS += $(DEP)/lib/libimobiledevice-glue-1.0.a $(DEP)/lib/libplist-2.0.a -pthread -lm
|
||||
ifeq ($(TARGET_OS),)
|
||||
TARGET_OS = $(shell uname -s)
|
||||
endif
|
||||
@@ -18,22 +18,27 @@ ifeq (,$(findstring version-min=, $(CFLAGS)))
|
||||
CFLAGS += -mmacosx-version-min=10.8
|
||||
endif
|
||||
LDFLAGS += -Wl,-dead_strip
|
||||
LIBS += -framework CoreFoundation -framework SystemConfiguration -framework IOKit -framework Security
|
||||
LIBS += -framework CoreFoundation -framework IOKit
|
||||
else
|
||||
CFLAGS += -fdata-sections -ffunction-sections
|
||||
LDFLAGS += -static -no-pie -Wl,--gc-sections
|
||||
endif
|
||||
LIBS += $(DEP)/lib/libmbedtls.a $(DEP)/lib/libmbedcrypto.a $(DEP)/lib/libmbedx509.a $(DEP)/lib/libreadline.a
|
||||
|
||||
ifeq ($(DEV_BUILD),1)
|
||||
ifeq ($(TUI),1)
|
||||
LIBS += $(DEP)/lib/libnewt.a $(DEP)/lib/libpopt.a $(DEP)/lib/libslang.a
|
||||
ifeq ($(TARGET_OS),Linux)
|
||||
LIBS += $(DEP)/lib/libgpm.a
|
||||
endif
|
||||
endif
|
||||
ifeq ($(DEV_BUILD),1)
|
||||
CFLAGS += -O0 -g -DDEV_BUILD -fno-omit-frame-pointer
|
||||
ifeq ($(ASAN),1)
|
||||
BUILD_STYLE=ASAN
|
||||
CFLAGS += -fsanitize=address,undefined -fsanitize-address-use-after-return=runtime
|
||||
else ifeq ($(TSAN),1)
|
||||
BUILD_STYLE=TSAN
|
||||
CFLAGS += -fsanitize=thread,undefined
|
||||
else
|
||||
BUILD_STYLE = DEVELOPMENT
|
||||
endif
|
||||
@@ -41,18 +46,25 @@ else
|
||||
CFLAGS += -Os -g
|
||||
BUILD_STYLE = RELEASE
|
||||
endif
|
||||
LIBS += -lc
|
||||
|
||||
ifneq ($(BAKERAIN_DEVELOPE_R),)
|
||||
CFLAGS += -DBAKERAIN_DEVELOPE_R="\"$(BAKERAIN_DEVELOPE_R)\""
|
||||
endif
|
||||
|
||||
BUILD_DATE := $(shell LANG=C date)
|
||||
BUILD_NUMBER := $(shell git rev-list --count HEAD)
|
||||
BUILD_TAG := $(shell git describe --dirty --tags --abbrev=7)
|
||||
BUILD_WHOAMI := $(shell whoami)
|
||||
BUILD_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
|
||||
BUILD_COMMIT := $(shell git rev-parse HEAD)
|
||||
|
||||
CFLAGS += -DBUILD_STYLE="\"$(BUILD_STYLE)\"" -DBUILD_DATE="\"$(BUILD_DATE)\"" -DBUILD_WHOAMI=\"$(BUILD_WHOAMI)\" -DBUILD_TAG=\"$(BUILD_TAG)\"
|
||||
CFLAGS += -DBUILD_STYLE="\"$(BUILD_STYLE)\"" -DBUILD_DATE="\"$(BUILD_DATE)\""
|
||||
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 CFLAGS LDFLAGS LIBS TARGET_OS DEV_BUILD BUILD_DATE BUILD_TAG BUILD_WHOAMI BUILD_STYLE
|
||||
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
|
||||
|
||||
@@ -64,13 +76,13 @@ clean:
|
||||
$(MAKE) -C docs clean
|
||||
|
||||
download-deps:
|
||||
$(MAKE) -C src checkra1n-macos checkra1n-linux-arm64 checkra1n-linux-armel checkra1n-linux-x86 checkra1n-linux-x86_64 checkra1n-kpf-pongo ramdisk.dmg binpack.dmg
|
||||
$(MAKE) -C src checkra1n-macos checkra1n-linux-arm64 checkra1n-linux-armel checkra1n-linux-x86 checkra1n-linux-x86_64 checkra1n-kpf-pongo ramdisk.dmg binpack.dmg Pongo.bin
|
||||
|
||||
docs:
|
||||
$(MAKE) -C docs
|
||||
|
||||
distclean: clean
|
||||
rm -rf palera1n-* palera1n*.dSYM src/checkra1n-* src/checkra1n-kpf-pongo src/ramdisk.dmg src/binpack.dmg
|
||||
rm -rf palera1n-* palera1n*.dSYM src/checkra1n-* src/checkra1n-kpf-pongo src/ramdisk.dmg src/binpack.dmg src/Pongo.bin
|
||||
|
||||
.PHONY: all palera1n clean docs distclean
|
||||
|
||||
@@ -1,40 +1,36 @@
|
||||
<img align="left" height="120" src="https://cdn.discordapp.com/attachments/1017854329887129611/1073858292159352862/thing.png" alt="palera1n logo" style="float: left;"/>
|
||||
<h3 align="right">An iOS 15.0-16.3 work-in-progress, <br>semi-tethered checkm8 jailbreak</h3>
|
||||
<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>
|
||||
|
||||
<p align="right" >
|
||||
<strong><a href="https://cdn.nickchan.lol/palera1n/c-rewrite/releases/v2.0.0-beta.1/palera1n.1.html">Usage</a></strong>
|
||||
•
|
||||
<strong><a href="https://github.com/palera1n/palera1n-c/graphs/contributors">Contributors</a></strong>
|
||||
•
|
||||
<strong><a href="https://dsc.gg/palera1n">Discord</a></strong>
|
||||
•
|
||||
<strong><a href="https://twitter.com/palera1n">Twitter</a></strong>
|
||||
</p>
|
||||
<div class="clear"></div>
|
||||
<br clear="both"/>
|
||||
|
||||
### You can obtain v2.0.0 beta [here](https://github.com/palera1n/palera1n-c/releases).
|
||||
## 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).
|
||||
|
||||
# Warnings
|
||||
- This palera1n rewrite has noticeably different arguments compared to older palera1n, would recommend you take a look at how to use palera1n-c [here](https://cdn.nickchan.lol/palera1n/c-rewrite/releases/v2.0.0-beta.1/palera1n.1.html).
|
||||
## 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`.
|
||||
|
||||
- This does **NOT** support tethered creation or booting. You must use the older [shell version of palera1n](https://github.com/palera1n/palera1n).
|
||||
- palera1n will never work in VirtualBox, VMware or any virtual machine that doesn't support PCI passthrough.
|
||||
|
||||
- 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`.
|
||||
|
||||
- palera1n-c will never work in VirtualBox, VMware or any virtual machine that doesn't support a PCI passthrough.
|
||||
|
||||
# Requirements
|
||||
- Needs 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 that 16GB devices cannot be semi-tethered with Rootful.
|
||||
- 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 `A11`).
|
||||
## 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
|
||||
- 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>
|
||||
|
||||
- A Linux or macOS computer
|
||||
- AMD CPUs (not AMD Mobile) have an issue [with (likely) their USB controllers] that causes them to have a very low success rate with checkm8. It is not recommended that you use them with palera1n.
|
||||
- If your device does not successfully jailbreak, try a computer with an Intel or other CPU
|
||||
|
||||
- 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.
|
||||
|
||||
# Need help?
|
||||
## Need help?
|
||||
|
||||
Make sure you provide full details on your device, such as:
|
||||
- iDevice
|
||||
@@ -42,19 +38,15 @@ Make sure you provide full details on your device, such as:
|
||||
- Passcode enabled?
|
||||
- Logs, if panicked then send latest `panic-full` log from your iDevice.
|
||||
|
||||
Using `-V` and `-v` would help with debugging.
|
||||
Using `-VvL` would help with debugging.
|
||||
|
||||
Join the [Support Discord](https://dsc.gg/palera1n), and find the palera1n-c thread under #jailbreak [here](https://discord.com/channels/1028398973452570725/1074251283143344180).
|
||||
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>palera1n-c Contributors and Credits</summary>
|
||||
## Credits
|
||||
<details><summary>Credits</summary>
|
||||
<p>
|
||||
|
||||
- [Nick Chan](https://github.com/asdfugil) for the rewrite
|
||||
- [Nebula](https://github.com/itsnebulalol), palera1n owner and Python rewrite lead developer
|
||||
- [Mineek](https://github.com/mineek)
|
||||
- [Tom](https://github.com/guacaplushy) for updated ploosh kpf
|
||||
- [Lakhan Lothiyi](https://github.com/llsc12) for palera1n loader app
|
||||
- [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
|
||||
@@ -74,8 +66,10 @@ Thank you so much to our Patreons that make the future development possible! You
|
||||
<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/1616888462665306113/AsjJvtyt_400x400.jpg"></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>
|
||||
<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>
|
||||
@@ -1,4 +0,0 @@
|
||||
add_custom_target(
|
||||
docs
|
||||
COMMAND sh -c "mandoc -T html -O style=mandoc.css palera1n.1 > palera1n.1.html"
|
||||
)
|
||||
+63
-23
@@ -2,25 +2,25 @@
|
||||
.\" Copyright (c) 2023 Nick Chan
|
||||
.\" SPDX-License-Identifier: MIT
|
||||
.\"
|
||||
.Dd "06 February 2023"
|
||||
.Dt "Nick Chan utilities manual" 1 "palera1n"
|
||||
.Dd "20 March 2023"
|
||||
.Dt palera1n 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm palera1n
|
||||
.Nd iOS 15+ arm64 iOS/iPadOS jailbreaking tool
|
||||
.Nd iOS 15.0-16.5 arm64 iOS/iPadOS jailbreaking tool
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl BcdDEfhlnLOpRsvV
|
||||
.Op Fl cCdDEfhIlLnpRsSvV
|
||||
.Op Fl e Ar Boot arguments
|
||||
.Op Fl k Ar Pongo image
|
||||
.Op Fl o Ar overlay file
|
||||
.Op Fl r Ar ramdisk file
|
||||
.Op Fl K Ar KPF file
|
||||
.Op Fl i Ar checkra1n file
|
||||
.Op Fl -version
|
||||
.Op Fl -force-revert
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
jailbreaks any iOS/iPadOS device with an arm64 (arm64e excluded) on iOS 15+,
|
||||
jailbreaks any iOS/iPadOS device with an arm64 (arm64e excluded) on iOS 15.0-16.5,
|
||||
utilizing the
|
||||
.Em checkm8
|
||||
bootROM exploit.
|
||||
@@ -48,8 +48,11 @@ On iOS 16, the passcode must be off since restore, and
|
||||
from settings app counts as a restore.
|
||||
A backup may be used in this case.
|
||||
.Pp
|
||||
In the remainder of this document, the term "iOS" and "iPadOS" will be used interchangably
|
||||
as the difference is negligible as far as the jailbreak is concerened.
|
||||
.Pp
|
||||
.Sh SUPPORTED DEVICES
|
||||
As described above, arm64 iOS/iPadOS 15+ devices are supported, here is an explicit
|
||||
As described above, arm64 iOS 15.0-16.5 devices are supported, here is an explicit
|
||||
list of supported devicecs:
|
||||
|
||||
.Bl -tag -compact
|
||||
@@ -103,14 +106,28 @@ is not supported when this option is used together with
|
||||
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. (good for 16 GB devices)
|
||||
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 ,
|
||||
Create the new APFS volume required for rootful. Will fail if one already exists.
|
||||
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.
|
||||
.It Fl d , -demote
|
||||
Set the effective production fuse to 0, so as to enable hardware debugging features.
|
||||
.It Fl D , -dfuhelper-only
|
||||
.It Fl D , -dfuhelper
|
||||
Execute the DFU helper to guide the user into putting the device into DFU mode
|
||||
then exit.
|
||||
.It Fl e , -boot-args Ar boot arguments
|
||||
@@ -122,9 +139,9 @@ and cannot be overriden. Additionally, the
|
||||
.Em wdt=-1
|
||||
argument is used during fakefs setup.
|
||||
.It Fl E , -enter-recovery
|
||||
Exit after entering recovery mode.q
|
||||
Exit after entering recovery mode.
|
||||
.It Fl f , -fakefs
|
||||
Jailbreak in rootful mode.
|
||||
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
|
||||
@@ -138,10 +155,10 @@ Override the kernel patchfinder PongoOS module. The module is required to suppor
|
||||
root filesystem in paleinfo with
|
||||
.Em rootfs
|
||||
command. If in doubt, use
|
||||
.Sy https://github.com/guacaplushy/PongoOS
|
||||
.Sy https://github.com/palera1n/PongoOS
|
||||
iOS15 branch or your own fork of it.
|
||||
.It Fl l , -rootless
|
||||
Jailbreak in rootless mode, this is the default when neither
|
||||
Proceed in rootless mode, this is the default when neither
|
||||
.Fl l , -rootless
|
||||
and
|
||||
.Fl f , -fakefs
|
||||
@@ -161,8 +178,6 @@ at the root of it, as well as a dmg named
|
||||
.Em loader.dmg
|
||||
at the root of it. Otherwise, the device will not boot. It is also expected that it
|
||||
contains a shell, a ssh server, and various command line utilities.
|
||||
.It Fl O , -disable-ohio
|
||||
Disable ohio (disable analytics)
|
||||
.It Fl p , -pongo-shell
|
||||
Exit after booting into a clean PongoOS shell
|
||||
.It Fl P , -pongo-full
|
||||
@@ -183,14 +198,18 @@ specified (see
|
||||
.Sy FILES
|
||||
section below) will be executed. The loader app and the built in SSH server can still be used,
|
||||
as well as any jailbreak-specific apps you have installed.
|
||||
.It Fl S , -no-colors
|
||||
Disable colors on the command line. External programs like checkra1n clones may still output colors.
|
||||
.It Fl v , -debug-logging
|
||||
Enable debug logging. The option may be repeated for extra verbosity.
|
||||
.It Fl V , -verbose-boot
|
||||
Boots the device in verbose mode, allowing boot logs to be seen.
|
||||
.It Fl I , -device-info
|
||||
Prints info about device and exits.
|
||||
.El
|
||||
.Sh ENVIRONMENTAL VARIABLES
|
||||
.Bl -tag -width -indent
|
||||
.It TMPDIR
|
||||
.It Ev TMPDIR
|
||||
This environmental variable should contain the a directory for temporary
|
||||
files. Without the
|
||||
.Fl i , -override-checkra1n
|
||||
@@ -205,7 +224,7 @@ To (re-)jailbreak in rootless mode:
|
||||
To setup fakefs for rootful mode:
|
||||
.Pp
|
||||
.Dl "palera1n -fc"
|
||||
.Ppq
|
||||
.Pp
|
||||
After the device has rebooted, follow the following example.
|
||||
.Pp
|
||||
To re-jailbreak in rootful mode:
|
||||
@@ -224,6 +243,10 @@ 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"
|
||||
@@ -231,7 +254,7 @@ To exit recovery mode:
|
||||
.Sh CAVEATS
|
||||
.Pp
|
||||
.Em -v
|
||||
is not a real XNU boot argument. It is intercepted by iBoot. However, since XNU
|
||||
is not a real XNU boot argument. It is interpreted by iBoot. However, since XNU
|
||||
boot arguments are set in PongoOS, which is ran after iBoot has ran, it does nothing.
|
||||
To verbose boot, use the
|
||||
.Fl V , -verbose-boot
|
||||
@@ -246,11 +269,16 @@ version of the Procursus fork of
|
||||
before they can be ran on a device jailbroken with
|
||||
.Nm
|
||||
\[char46]
|
||||
.Sh POST INSTLLATION
|
||||
.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:
|
||||
.Pp
|
||||
.Sy https://www.icloud.com/shortcuts/8cd5f489c8854ee0ab9ee38f2e62f87d
|
||||
.Lk https://www.icloud.com/shortcuts/8cd5f489c8854ee0ab9ee38f2e62f87d
|
||||
.Pp
|
||||
to open it. After opening the loader app, press install to install a bootstrap as well as
|
||||
the
|
||||
@@ -291,14 +319,26 @@ has been mounted.
|
||||
.Nm
|
||||
may crash if the machine it is running on:
|
||||
.Pp
|
||||
.Dl "- Has no USB ports"
|
||||
.Pp
|
||||
.Dl "- Has non-compliant USB devices plugged in"
|
||||
.Pp
|
||||
The exploit may also work less reliably on some hosts, like AMD desktops, or some MediaTek devices.
|
||||
.Pp
|
||||
The device may randomly crash and reboot due to launchd exiting with code 7.
|
||||
.Sh NOTES
|
||||
.Nm
|
||||
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.
|
||||
.Sh SEE ALSO
|
||||
.Xr launchd 8
|
||||
.Xr launchd.plist 5
|
||||
|
||||
Regular → Executable
+3
-3
@@ -1,12 +1,12 @@
|
||||
curl -LOOOOOO \
|
||||
https://github.com/Mbed-TLS/mbedtls/archive/refs/tags/v3.3.0.tar.gz \
|
||||
https://github.com/libusb/libusb/releases/download/1.0.26/libusb-1.0.26.tar.bz2 \
|
||||
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 master.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
|
||||
@@ -17,4 +17,4 @@ git clone --depth=1 https://github.com/libimobiledevice/libplist
|
||||
git clone --depth=1 https://github.com/libimobiledevice/libimobiledevice-glue
|
||||
git clone --depth=1 https://github.com/libimobiledevice/libirecovery
|
||||
git clone --depth=1 https://github.com/libimobiledevice/libusbmuxd
|
||||
git clone --depth=1 https://github.com/libimobiledevice/libimobiledevice
|
||||
git clone --depth=1 https://github.com/libimobiledevice/libimobiledevice
|
||||
+12
-13
@@ -59,6 +59,13 @@
|
||||
#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)
|
||||
@@ -68,18 +75,20 @@
|
||||
// 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 DEV_BUILD
|
||||
#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 */
|
||||
#define host_option_no_ohio (1 << 4) /* Disable Ohio (Analytics) */
|
||||
// (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'
|
||||
@@ -118,18 +127,8 @@ struct kpfinfo {
|
||||
options = (checkrain_option_t)(options & ~option); \
|
||||
} while (0);
|
||||
|
||||
static inline bool checkrain_option_enabled(checkrain_option_t flags, checkrain_option_t opt)
|
||||
static inline bool checkrain_options_enabled(checkrain_option_t flags, checkrain_option_t opt)
|
||||
{
|
||||
if(flags == checkrain_option_failure)
|
||||
{
|
||||
switch(opt)
|
||||
{
|
||||
case checkrain_option_safemode:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return (flags & opt) != 0;
|
||||
}
|
||||
|
||||
|
||||
+23
-16
@@ -2,7 +2,7 @@
|
||||
#define PALERAIN_H
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#define _DARWIN_C_SOURCE 1
|
||||
#define NSIG __DARWIN_NSIG
|
||||
#endif
|
||||
|
||||
#include "xxd-embedded.h"
|
||||
@@ -31,6 +31,7 @@
|
||||
#define USB_RET_SUCCESS LIBUSB_SUCCESS
|
||||
#define USB_RET_NOT_RESPONDING LIBUSB_ERROR_OTHER
|
||||
#define USB_RET_IO LIBUSB_ERROR_IO
|
||||
#define USB_RET_NO_DEVICE LIBUSB_ERROR_NO_DEVICE
|
||||
typedef int usb_ret_t;
|
||||
typedef libusb_device_handle *usb_device_handle_t;
|
||||
|
||||
@@ -51,7 +52,8 @@ usb_ret_t USBBulkUpload(usb_device_handle_t handle, void *data, int len);
|
||||
|
||||
#define USB_RET_SUCCESS KERN_SUCCESS
|
||||
#define USB_RET_NOT_RESPONDING kIOReturnNotResponding
|
||||
#define USB_RET_IO kIOReturnNotResponding
|
||||
#define USB_RET_IO kIOReturnNotReady
|
||||
#define USB_RET_NO_DEVICE kIOReturnNoDevice
|
||||
|
||||
typedef IOReturn usb_ret_t;
|
||||
typedef IOUSBInterfaceInterface245 **usb_device_handle_t;
|
||||
@@ -98,6 +100,8 @@ struct mach_header_64
|
||||
};
|
||||
#endif
|
||||
|
||||
typedef void *(*pthread_start_t)(void *);
|
||||
|
||||
// Keep in sync with Pongo
|
||||
#define PONGO_USB_VENDOR 0x05ac
|
||||
#define PONGO_USB_PRODUCT 0x4141
|
||||
@@ -147,7 +151,7 @@ typedef unsigned char niarelap_file_t[];
|
||||
extern unsigned int verbose;
|
||||
|
||||
extern char* pongo_path;
|
||||
#ifdef DEV_BUILD
|
||||
#ifdef TUI
|
||||
extern bool tui_started;
|
||||
#endif
|
||||
|
||||
@@ -178,13 +182,13 @@ extern char* ext_checkra1n;
|
||||
|
||||
void thr_cleanup(void* ptr);
|
||||
void* dfuhelper(void* ptr);
|
||||
int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxname, char* __restrict format, ...);
|
||||
int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxname, const char* __restrict format, ...);
|
||||
/* devhelper helpers */
|
||||
void devinfo_free(devinfo_t *dev);
|
||||
bool cpid_is_arm64(unsigned int cpid);
|
||||
/* devhelper commands */
|
||||
int subscribe_cmd(usbmuxd_event_cb_t device_event_cb, irecv_device_event_cb_t irecv_event_cb);
|
||||
int unsubscribe_cmd();
|
||||
int unsubscribe_cmd(void);
|
||||
int devinfo_cmd(devinfo_t *dev, const char *udid);
|
||||
int enter_recovery_cmd(const char* udid);
|
||||
int reboot_cmd(const char* udid);
|
||||
@@ -193,35 +197,38 @@ int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid);
|
||||
int autoboot_cmd(const uint64_t ecid);
|
||||
int exitrecv_cmd(const uint64_t ecid);
|
||||
|
||||
int exec_checkra1n();
|
||||
int exec_checkra1n(void);
|
||||
int override_file(override_file_t *finfo, niarelap_file_t** orig, unsigned int *orig_len, char *filename);
|
||||
void* pongo_helper(void* ptr);
|
||||
const unsigned char *
|
||||
boyermoore_horspool_memmem(const unsigned char* haystack, size_t hlen,
|
||||
const unsigned char* needle, size_t nlen);
|
||||
|
||||
|
||||
extern void* pongo_usb_callback(void* arg);
|
||||
extern void* pongo_usb_callback(stuff_t* arg);
|
||||
usb_ret_t USBControlTransfer(usb_device_handle_t handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint32_t wLength, void *data, uint32_t *wLenDone);
|
||||
const char *usb_strerror(usb_ret_t err);
|
||||
int wait_for_pongo();
|
||||
int issue_pongo_command();
|
||||
int upload_pongo_file();
|
||||
int tui();
|
||||
int wait_for_pongo(void);
|
||||
int upload_pongo_file(usb_device_handle_t, unsigned char*, unsigned int);
|
||||
int issue_pongo_command(usb_device_handle_t, char*);
|
||||
int tui(void);
|
||||
int optparse(int argc, char* argv[]);
|
||||
|
||||
bool get_spin();
|
||||
bool get_spin(void);
|
||||
bool set_spin(bool val);
|
||||
bool get_found_pongo();
|
||||
bool get_found_pongo(void);
|
||||
void* pongo_helper(void* _);
|
||||
bool set_found_pongo(bool val);
|
||||
uint64_t get_ecid_wait_for_dfu();
|
||||
uint64_t get_ecid_wait_for_dfu(void);
|
||||
uint64_t set_ecid_wait_for_dfu(uint64_t ecid);
|
||||
|
||||
void write_stdout(char *buf, uint32_t len);
|
||||
void io_start(stuff_t *stuff);
|
||||
void io_stop(stuff_t *stuff);
|
||||
|
||||
void print_credits();
|
||||
void print_credits(void);
|
||||
|
||||
#ifdef DEV_BUILD
|
||||
#ifdef TUI
|
||||
#include <newt.h>
|
||||
newtComponent get_tui_log();
|
||||
newtComponent set_tui_log(newtComponent co);
|
||||
|
||||
+2
-1
@@ -11,6 +11,7 @@
|
||||
#include <locale.h>
|
||||
#include <unistd.h>
|
||||
#include <newt.h>
|
||||
#include <kerninfo.h>
|
||||
|
||||
#define WIDTH 76
|
||||
#define HEIGHT 19
|
||||
@@ -19,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_option_enabled(flags, opt) ? '*' : ' '
|
||||
#define CHECKBOX_STATE(flags, opt) checkrain_options_enabled(flags, opt) ? '*' : ' '
|
||||
|
||||
typedef enum tui_screens {
|
||||
ERROR_SCREEN = -1,
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
#ifndef XXD_EMBEDDED_H
|
||||
#define XXD_EMBEDDED_H
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#include <TargetConditionals.h>
|
||||
#endif
|
||||
|
||||
extern unsigned char checkra1n[];
|
||||
extern unsigned int checkra1n_len;
|
||||
|
||||
@@ -13,4 +17,12 @@ extern unsigned int ramdisk_dmg_len;
|
||||
extern unsigned char binpack_dmg[];
|
||||
extern unsigned int binpack_dmg_len;
|
||||
|
||||
extern unsigned char Pongo_bin[];
|
||||
extern unsigned int Pongo_bin_len;
|
||||
|
||||
#if defined(__APPLE__) && (TARGET_OS_IPHONE || defined(DEV_BUILD))
|
||||
extern unsigned char libcheckra1nhelper_dylib[];
|
||||
extern unsigned int libcheckra1nhelper_dylib_len;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
Package: palera1n
|
||||
Name: palera1n
|
||||
Version: @DEB_VERSION@
|
||||
Architecture: @DEB_ARCH@
|
||||
Maintainer: palera1n team
|
||||
Author: palera1n team
|
||||
Depends: usbmuxd
|
||||
Section: Utilities
|
||||
Priority: optional
|
||||
Homepage: https://palera.in
|
||||
Description: iOS 15.0-16.5 semi-tethered checkm8 jailbreak
|
||||
palera1n is an iOS/iPadOS 15.0-16.5 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.
|
||||
@@ -0,0 +1,16 @@
|
||||
Package: palera1n
|
||||
Name: palera1n
|
||||
Version: @DEB_VERSION@
|
||||
Architecture: @DEB_ARCH@
|
||||
Maintainer: palera1n team
|
||||
Author: palera1n team
|
||||
Section: Utilities
|
||||
Priority: optional
|
||||
Homepage: https://palera.in
|
||||
Description: iOS 15.0-16.5 semi-tethered checkm8 jailbreak
|
||||
palera1n is an iOS/iPadOS 15.0-16.5 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.
|
||||
@@ -1,6 +1,6 @@
|
||||
From 632cdb6de3f1693fb90d60d81552b723e8dd5e84 Mon Sep 17 00:00:00 2001
|
||||
From a2d012f3ba459f6debe636b576ad9aeab7b3c2aa Mon Sep 17 00:00:00 2001
|
||||
From: Nick Chan <[email protected]>
|
||||
Date: Wed, 25 Jan 2023 01:53:00 +0800
|
||||
Date: Sat, 27 May 2023 23:50:23 +0800
|
||||
Subject: [PATCH] Allow empty x509 cert issuer
|
||||
|
||||
---
|
||||
@@ -8,25 +8,24 @@ Subject: [PATCH] Allow empty x509 cert issuer
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/library/x509_crt.c b/library/x509_crt.c
|
||||
index 0eee97cb6..46702f683 100644
|
||||
index cf62532f2..ef25b3d77 100644
|
||||
--- a/library/x509_crt.c
|
||||
+++ b/library/x509_crt.c
|
||||
@@ -1185,14 +1185,14 @@ static int x509_crt_parse_der_core( mbedtls_x509_crt *crt,
|
||||
if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
|
||||
MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
|
||||
{
|
||||
- mbedtls_x509_crt_free( crt );
|
||||
- return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_FORMAT, ret ) );
|
||||
+ // mbedtls_x509_crt_free( crt );
|
||||
+ // return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_FORMAT, ret ) );
|
||||
@@ -1061,13 +1061,13 @@ static int x509_crt_parse_der_core(mbedtls_x509_crt *crt,
|
||||
|
||||
if ((ret = mbedtls_asn1_get_tag(&p, end, &len,
|
||||
MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
|
||||
- mbedtls_x509_crt_free(crt);
|
||||
- return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);
|
||||
+ /*mbedtls_x509_crt_free(crt);
|
||||
+ return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);*/
|
||||
}
|
||||
|
||||
if( ( ret = mbedtls_x509_get_name( &p, p + len, &crt->issuer ) ) != 0 )
|
||||
{
|
||||
- mbedtls_x509_crt_free( crt );
|
||||
- return( ret );
|
||||
+ // mbedtls_x509_crt_free( crt );
|
||||
+ // return( ret );
|
||||
if ((ret = mbedtls_x509_get_name(&p, p + len, &crt->issuer)) != 0) {
|
||||
- mbedtls_x509_crt_free(crt);
|
||||
- return ret;
|
||||
+ /*mbedtls_x509_crt_free(crt);
|
||||
+ return ret;*/
|
||||
}
|
||||
|
||||
crt->issuer_raw.len = p - crt->issuer_raw.p;
|
||||
|
||||
@@ -1,344 +0,0 @@
|
||||
#execute_process(COMMAND sh -c "cd ../dep_root && sh ../download_deps.sh")
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
|
||||
|
||||
|
||||
#set(SRC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
#set(DEP ${SRC}/../dep_root)
|
||||
|
||||
cmake_parse_arguments(palera1n "" "" "-arch" ${ARGN})
|
||||
|
||||
set(CHECKRA1N_VERSION 0.1337.1)
|
||||
if( ${LDID})
|
||||
set(LDID ldid)
|
||||
endif()
|
||||
if( ${LIPO})
|
||||
set(LIPO lipo)
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
set(CHECKRA1N_FILE_NAME checkra1n-macos)
|
||||
else()
|
||||
set(CHECKRA1N_FILE_NAME checkra1n-linux-${CMAKE_SYSTEM_PROCESSOR})
|
||||
endif()
|
||||
|
||||
add_executable(palera1n
|
||||
binpack.dmg.c
|
||||
checkra1n-kpf-pongo.c
|
||||
checkra1n.c
|
||||
devhelper.c
|
||||
dfuhelper.c
|
||||
exec_checkra1n.c
|
||||
lock_vars.c
|
||||
lockdown_helper.c
|
||||
log.c
|
||||
main.c
|
||||
optparse.c
|
||||
override_file.c
|
||||
pongo_helper.c
|
||||
credits.c
|
||||
ramdisk.dmg.c
|
||||
../include/kerninfo.h
|
||||
../include/palerain.h
|
||||
../include/ANSI-color-codes.h
|
||||
../include/tui.h
|
||||
../include/xxd-embedded.h
|
||||
)
|
||||
|
||||
add_compile_options(-Wall -Wextra -Wno-unused-parameter -pedantic-errors -g)
|
||||
|
||||
# adds dev mode files
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
get_property(MY_TARGET_SOURCES TARGET palera1n PROPERTY SOURCES)
|
||||
list(APPEND MY_TARGET_SOURCES tui_main.c
|
||||
tui_screen_enter_dfu.c
|
||||
tui_screen_enter_recovery.c
|
||||
tui_screen_jailbreak.c
|
||||
tui_screen_main.c
|
||||
tui_screen_options.c)
|
||||
set_property(TARGET palera1n PROPERTY SOURCES ${MY_TARGET_SOURCES})
|
||||
|
||||
|
||||
elseif(CMAKE_BUILD_TYPE STREQUAL "ASAN")
|
||||
get_property(MY_TARGET_SOURCES TARGET palera1n PROPERTY SOURCES)
|
||||
list(APPEND MY_TARGET_SOURCES tui_main.c
|
||||
tui_screen_enter_dfu.c
|
||||
tui_screen_enter_recovery.c
|
||||
tui_screen_jailbreak.c
|
||||
tui_screen_main.c
|
||||
tui_screen_options.c)
|
||||
set_property(TARGET palera1n PROPERTY SOURCES ${MY_TARGET_SOURCES})
|
||||
add_compile_options(-fsanitize=address,undefined -fsanitize-address-use-after-return=runtime)
|
||||
elseif(CMAKE_BUILD_TYPE STREQUAL "TSAN")
|
||||
get_property(MY_TARGET_SOURCES TARGET palera1n PROPERTY SOURCES)
|
||||
list(APPEND MY_TARGET_SOURCES tui_main.c
|
||||
tui_screen_enter_dfu.c
|
||||
tui_screen_enter_recovery.c
|
||||
tui_screen_jailbreak.c
|
||||
tui_screen_main.c
|
||||
tui_screen_options.c)
|
||||
set_property(TARGET palera1n PROPERTY SOURCES ${MY_TARGET_SOURCES})
|
||||
add_compile_options(-fsanitize=thread,undefined)
|
||||
else()
|
||||
set(CMAKE_BUILD_TYPE "Release")
|
||||
endif()
|
||||
|
||||
#message("Testing for Clang/LLVM")
|
||||
#string(TOLOWER CMAKE_C_COMPILER_ID COMPILER)
|
||||
|
||||
#if(CMAKE_C_COMPILER_ID MATCHES "AppleClang" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
# message("Using clang/llvm! Enabling -flto=full! Please make sure clang is up to date, or else compile will fail")
|
||||
# add_compile_options(-flto=full)
|
||||
#else()
|
||||
# message("Not using clang/llvm! Using normal lto/no lto!")
|
||||
# add_compile_options(-flto)
|
||||
#endif()
|
||||
|
||||
|
||||
|
||||
#add_custom_command(TARGET palera1n
|
||||
# COMMAND sh -c "curl -LO https://assets.checkra.in/downloads/preview/${CHECKRA1N_VERSION}/${CHECKRA1N_FILE_NAME} && chmod 755 ${CHECKRA1N_FILE_NAME}"
|
||||
# )
|
||||
#
|
||||
#if(APPLE)
|
||||
# add_custom_command(TARGET palera1n
|
||||
# COMMAND sh -c "ldid -Scheckra1n.plist checkra1n"
|
||||
# )
|
||||
# add_custom_command(TARGET palera1n
|
||||
# COMMAND lipo -thin ${CMAKE_SYSTEM_PROCESSOR} -output checkra1n checkra1n-macos
|
||||
# )
|
||||
# if(CFLAGS MATCHES "version-min=")
|
||||
# add_custom_command(TARGET palera1n
|
||||
# COMMAND sh -c "vtool -remove-build-version 1 -replace -output checkra1n checkra1n && vtool -set-build-version $(FAKE_PLATFORM) $(FAKE_MINOS) $(FAKE_SDK) -replace -output checkra1n checkra1n && install_name_tool -change /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit /System/Library/Frameworks/IOKit.framework/IOKit checkra1n && install_name_tool -change /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation checkra1n && ${LDID} -Susb.xml checkra1n"
|
||||
# )
|
||||
# endif()
|
||||
#else()
|
||||
# execute_process(
|
||||
# COMMAND cp ${CHECKRA1N_FILE_NAME} ../src/checkra1n
|
||||
# )
|
||||
#endif()
|
||||
|
||||
#ifneq (,$(findstring arm64, $(CFLAGS)))
|
||||
#$(LIPO) -thin arm64 -output checkra1n checkra1n-macos
|
||||
#else ifneq (,$(findstring x86_64, $(CFLAGS)))
|
||||
#$(LIPO) -thin x86_64 -output checkra1n checkra1n-macos
|
||||
#else ifeq ($(shell arch),i386)
|
||||
#$(LIPO) -thin x86_64 -output checkra1n checkra1n-macos
|
||||
#else
|
||||
#$(LIPO) -thin $(shell arch) -output checkra1n checkra1n-
|
||||
|
||||
if(APPLE)
|
||||
if(${LIBUSB})
|
||||
target_compile_definitions(palera1n PRIVATE -DUSE_LIBUSB)
|
||||
get_property(MY_TARGET_SOURCES TARGET palera1n PROPERTY SOURCES)
|
||||
list(APPEND MY_TARGET_SOURCES
|
||||
usb_libusb.c)
|
||||
set_property(TARGET palera1n PROPERTY SOURCES ${MY_TARGET_SOURCES})
|
||||
target_link_libraries(palera1n
|
||||
${DEP}/lib/libusb-1.0.a
|
||||
)
|
||||
else()
|
||||
get_property(MY_TARGET_SOURCES TARGET palera1n PROPERTY SOURCES)
|
||||
list(APPEND MY_TARGET_SOURCES
|
||||
usb_iokit.c)
|
||||
set_property(TARGET palera1n PROPERTY SOURCES ${MY_TARGET_SOURCES})
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
if(IOS AND CMAKE_C_FLAGS MATCHES "arm64")
|
||||
add_custom_command(
|
||||
COMMAND sh -c "curl -Lo checkra1n-macos https://assets.checkra.in/downloads/preview/0.1337.1/${CHECKRA1N_FILE_NAME} "
|
||||
COMMAND lipo -thin arm64 -output checkra1n checkra1n-macos
|
||||
COMMAND sh -c "vtool -remove-build-version 1 -replace -output checkra1n checkra1n && vtool -set-build-version $(FAKE_PLATFORM) $(FAKE_MINOS) $(FAKE_SDK) -replace -output checkra1n checkra1n && install_name_tool -change /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit /System/Library/Frameworks/IOKit.framework/IOKit checkra1n && install_name_tool -change /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation checkra1n && ${LDID} -Susb.xml checkra1n"
|
||||
COMMAND sh -c "curl -Lo binpack.dmg https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg"
|
||||
COMMAND sh -c "curl -Lo ramdisk.dmg https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg"
|
||||
COMMAND sh -c "curl -Lo checkra1n-kpf-pongo https://cdn.nickchan.lol/palera1n/artifacts/kpf/checkra1n-kpf-pongo"
|
||||
COMMAND pwd
|
||||
COMMAND xxd -iC checkra1n checkra1n.c
|
||||
COMMAND xxd -iC binpack.dmg binpack.dmg.c
|
||||
COMMAND xxd -iC ramdisk.dmg ramdisk.dmg.c
|
||||
COMMAND xxd -iC checkra1n-kpf-pongo checkra1n-kpf-pongo.c
|
||||
OUTPUT checkra1n.c checkra1n-kpf-pongo.c ramdisk.dmg.c binpack.dmg.c binpack.dmg ramdisk.dmg checkra1n-kpf-pongo
|
||||
)
|
||||
elseif(CMAKE_C_FLAGS MATCHES "arm64")
|
||||
add_custom_command(
|
||||
COMMAND sh -c "curl -Lo checkra1n-macos https://assets.checkra.in/downloads/preview/0.1337.1/${CHECKRA1N_FILE_NAME} "
|
||||
COMMAND lipo -thin arm64 -output checkra1n checkra1n-macos
|
||||
COMMAND sh -c "curl -Lo binpack.dmg https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg"
|
||||
COMMAND sh -c "curl -Lo ramdisk.dmg https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg"
|
||||
COMMAND sh -c "curl -Lo checkra1n-kpf-pongo https://cdn.nickchan.lol/palera1n/artifacts/kpf/checkra1n-kpf-pongo"
|
||||
COMMAND pwd
|
||||
COMMAND xxd -iC checkra1n checkra1n.c
|
||||
COMMAND xxd -iC binpack.dmg binpack.dmg.c
|
||||
COMMAND xxd -iC ramdisk.dmg ramdisk.dmg.c
|
||||
COMMAND xxd -iC checkra1n-kpf-pongo checkra1n-kpf-pongo.c
|
||||
OUTPUT checkra1n.c checkra1n-kpf-pongo.c ramdisk.dmg.c binpack.dmg.c binpack.dmg ramdisk.dmg checkra1n-kpf-pongo
|
||||
)
|
||||
else()
|
||||
add_custom_command(
|
||||
COMMAND sh -c "curl -Lo checkra1n-macos https://assets.checkra.in/downloads/preview/0.1337.1/${CHECKRA1N_FILE_NAME} "
|
||||
COMMAND lipo -thin x86_64 -output checkra1n checkra1n-macos
|
||||
COMMAND sh -c "curl -Lo binpack.dmg https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg"
|
||||
COMMAND sh -c "curl -Lo ramdisk.dmg https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg"
|
||||
COMMAND sh -c "curl -Lo checkra1n-kpf-pongo https://cdn.nickchan.lol/palera1n/artifacts/kpf/checkra1n-kpf-pongo"
|
||||
COMMAND pwd
|
||||
COMMAND xxd -iC checkra1n checkra1n.c
|
||||
COMMAND xxd -iC binpack.dmg binpack.dmg.c
|
||||
COMMAND xxd -iC ramdisk.dmg ramdisk.dmg.c
|
||||
COMMAND xxd -iC checkra1n-kpf-pongo checkra1n-kpf-pongo.c
|
||||
OUTPUT checkra1n.c checkra1n-kpf-pongo.c ramdisk.dmg.c binpack.dmg.c binpack.dmg ramdisk.dmg checkra1n-kpf-pongo
|
||||
)
|
||||
endif()
|
||||
else()
|
||||
add_custom_command(
|
||||
COMMAND sh -c "curl -Lo checkra1n https://assets.checkra.in/downloads/preview/0.1337.1/${CHECKRA1N_FILE_NAME} "
|
||||
COMMAND sh -c "curl -Lo binpack.dmg https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg"
|
||||
COMMAND sh -c "curl -Lo ramdisk.dmg https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg"
|
||||
COMMAND sh -c "curl -Lo checkra1n-kpf-pongo https://cdn.nickchan.lol/palera1n/artifacts/kpf/checkra1n-kpf-pongo"
|
||||
COMMAND pwd
|
||||
COMMAND xxd -iC checkra1n checkra1n.c
|
||||
COMMAND xxd -iC binpack.dmg binpack.dmg.c
|
||||
COMMAND xxd -iC ramdisk.dmg ramdisk.dmg.c
|
||||
COMMAND xxd -iC checkra1n-kpf-pongo checkra1n-kpf-pongo.c
|
||||
OUTPUT checkra1n.c checkra1n-kpf-pongo.c ramdisk.dmg.c binpack.dmg.c binpack.dmg ramdisk.dmg checkra1n-kpf-pongo
|
||||
)
|
||||
target_compile_definitions(palera1n PRIVATE -DUSE_LIBUSB)
|
||||
get_property(MY_TARGET_SOURCES TARGET palera1n PROPERTY SOURCES)
|
||||
list(APPEND MY_TARGET_SOURCES
|
||||
usb_libusb.c)
|
||||
set_property(TARGET palera1n PROPERTY SOURCES ${MY_TARGET_SOURCES})
|
||||
target_link_libraries(palera1n
|
||||
${DEP}/lib/libusb-1.0.a
|
||||
)
|
||||
target_compile_definitions(palera1n PRIVATE -DUSE_LIBUSB)
|
||||
endif()
|
||||
|
||||
include_directories(
|
||||
../include
|
||||
${SRC}
|
||||
)
|
||||
|
||||
|
||||
target_compile_definitions(palera1n PRIVATE -DPALERAIN_VERSION=\"2.0.0\")
|
||||
|
||||
target_include_directories(palera1n PRIVATE
|
||||
${SRC}/include
|
||||
${SRC}
|
||||
${DEP}/include
|
||||
)
|
||||
|
||||
#if(${STATIC})
|
||||
target_link_libraries(palera1n
|
||||
${DEP}/lib/libimobiledevice-1.0.a
|
||||
${DEP}/lib/libirecovery-1.0.a
|
||||
${DEP}/lib/libusbmuxd-2.0.a
|
||||
${DEP}/lib/libimobiledevice-glue-1.0.a
|
||||
${DEP}/lib/libplist-2.0.a
|
||||
${DEP}/lib/libmbedtls.a
|
||||
${DEP}/lib/libmbedcrypto.a
|
||||
${DEP}/lib/libmbedx509.a
|
||||
${DEP}/lib/libreadline.a
|
||||
)
|
||||
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||
set(BUILD_SHARED_LIBS OFF)
|
||||
if(NOT APPLE)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-static")
|
||||
endif()
|
||||
#else()
|
||||
# find_library(LIBIMOBILEDEVICE libimobiledevice)
|
||||
# if (NOT CORE_FOUNDATION)
|
||||
# message(FATAL_ERROR "libimobiledevice not found")
|
||||
# endif()
|
||||
# target_link_libraries(palera1n ${LIBIMOBILEDEVICE})
|
||||
#
|
||||
# find_library(LIR libirecovery)
|
||||
# if (NOT SYSCONF)
|
||||
# message(FATAL_ERROR "libirecovery not found")
|
||||
# endif()
|
||||
# target_link_libraries(palera1n ${LIR})
|
||||
#
|
||||
# find_library(USBMUXD usbmuxd)
|
||||
# if (NOT SEC)
|
||||
# message(FATAL_ERROR "usbmuxd not found")
|
||||
# endif()
|
||||
# target_link_libraries(palera1n ${USBMUXD})
|
||||
#
|
||||
# find_library(GLUE libimobiledevice-glue)
|
||||
# if (NOT IOKIT)
|
||||
# message(FATAL_ERROR "libimobiledevice-glue not found")
|
||||
# endif()
|
||||
# target_link_libraries(palera1n ${GLUE})
|
||||
#
|
||||
## target_link_libraries(palera1n
|
||||
## imobiledevice-1.0
|
||||
## irecovery-1.0
|
||||
## usbmuxd-2.0
|
||||
## imobiledevice-glue-1.0
|
||||
## plist-2.0
|
||||
## mbedtls
|
||||
## mbedcrypto
|
||||
## mbedx509
|
||||
## readline
|
||||
## usb-1.0
|
||||
## )
|
||||
#endif()
|
||||
#if(APPLE)
|
||||
# add_compile_options(palera1n
|
||||
# -framework CoreFoundation
|
||||
# -framework SystemConfiguration
|
||||
# -framework IOKit
|
||||
# -framework Security
|
||||
# )
|
||||
#endif()
|
||||
|
||||
if(APPLE)
|
||||
find_library(CORE_FOUNDATION CoreFoundation)
|
||||
if (NOT CORE_FOUNDATION)
|
||||
message(FATAL_ERROR "CoreFoundation not found")
|
||||
endif()
|
||||
target_link_libraries(palera1n ${CORE_FOUNDATION})
|
||||
|
||||
find_library(SYSCONF SystemConfiguration)
|
||||
if (NOT SYSCONF)
|
||||
message(FATAL_ERROR "SystemConfiguration not found")
|
||||
endif()
|
||||
target_link_libraries(palera1n ${SYSCONF})
|
||||
|
||||
find_library(SEC Security)
|
||||
if (NOT SEC)
|
||||
message(FATAL_ERROR "Security not found")
|
||||
endif()
|
||||
target_link_libraries(palera1n ${SEC})
|
||||
|
||||
find_library(IOKIT IOKit)
|
||||
if (NOT IOKIT)
|
||||
message(FATAL_ERROR "IOKit not found")
|
||||
endif()
|
||||
target_link_libraries(palera1n ${IOKIT})
|
||||
endif()
|
||||
add_compile_options(palera1n
|
||||
-static -no-pie -Wl,--gc-sections
|
||||
)
|
||||
|
||||
|
||||
if(!BUILD_DATE)
|
||||
execute_process(COMMAND date OUTPUT_VARIABLE BUILD_DATE)
|
||||
endif()
|
||||
if(!BUILD_TAG)
|
||||
execute_process(COMMAND git describe --dirty --tags --abbrev=7 OUTPUT_VARIABLE BUILD_TAG)
|
||||
endif()
|
||||
if(!BUILD_WHOAMI)
|
||||
execute_process(COMMAND whoami OUTPUT_VARIABLE BUILD_WHOAMI)
|
||||
endif ()
|
||||
|
||||
set(INCLUDE_DIR /usr/local/include)
|
||||
include_directories (${INCLUDE_DIR})
|
||||
|
||||
|
||||
add_compile_definitions(
|
||||
BUILD_DATE="${BUILD_DATE}"
|
||||
BUILD_TAG="${BUILD_TAG}"
|
||||
BUILD_WHOAMI="${BUILD_WHOAMI}"
|
||||
BUILD_STYLE="${CMAKE_BUILD_TYPE}"
|
||||
)
|
||||
+52
-4
@@ -3,32 +3,57 @@ all: palera1n
|
||||
OBJECTS = main.o dfuhelper.o devhelper.o lockdown_helper.o
|
||||
OBJECTS += optparse.o override_file.o log.o lock_vars.o credits.o
|
||||
OBJECTS += fake_embedded.o exec_checkra1n.o pongo_helper.o
|
||||
OBJECTS += boyermoore_memmem.o
|
||||
|
||||
ifeq (,$(findstring macosx, $(CFLAGS)))
|
||||
ifneq (,$(findstring version-min=, $(CFLAGS)))
|
||||
OBJECTS += xxd-libcheckra1nhelper.dylib.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(FORCE_HELPER),1)
|
||||
OBJECTS += xxd-libcheckra1nhelper.dylib.o
|
||||
CFLAGS += -DFORCE_HELPER
|
||||
BUILD_OPTIONS += FORCE_HELPER
|
||||
endif
|
||||
|
||||
ifneq ($(NO_RAMDISK),1)
|
||||
OBJECTS += xxd-ramdisk.dmg.o
|
||||
else
|
||||
CFLAGS += -DNO_RAMDISK
|
||||
BUILD_OPTIONS += NO_RAMDISK
|
||||
endif
|
||||
ifneq ($(NO_KPF),1)
|
||||
OBJECTS += xxd-checkra1n-kpf-pongo.o
|
||||
else
|
||||
CFLAGS += -DNO_KPF
|
||||
BUILD_OPTIONS += NO_KPF
|
||||
endif
|
||||
ifneq ($(NO_BINPACK),1)
|
||||
ifneq ($(NO_OVERLAY),1)
|
||||
OBJECTS += xxd-binpack.dmg.o
|
||||
else
|
||||
CFLAGS += -DNO_BINPACK
|
||||
CFLAGS += -DNO_OVERLAY
|
||||
BUILD_OPTIONS += NO_OVERLAY
|
||||
endif
|
||||
ifneq ($(NO_CHECKRAIN),1)
|
||||
OBJECTS += xxd-checkra1n.o
|
||||
else
|
||||
CFLAGS += -DNO_CHECKRAIN
|
||||
BUILD_OPTIONS += NO_CHECKRAIN
|
||||
endif
|
||||
|
||||
ifeq ($(DEV_BUILD),1)
|
||||
ifneq ($(NO_CUSTOM_PONGO),1)
|
||||
OBJECTS += xxd-Pongo.bin.o
|
||||
else
|
||||
CFLAGS += -DNO_CUSTOM_PONGO
|
||||
BUILD_OPTIONS += NO_CUSTOM_PONGO
|
||||
endif
|
||||
|
||||
ifeq ($(TUI),1)
|
||||
OBJECTS += tui_screen_enter_recovery.o tui_screen_enter_dfu.o tui_main.o
|
||||
OBJECTS += tui_screen_jailbreak.o tui_screen_main.o tui_screen_options.o
|
||||
BUILD_OPTIONS += TUI
|
||||
CFLAGS += -DTUI
|
||||
endif
|
||||
|
||||
CHECKRA1N_VERSION ?= 0.1337.1
|
||||
@@ -38,7 +63,13 @@ LDID = ldid
|
||||
ifeq ($(TARGET_OS),Darwin)
|
||||
ifneq ($(USE_LIBUSB),1)
|
||||
OBJECTS += usb_iokit.o
|
||||
else
|
||||
LIBS += -framework SystemConfiguration -framework Security
|
||||
BUILD_OPTIONS += USE_LIBUSB
|
||||
endif
|
||||
# add lto and debug symbols for lto
|
||||
CFLAGS += -flto=full -g
|
||||
LDFLAGS += -Wl,-object_path_lto,lto.o
|
||||
else
|
||||
USE_LIBUSB = 1
|
||||
endif
|
||||
@@ -49,6 +80,17 @@ CFLAGS += -DUSE_LIBUSB=1
|
||||
LIBS += $(DEP)/lib/libusb-1.0.a
|
||||
endif
|
||||
|
||||
ifneq ($(ROOTFUL),0)
|
||||
CFLAGS += -DROOTFUL=1
|
||||
BUILD_OPTIONS += ROOTFUL
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_OPTIONS),)
|
||||
BUILD_OPTIONS = (none)
|
||||
endif
|
||||
|
||||
CFLAGS += -DBUILD_OPTIONS=\""$(BUILD_OPTIONS)"\"
|
||||
|
||||
checkra1n-%:
|
||||
curl -LO https://assets.checkra.in/downloads/preview/$(CHECKRA1N_VERSION)/$@
|
||||
chmod 755 $@
|
||||
@@ -91,6 +133,9 @@ ifneq (,$(findstring version-min=, $(CFLAGS)))
|
||||
endif
|
||||
endif
|
||||
|
||||
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
|
||||
|
||||
@@ -100,7 +145,10 @@ ramdisk.dmg:
|
||||
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
|
||||
|
||||
clean:
|
||||
rm -rf *.o palera1n checkra1n checkra1n.c palera1n.dSYM
|
||||
rm -rf *.o palera1n checkra1n checkra1n.c palera1n.dSYM libcheckra1nhelper.dylib
|
||||
|
||||
.PHONY: all clean
|
||||
@@ -0,0 +1,59 @@
|
||||
#include <limits.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
const unsigned char *
|
||||
boyermoore_horspool_memmem(const unsigned char* haystack, size_t hlen,
|
||||
const unsigned char* needle, size_t nlen)
|
||||
{
|
||||
size_t scan = 0;
|
||||
size_t bad_char_skip[UCHAR_MAX + 1]; /* Officially called:
|
||||
* bad character shift */
|
||||
|
||||
/* Sanity checks on the parameters */
|
||||
if (nlen <= 0 || !haystack || !needle)
|
||||
return NULL;
|
||||
|
||||
/* ---- Preprocess ---- */
|
||||
/* Initialize the table to default value */
|
||||
/* When a character is encountered that does not occur
|
||||
* in the needle, we can safely skip ahead for the whole
|
||||
* length of the needle.
|
||||
*/
|
||||
for (scan = 0; scan <= UCHAR_MAX; scan = scan + 1)
|
||||
bad_char_skip[scan] = nlen;
|
||||
|
||||
/* C arrays have the first byte at [0], therefore:
|
||||
* [nlen - 1] is the last byte of the array. */
|
||||
size_t last = nlen - 1;
|
||||
|
||||
/* Then populate it with the analysis of the needle */
|
||||
for (scan = 0; scan < last; scan = scan + 1)
|
||||
bad_char_skip[needle[scan]] = last - scan;
|
||||
|
||||
/* ---- Do the matching ---- */
|
||||
|
||||
/* Search the haystack, while the needle can still be within it. */
|
||||
while (hlen >= nlen)
|
||||
{
|
||||
/* scan from the end of the needle */
|
||||
for (scan = last; haystack[scan] == needle[scan]; scan = scan - 1)
|
||||
if (scan == 0) /* If the first byte matches, we've found it. */
|
||||
{
|
||||
return haystack;
|
||||
}
|
||||
|
||||
/* otherwise, we need to skip some bytes and start again.
|
||||
Note that here we are getting the skip value based on the last byte
|
||||
of needle, no matter where we didn't match. So if needle is: "abcd"
|
||||
then we are skipping based on 'd' and that value will be 4, and
|
||||
for "abcdd" we again skip on 'd' but the value will be only 1.
|
||||
The alternative of pretending that the mismatched character was
|
||||
the last character is slower in the normal case (E.g. finding
|
||||
"abcd" in "...azcd..." gives 4 by using 'd' but only
|
||||
4-2==2 using 'z'. */
|
||||
hlen -= bad_char_skip[haystack[last]];
|
||||
haystack += bad_char_skip[haystack[last]];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
#define _PTHREAD_STRUCT_DIRECT_STACKADDR_OFFSET -48
|
||||
#define _PTHREAD_STRUCT_DIRECT_STACKBOTTOM_OFFSET -40
|
||||
|
||||
.align 4
|
||||
_thread_chkstk_darwin:
|
||||
.globl ___chkstk_darwin
|
||||
___chkstk_darwin: // %w9/x9 == alloca size
|
||||
stp x10, x11, [sp, #-16]
|
||||
|
||||
// validate that the frame pointer is on our stack (no alt stack)
|
||||
mrs x10, TPIDRRO_EL0
|
||||
|
||||
// (%sp - pthread_self()->stackaddr) > 0 ?
|
||||
#if defined(__ARM64_ARCH_8_32__)
|
||||
ubfx x9, x9, #0, #32
|
||||
ldur w11, [x10, _PTHREAD_STRUCT_DIRECT_STACKADDR_OFFSET]
|
||||
#else
|
||||
ldur x11, [x10, _PTHREAD_STRUCT_DIRECT_STACKADDR_OFFSET]
|
||||
#endif
|
||||
subs x11, sp, x11
|
||||
b.hs Lprobe
|
||||
|
||||
// %sp <= pthread_self()->stackbottom ?
|
||||
#if defined(__ARM64_ARCH_8_32__)
|
||||
ldur w11, [x10, _PTHREAD_STRUCT_DIRECT_STACKBOTTOM_OFFSET]
|
||||
#else
|
||||
ldur x11, [x10, _PTHREAD_STRUCT_DIRECT_STACKBOTTOM_OFFSET]
|
||||
#endif
|
||||
mov x10, sp
|
||||
cmp x10, x11
|
||||
b.ls Lprobe
|
||||
|
||||
// %sp - (uintptr_t)%x9 < pthread_self()->stackbottom ?
|
||||
subs x10, x10, x9
|
||||
b.lo Lcrash
|
||||
cmp x10, x11
|
||||
b.lo Lcrash
|
||||
|
||||
Lexit:
|
||||
ldp x10, x11, [sp, #-16]
|
||||
ret
|
||||
|
||||
Lcrash:
|
||||
// POSIX mandates that stack overflow crashes with SIGSEGV
|
||||
// so load an address in the guard page and dereference it
|
||||
//
|
||||
// x11 contains pthread_self()->stackbottom already
|
||||
ldr x11, [x11, #-8]
|
||||
// if main_thread caused stack growth with setrlimit()
|
||||
// fall into Lprobe and eventually cause SIGSEGV.
|
||||
|
||||
Lprobe:
|
||||
mov x10, sp
|
||||
cmp x9, #0x1000
|
||||
b.lo Lend
|
||||
Lloop:
|
||||
sub x10, x10, #0x1000
|
||||
ldr x11, [x10]
|
||||
sub x9, x9, #0x1000
|
||||
cmp x9, #0x1000
|
||||
b.hi Lloop
|
||||
Lend:
|
||||
sub x10, x10, x9
|
||||
ldr x11, [x10]
|
||||
b Lexit
|
||||
+6
-6
@@ -1,19 +1,19 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef BAKERAIN_DEVELOPE_R
|
||||
#define BAKERAIN_DEVELOPE_R "dora2ios"
|
||||
#define BAKERAIN_DEVELOPE_R "kok3shidoll"
|
||||
#endif
|
||||
#define THE_PLUSH "Tom"
|
||||
#define THE_PLUSH "Ploosh"
|
||||
|
||||
#define T void
|
||||
#define R print_credits() {
|
||||
#define R print_credits(void) {
|
||||
#define O fprintf
|
||||
#define U (
|
||||
#define B stdout
|
||||
#define B stderr
|
||||
#define L ,
|
||||
#define E "# == palera1n-c == \n#\n"
|
||||
#define M "# Made by: Nick Chan, " THE_PLUSH " , Mineek, Nebula, llsc12\n#\n"
|
||||
#define A "# Thanks to: " BAKERAIN_DEVELOPE_R ", pythonplayer, tihmstar, nikias\n"
|
||||
#define M "# Made by: Nick Chan, " THE_PLUSH ", Samara, Nebula, staturnz, " BAKERAIN_DEVELOPE_R " \n#\n"
|
||||
#define A "# Thanks to: pythonplayer123, llsc12, Mineek, tihmstar, nikias\n"
|
||||
#define K "# (libimobiledevice), checkra1n team (Siguza, axi0mx, littlelailo\n"
|
||||
#define I "# et al.), Procursus Team (Hayden Seay, Cameron Katri, Keto et.al)\n\n"
|
||||
#define N )
|
||||
|
||||
+81
-76
@@ -37,6 +37,7 @@
|
||||
#include <palerain.h>
|
||||
|
||||
irecv_device_event_context_t irecvctx = NULL;
|
||||
usbmuxd_subscription_context_t usbmuxdctx = NULL;
|
||||
|
||||
void devinfo_free(devinfo_t *dev) {
|
||||
free(dev->buildVersion);
|
||||
@@ -75,28 +76,29 @@ bool cpid_is_arm64(unsigned int cpid) {
|
||||
* ========== 0x8960 ===========
|
||||
* (ARM64) A7
|
||||
*/
|
||||
if (
|
||||
cpid == 0x8960 || cpid == 0x7000 || cpid == 0x7001
|
||||
|| cpid == 0x8000 || cpid == 0x8001 || cpid == 0x8003
|
||||
|| cpid == 0x8010 || cpid == 0x8011 || cpid == 0x8012
|
||||
|| cpid == 0x8015
|
||||
|
||||
) return true;
|
||||
return false;
|
||||
return (
|
||||
cpid == 0x8960 || cpid == 0x7000 || cpid == 0x7001 ||
|
||||
cpid == 0x8000 || cpid == 0x8001 || cpid == 0x8003 ||
|
||||
cpid == 0x8010 || cpid == 0x8011 || cpid == 0x8012 ||
|
||||
cpid == 0x8015
|
||||
);
|
||||
}
|
||||
|
||||
int subscribe_cmd(usbmuxd_event_cb_t device_event_cb, irecv_device_event_cb_t irecv_event_cb)
|
||||
{
|
||||
usbmuxd_subscribe(device_event_cb, NULL);
|
||||
irecv_device_event_subscribe(&irecvctx, irecv_event_cb, NULL);
|
||||
int ret;
|
||||
if ((ret = usbmuxd_events_subscribe(&usbmuxdctx, device_event_cb, NULL))) return ret;
|
||||
if ((ret = irecv_device_event_subscribe(&irecvctx, irecv_event_cb, NULL))) return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int unsubscribe_cmd()
|
||||
int unsubscribe_cmd(void)
|
||||
{
|
||||
usbmuxd_unsubscribe();
|
||||
irecv_device_event_unsubscribe(irecvctx);
|
||||
int ret;
|
||||
if ((ret = usbmuxd_events_unsubscribe(usbmuxdctx))) return ret;
|
||||
if ((ret = irecv_device_event_unsubscribe(irecvctx))) return ret;
|
||||
irecvctx = NULL;
|
||||
usbmuxdctx = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -117,15 +119,15 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
|
||||
}
|
||||
if (lockdownd_client_new(device, &lockdown, "palera1n") != LOCKDOWN_E_SUCCESS)
|
||||
{
|
||||
idevice_free(device);
|
||||
(void)idevice_free(device);
|
||||
LOG(LOG_ERROR, "Device is not in normal mode.");
|
||||
return -1;
|
||||
}
|
||||
plist_t node = NULL;
|
||||
if (lockdownd_get_value(lockdown, NULL, "UniqueChipID", &node) != LOCKDOWN_E_SUCCESS)
|
||||
{
|
||||
lockdownd_client_free(lockdown);
|
||||
idevice_free(device);
|
||||
(void)lockdownd_client_free(lockdown);
|
||||
(void)idevice_free(device);
|
||||
LOG(LOG_ERROR, "Error getting ECID");
|
||||
return -1;
|
||||
}
|
||||
@@ -135,8 +137,8 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
|
||||
node = NULL;
|
||||
if (lockdownd_get_value(lockdown, NULL, "ProductType", &node) != LOCKDOWN_E_SUCCESS)
|
||||
{
|
||||
lockdownd_client_free(lockdown);
|
||||
idevice_free(device);
|
||||
(void)lockdownd_client_free(lockdown);
|
||||
(void)idevice_free(device);
|
||||
LOG(LOG_ERROR, "Error getting product type");
|
||||
return -1;
|
||||
}
|
||||
@@ -146,8 +148,8 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
|
||||
node = NULL;
|
||||
if (lockdownd_get_value(lockdown, NULL, "CPUArchitecture", &node) != LOCKDOWN_E_SUCCESS)
|
||||
{
|
||||
lockdownd_client_free(lockdown);
|
||||
idevice_free(device);
|
||||
(void)lockdownd_client_free(lockdown);
|
||||
(void)idevice_free(device);
|
||||
LOG(LOG_ERROR, "Error getting CPU type");
|
||||
return -1;
|
||||
}
|
||||
@@ -157,8 +159,8 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
|
||||
node = NULL;
|
||||
if (lockdownd_get_value(lockdown, NULL, "ProductVersion", &node) != LOCKDOWN_E_SUCCESS)
|
||||
{
|
||||
lockdownd_client_free(lockdown);
|
||||
idevice_free(device);
|
||||
(void)lockdownd_client_free(lockdown);
|
||||
(void)idevice_free(device);
|
||||
LOG(LOG_ERROR, "Error getting product version");
|
||||
return -1;
|
||||
}
|
||||
@@ -168,21 +170,21 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
|
||||
node = NULL;
|
||||
if (lockdownd_get_value(lockdown, NULL, "BuildVersion", &node) != LOCKDOWN_E_SUCCESS)
|
||||
{
|
||||
lockdownd_client_free(lockdown);
|
||||
idevice_free(device);
|
||||
(void)lockdownd_client_free(lockdown);
|
||||
(void)idevice_free(device);
|
||||
LOG(LOG_ERROR, "Error getting build version");
|
||||
return -1;
|
||||
}
|
||||
plist_get_string_val(node, &buildVersion);
|
||||
plist_free(node);
|
||||
lockdownd_client_free(lockdown);
|
||||
idevice_free(device);
|
||||
(void)lockdownd_client_free(lockdown);
|
||||
(void)idevice_free(device);
|
||||
|
||||
irecv_device_t rcvydev;
|
||||
if (irecv_devices_get_device_by_product_type(productType, &rcvydev) == IRECV_E_SUCCESS)
|
||||
{
|
||||
displayName = rcvydev->display_name;
|
||||
}
|
||||
else
|
||||
} else
|
||||
{
|
||||
displayName = productType;
|
||||
}
|
||||
@@ -207,23 +209,22 @@ int enter_recovery_cmd(const char* udid) {
|
||||
LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret));
|
||||
return -1;
|
||||
}
|
||||
do {
|
||||
ldret = lockdownd_enter_recovery(lockdown);
|
||||
if (ldret == LOCKDOWN_E_SESSION_INACTIVE) {
|
||||
lockdownd_client_free(lockdown);
|
||||
lockdown = NULL;
|
||||
if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &lockdown, "palera1n"))) {
|
||||
LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret));
|
||||
return -1;
|
||||
}
|
||||
ldret = lockdownd_enter_recovery(lockdown);
|
||||
}
|
||||
ldret = lockdownd_enter_recovery(lockdown);
|
||||
if (ldret == LOCKDOWN_E_SESSION_INACTIVE) {
|
||||
lockdownd_client_free(lockdown);
|
||||
lockdown = NULL;
|
||||
ldret = lockdownd_client_new_with_handshake(device, &lockdown, "palera1n");
|
||||
if (ldret != LOCKDOWN_E_SUCCESS) {
|
||||
LOG(LOG_ERROR, "Could not trigger entering recovery mode: %s", lockdownd_strerror(ldret));
|
||||
LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret));
|
||||
return -1;
|
||||
}
|
||||
lockdownd_client_free(lockdown);
|
||||
} while (0);
|
||||
ldret = lockdownd_enter_recovery(lockdown);
|
||||
}
|
||||
if (ldret != LOCKDOWN_E_SUCCESS) {
|
||||
LOG(LOG_ERROR, "Could not trigger entering recovery mode: %s", lockdownd_strerror(ldret));
|
||||
return -1;
|
||||
}
|
||||
lockdownd_client_free(lockdown);
|
||||
idevice_free(device);
|
||||
return 0;
|
||||
}
|
||||
@@ -240,8 +241,8 @@ int reboot_cmd(const char* udid) {
|
||||
if (diagnostics_relay_restart(diag, DIAGNOSTICS_RELAY_ACTION_FLAG_WAIT_FOR_DISCONNECT) != DIAGNOSTICS_RELAY_E_SUCCESS) {
|
||||
LOG(LOG_ERROR, "Could not reboot device.");
|
||||
}
|
||||
diagnostics_relay_goodbye(diag);
|
||||
diagnostics_relay_client_free(diag);
|
||||
(void)diagnostics_relay_goodbye(diag);
|
||||
(void)diagnostics_relay_client_free(diag);
|
||||
} else {
|
||||
LOG(LOG_ERROR, "Could not connect to device.");
|
||||
return -1;
|
||||
@@ -300,9 +301,9 @@ int passstat_cmd(unsigned char* status, const char* udid) {
|
||||
derr = diagnostics_relay_query_mobilegestalt(diagnostics_client, keys, &node);
|
||||
|
||||
plist_free(keys);
|
||||
diagnostics_relay_client_free(diagnostics_client);
|
||||
lockdownd_service_descriptor_free(service);
|
||||
idevice_free(dev);
|
||||
(void)diagnostics_relay_client_free(diagnostics_client);
|
||||
(void)lockdownd_service_descriptor_free(service);
|
||||
(void)idevice_free(dev);
|
||||
|
||||
if (derr != DIAGNOSTICS_RELAY_E_SUCCESS || !node)
|
||||
{
|
||||
@@ -320,7 +321,7 @@ int passstat_cmd(unsigned char* status, const char* udid) {
|
||||
plist_get_string_val(status_node, &passstat_status);
|
||||
if (!status || strncmp(passstat_status, "Succ", 4))
|
||||
{
|
||||
if (passstat_status)
|
||||
if (passstat_status)
|
||||
free(passstat_status);
|
||||
passstat_status = NULL;
|
||||
plist_free(node);
|
||||
@@ -347,20 +348,16 @@ int passstat_cmd(unsigned char* status, const char* udid) {
|
||||
int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid) {
|
||||
irecv_client_t client = NULL;
|
||||
irecv_error_t err = irecv_open_with_ecid(&client, ecid);
|
||||
if (err != IRECV_E_SUCCESS) {
|
||||
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
|
||||
return -1;
|
||||
}
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
int mode = 0;
|
||||
irecv_get_mode(client, &mode);
|
||||
err = irecv_get_mode(client, &mode);
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
char *ibootver = NULL;
|
||||
irecv_getenv(client, "build-version", &ibootver);
|
||||
err = irecv_getenv(client, "build-version", &ibootver);
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
irecv_device_t device;
|
||||
err = irecv_devices_get_device_by_client(client, &device);
|
||||
if (err != IRECV_E_SUCCESS) {
|
||||
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
|
||||
return -1;
|
||||
}
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
info->mode = mode;
|
||||
info->cpid = device->chip_id;
|
||||
snprintf(info->product_type, 0x20, "%s", device->product_type);
|
||||
@@ -369,33 +366,41 @@ int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid) {
|
||||
free(ibootver);
|
||||
irecv_close(client);
|
||||
return 0;
|
||||
err:
|
||||
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
|
||||
return -1;
|
||||
}
|
||||
|
||||
int autoboot_cmd(const uint64_t ecid) {
|
||||
irecv_client_t client = NULL;
|
||||
irecv_error_t err = irecv_open_with_ecid(&client, ecid);
|
||||
if (err == IRECV_E_SUCCESS) {
|
||||
irecv_setenv(client, "auto-boot", "true");
|
||||
irecv_saveenv(client);
|
||||
irecv_close(client);
|
||||
return 0;
|
||||
} else {
|
||||
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
err = irecv_setenv(client, "auto-boot", "true");
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
err = irecv_saveenv(client);
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
err = irecv_close(client);
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
return 0;
|
||||
err:
|
||||
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int exitrecv_cmd(const uint64_t ecid) {
|
||||
irecv_client_t client = NULL;
|
||||
irecv_error_t err = irecv_open_with_ecid(&client, ecid);
|
||||
if (err == IRECV_E_SUCCESS) {
|
||||
irecv_setenv(client, "auto-boot", "true");
|
||||
irecv_saveenv(client);
|
||||
irecv_reboot(client);
|
||||
irecv_close(client);
|
||||
return 0;
|
||||
} else {
|
||||
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
|
||||
return -1;
|
||||
}
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
err = irecv_setenv(client, "auto-boot", "true");
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
err = irecv_saveenv(client);
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
err = irecv_reboot(client);
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
err = irecv_close(client);
|
||||
if (err != IRECV_E_SUCCESS) goto err;
|
||||
return 0;
|
||||
err:
|
||||
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
|
||||
return -1;
|
||||
}
|
||||
+118
-45
@@ -36,12 +36,20 @@ 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(CYN "\r\033[K%s (%d)" CRESET, text, time - i + time2);
|
||||
printf(
|
||||
checkrain_options_enabled(host_flags, host_option_no_colors)
|
||||
? "\r\033[K%s (%d)"
|
||||
: BCYN "\r\033[K%s (%d)" CRESET, text, time - i + time2
|
||||
);
|
||||
fflush(stdout);
|
||||
sleep(1);
|
||||
if (cond != NULL && cond(cond_arg)) pthread_exit(NULL);
|
||||
}
|
||||
printf(CYN "\r%s (%d)" CRESET, text, time2);
|
||||
printf(
|
||||
checkrain_options_enabled(host_flags, host_option_no_colors)
|
||||
? "\r%s (%d)"
|
||||
: CYN "\r%s (%d)" CRESET, text, time2
|
||||
);
|
||||
if (time2 == 0) puts("");
|
||||
}
|
||||
|
||||
@@ -53,13 +61,15 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
|
||||
LOG(LOG_ERROR, "Unable to get device information");
|
||||
return 0;
|
||||
}
|
||||
if (strcmp(dev.CPUArchitecture, "arm64")) {
|
||||
if (strncmp(dev.CPUArchitecture, "arm64", strlen("arm64"))) {
|
||||
devinfo_free(&dev);
|
||||
LOG(LOG_WARNING, "Ignoring non-arm64 device...");
|
||||
LOG(LOG_WARNING, "palera1n doesn't and never will work on A12+ (arm64e)");
|
||||
return -1;
|
||||
}
|
||||
if (!strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) {
|
||||
LOG(LOG_VERBOSE2, "Product %s requires passcode to be disabled", dev.productType);
|
||||
if (!checkrain_options_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) {
|
||||
@@ -69,15 +79,29 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
|
||||
}
|
||||
if (passcode_state) {
|
||||
LOG(LOG_ERROR, "Passcode must be disabled on this device");
|
||||
LOG(LOG_ERROR, "Additionally, passcode must never be set since restore on iOS 16+");
|
||||
if (!checkrain_options_enabled(host_flags, host_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)) {
|
||||
printf("Mode: normal\n");
|
||||
printf("ProductType: %s\n", dev.productType);
|
||||
printf("Architecture: %s\n", dev.CPUArchitecture);
|
||||
printf("Version: %s\n", dev.productVersion);
|
||||
printf("DisplayName: %s\n", dev.displayName);
|
||||
|
||||
device_has_booted = true;
|
||||
set_spin(0);
|
||||
unsubscribe_cmd();
|
||||
return 0;
|
||||
}
|
||||
LOG(LOG_INFO, "Telling device with udid %s to enter recovery mode immediately", usbmuxd_device->udid);
|
||||
enter_recovery_cmd(usbmuxd_device->udid);
|
||||
devinfo_free(&dev);
|
||||
if (checkrain_option_enabled(host_flags, host_option_enter_recovery)) {
|
||||
if (checkrain_options_enabled(host_flags, host_option_enter_recovery)) {
|
||||
device_has_booted = true;
|
||||
set_spin(0);
|
||||
unsubscribe_cmd();
|
||||
@@ -122,17 +146,14 @@ void* connected_recovery_mode(struct irecv_device_info* info) {
|
||||
return NULL;
|
||||
}
|
||||
printf("\r\033[K");
|
||||
bool nohome = NOHOME;
|
||||
if (nohome)
|
||||
if (NOHOME) {
|
||||
step(2, 0, "Hold volume down + side button", NULL, 0);
|
||||
else
|
||||
step(2, 0, "Hold home + power Button", NULL, 0);
|
||||
if (nohome)
|
||||
step(10, 0, "Hold volume down button", conditional, ecid);
|
||||
else
|
||||
step(10, 0, "Hold home button", conditional, ecid);
|
||||
if (get_ecid_wait_for_dfu() != ecid) {
|
||||
} else {
|
||||
step(2, 0, "Hold home + power button", NULL, 0);
|
||||
step(10, 0, "Hold home button", conditional, ecid);
|
||||
}
|
||||
if (get_ecid_wait_for_dfu() == ecid) {
|
||||
LOG(LOG_WARNING, "Whoops, device did not enter DFU mode");
|
||||
LOG(LOG_INFO, "Waiting for device to reconnect...");
|
||||
set_ecid_wait_for_dfu(0);
|
||||
@@ -160,13 +181,15 @@ 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_option_enabled(host_flags, host_option_exit_recovery)) {
|
||||
if (checkrain_options_enabled(host_flags, host_option_exit_recovery)) {
|
||||
break;
|
||||
} else if (checkrain_option_enabled(host_flags, host_option_reboot_device)) {
|
||||
reboot_cmd(event->device.udid);
|
||||
LOG(LOG_INFO, "Restarted device");
|
||||
set_spin(0);
|
||||
unsubscribe_cmd();
|
||||
} else if (checkrain_options_enabled(host_flags, host_option_reboot_device)) {
|
||||
int ret = reboot_cmd(event->device.udid);
|
||||
if (!ret) {
|
||||
LOG(LOG_INFO, "Restarted device");
|
||||
set_spin(0);
|
||||
unsubscribe_cmd();
|
||||
}
|
||||
pthread_exit(NULL);
|
||||
break;
|
||||
}
|
||||
@@ -180,35 +203,85 @@ void device_event_cb(const usbmuxd_event_t *event, void* userdata) {
|
||||
|
||||
void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) {
|
||||
pthread_t recovery_thread, dfu_thread;
|
||||
int ret;
|
||||
|
||||
switch(event->type) {
|
||||
case IRECV_DEVICE_ADD:
|
||||
if (event->mode == IRECV_K_RECOVERY_MODE_1 || event->mode == IRECV_K_RECOVERY_MODE_2 || event->mode == IRECV_K_RECOVERY_MODE_3 || event->mode == IRECV_K_RECOVERY_MODE_4) {
|
||||
LOG(LOG_VERBOSE, "Recovery mode device %ld connected", event->device_info->ecid);
|
||||
if (checkrain_option_enabled(host_flags, host_option_exit_recovery)) {
|
||||
exitrecv_cmd(event->device_info->ecid);
|
||||
LOG(LOG_INFO, "Exited recovery mode");
|
||||
device_has_booted = true;
|
||||
set_spin(0);
|
||||
unsubscribe_cmd();
|
||||
if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread);
|
||||
pthread_exit(NULL);
|
||||
break;
|
||||
}
|
||||
if (checkrain_option_enabled(host_flags, host_option_enter_recovery) ||
|
||||
checkrain_option_enabled(host_flags, host_option_reboot_device)) return;
|
||||
pthread_create(&recovery_thread, NULL, (void* (*)(void*))connected_recovery_mode, event->device_info);
|
||||
} else if (event->mode == IRECV_K_DFU_MODE) {
|
||||
LOG(LOG_VERBOSE, "DFU mode device %ld connected", event->device_info->ecid);
|
||||
if (
|
||||
checkrain_option_enabled(host_flags, host_option_exit_recovery) ||
|
||||
checkrain_option_enabled(host_flags, host_option_enter_recovery) ||
|
||||
checkrain_option_enabled(host_flags, host_option_reboot_device)) {
|
||||
if (event->mode == IRECV_K_RECOVERY_MODE_1 ||
|
||||
event->mode == IRECV_K_RECOVERY_MODE_2 ||
|
||||
event->mode == IRECV_K_RECOVERY_MODE_3 ||
|
||||
event->mode == IRECV_K_RECOVERY_MODE_4) {
|
||||
if (!checkrain_options_enabled(host_flags, host_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)) {
|
||||
ret = exitrecv_cmd(event->device_info->ecid);
|
||||
if (!ret) {
|
||||
LOG(LOG_INFO, "Exited recovery mode");
|
||||
device_has_booted = true;
|
||||
set_spin(0);
|
||||
unsubscribe_cmd();
|
||||
} else {
|
||||
LOG(LOG_WARNING, "Could not exit recovery mode");
|
||||
}
|
||||
if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread);
|
||||
pthread_exit(NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
if (checkrain_options_enabled(host_flags, host_option_device_info)) {
|
||||
recvinfo_t info;
|
||||
ret = recvinfo_cmd(&info, event->device_info->ecid);
|
||||
if (ret) {
|
||||
LOG(LOG_WARNING, "Could not get info from device");
|
||||
} else {
|
||||
printf("Mode: Recovery\n");
|
||||
printf("ProductType: %s\n", info.product_type);
|
||||
printf("DisplayName: %s\n", info.display_name);
|
||||
|
||||
device_has_booted = true;
|
||||
set_spin(0);
|
||||
unsubscribe_cmd();
|
||||
}
|
||||
if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread);
|
||||
pthread_exit(NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
if (checkrain_options_enabled(host_flags, host_option_enter_recovery) ||
|
||||
checkrain_options_enabled(host_flags, host_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))
|
||||
LOG(LOG_VERBOSE, "DFU mode device %ld connected", event->device_info->ecid);
|
||||
|
||||
if (checkrain_options_enabled(host_flags, host_option_device_info)) {
|
||||
recvinfo_t info;
|
||||
ret = recvinfo_cmd(&info, event->device_info->ecid);
|
||||
if (ret) {
|
||||
LOG(LOG_WARNING, "Could not get info from device");
|
||||
} else {
|
||||
printf("Mode: DFU\n");
|
||||
printf("ProductType: %s\n", info.product_type);
|
||||
printf("DisplayName: %s\n", info.display_name);
|
||||
|
||||
device_has_booted = true;
|
||||
set_spin(0);
|
||||
unsubscribe_cmd();
|
||||
}
|
||||
if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread);
|
||||
pthread_exit(NULL);
|
||||
break;
|
||||
}
|
||||
|
||||
if (
|
||||
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)) {
|
||||
break;
|
||||
}
|
||||
pthread_create(&dfu_thread, NULL, (pthread_start_t)connected_dfu_mode, event->device_info);
|
||||
}
|
||||
pthread_create(&dfu_thread, NULL, (void* (*)(void*))connected_dfu_mode, event->device_info);
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case IRECV_DEVICE_REMOVE:
|
||||
LOG(LOG_VERBOSE, "Recovery mode device disconnected");
|
||||
break;
|
||||
@@ -217,8 +290,8 @@ void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) {
|
||||
|
||||
void *dfuhelper(void* ptr) {
|
||||
dfuhelper_thr_running = true;
|
||||
subscribe_cmd(device_event_cb, irecv_device_event_cb);
|
||||
set_spin(1);
|
||||
subscribe_cmd(device_event_cb, irecv_device_event_cb);
|
||||
while (get_spin()) {
|
||||
sleep(1);
|
||||
};
|
||||
|
||||
+121
-23
@@ -11,63 +11,147 @@
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#if defined(__APPLE__)
|
||||
#include <TargetConditionals.h>
|
||||
#endif
|
||||
|
||||
extern char **environ;
|
||||
|
||||
#include <palerain.h>
|
||||
#include <xxd-embedded.h>
|
||||
char* pongo_path = NULL;
|
||||
bool external_pongo = false;
|
||||
char* ext_checkra1n = NULL;
|
||||
|
||||
#define tmpdir getenv("TMPDIR") == NULL ? "/tmp" : getenv("TMPDIR")
|
||||
|
||||
int exec_checkra1n() {
|
||||
int exec_checkra1n(void) {
|
||||
LOG(LOG_INFO, "About to execute checkra1n");
|
||||
int fd, ret;
|
||||
int fd_checkra1n, fd_pongo, ret;
|
||||
char* checkra1n_path = NULL;
|
||||
if (ext_checkra1n != NULL) {
|
||||
checkra1n_path = ext_checkra1n;
|
||||
goto checkra1n_exec;
|
||||
}
|
||||
#ifndef NO_CUSTOM_PONGO
|
||||
if (pongo_path == NULL) {
|
||||
pongo_path = malloc(strlen(tmpdir) + 20);
|
||||
snprintf(pongo_path, strlen(tmpdir) + 20, "%s/Pongo.bin.XXXXXX", tmpdir);
|
||||
fd_pongo = mkstemp(pongo_path);
|
||||
if (fd_pongo == -1) {
|
||||
LOG(LOG_FATAL, "Cannot open temporary file %s: %d (%s)", pongo_path, errno, strerror(errno));
|
||||
free(pongo_path);
|
||||
return -1;
|
||||
}
|
||||
ssize_t didWrite_Pongo_bin = write(fd_pongo, Pongo_bin, Pongo_bin_len);
|
||||
if (didWrite_Pongo_bin != (ssize_t)Pongo_bin_len) {
|
||||
LOG(LOG_FATAL, "Size written to %s does not match expected: %lld != %d: %d (%s)", pongo_path, didWrite_Pongo_bin, Pongo_bin_len, errno, strerror(errno));
|
||||
close(fd_pongo);
|
||||
unlink(pongo_path);
|
||||
free(pongo_path);
|
||||
pongo_path = NULL;
|
||||
return -1;
|
||||
}
|
||||
} else external_pongo = true;
|
||||
#endif
|
||||
checkra1n_path = malloc(strlen(tmpdir) + 20);
|
||||
snprintf(checkra1n_path, strlen(tmpdir) + 20, "%s/checkra1n.XXXXXX", tmpdir);
|
||||
fd = mkstemp(checkra1n_path);
|
||||
if (fd == -1) {
|
||||
LOG(LOG_FATAL, "Cannot open temporary file: %d (%s)", errno, strerror(errno));
|
||||
fd_checkra1n = mkstemp(checkra1n_path);
|
||||
if (fd_checkra1n == -1) {
|
||||
LOG(LOG_FATAL, "Cannot open temporary file %s: %d (%s)", checkra1n_path, errno, strerror(errno));
|
||||
free(checkra1n_path);
|
||||
checkra1n_path = NULL;
|
||||
return -1;
|
||||
}
|
||||
ssize_t didWrite = write(fd, checkra1n, checkra1n_len);
|
||||
if (didWrite != (ssize_t)checkra1n_len) {
|
||||
LOG(LOG_FATAL, "Size written does not match expected: %lld != %d: %d (%s)", didWrite, checkra1n_len, errno, strerror(errno));
|
||||
close(fd);
|
||||
ssize_t didWrite_checkra1n = write(fd_checkra1n, checkra1n, checkra1n_len);
|
||||
if (didWrite_checkra1n != (ssize_t)checkra1n_len) {
|
||||
LOG(LOG_FATAL, "Size written to %s does not match expected: %lld != %d: %d (%s)", checkra1n_path, didWrite_checkra1n, checkra1n_len, errno, strerror(errno));
|
||||
close(fd_checkra1n);
|
||||
unlink(checkra1n_path);
|
||||
free(checkra1n_path);
|
||||
checkra1n_path = NULL;
|
||||
return -1;
|
||||
}
|
||||
close(fd);
|
||||
close(fd_checkra1n);
|
||||
ret = chmod(checkra1n_path, 0700);
|
||||
if (ret) {
|
||||
LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", checkra1n_path, errno, strerror(errno));
|
||||
unlink(checkra1n_path);
|
||||
free(checkra1n_path);
|
||||
checkra1n_path = NULL;
|
||||
return -1;
|
||||
}
|
||||
#if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER))
|
||||
char* libcheckra1nhelper_dylib_path = NULL;
|
||||
{
|
||||
struct utsname name;
|
||||
uname(&name);
|
||||
unsigned long darwinMajor = strtoul(name.release, NULL, 10);
|
||||
assert(darwinMajor != 0);
|
||||
#if !defined(FORCE_HELPER)
|
||||
if (darwinMajor < 20) {
|
||||
#endif
|
||||
libcheckra1nhelper_dylib_path = malloc(strlen(tmpdir) + 40);
|
||||
snprintf(libcheckra1nhelper_dylib_path, strlen(tmpdir) + 40, "%s/libcheckra1nhelper.dylib.XXXXXX", tmpdir);
|
||||
int helper_fd = mkstemp(libcheckra1nhelper_dylib_path);
|
||||
if (helper_fd == -1) {
|
||||
LOG(LOG_FATAL, "Cannot open temporary file: %d (%s)", errno, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
ssize_t didWrite_libcheckra1nhelper = write(helper_fd, libcheckra1nhelper_dylib, libcheckra1nhelper_dylib_len);
|
||||
if ((unsigned int)didWrite_libcheckra1nhelper != libcheckra1nhelper_dylib_len) {
|
||||
LOG(LOG_FATAL, "Size written does not match expected: %lld != %d: %d (%s)", didWrite_libcheckra1nhelper, libcheckra1nhelper_dylib_len, errno, strerror(errno));
|
||||
close(helper_fd);
|
||||
unlink(libcheckra1nhelper_dylib_path);
|
||||
return -1;
|
||||
}
|
||||
close(helper_fd);
|
||||
ret = chmod(libcheckra1nhelper_dylib_path, 0700);
|
||||
if (ret) {
|
||||
LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", libcheckra1nhelper_dylib_path, errno, strerror(errno));
|
||||
unlink(libcheckra1nhelper_dylib_path);
|
||||
return -1;
|
||||
}
|
||||
setenv("DYLD_INSERT_LIBRARIES", libcheckra1nhelper_dylib_path, 1);
|
||||
#if !defined(FORCE_HELPER)
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
checkra1n_exec: {};
|
||||
char args[0x10] = "-pE";
|
||||
if (checkrain_option_enabled(host_flags, host_option_demote)) strncat(args, "d", 0xf);
|
||||
if (verbose >= 2) strncat(args, "v", 0xf);
|
||||
if (pongo_path != NULL) strncat(args, "k", 0xf); // keep this at last
|
||||
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)) {
|
||||
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);
|
||||
} else {
|
||||
strncat(args, "R", 0xf);
|
||||
}
|
||||
LOG(LOG_VERBOSE5, args);
|
||||
if (pongo_path != NULL) LOG(LOG_VERBOSE5, pongo_path);
|
||||
pid_t pid;
|
||||
char* checkra1n_argv[] = {
|
||||
checkra1n_path,
|
||||
args,
|
||||
pongo_path,
|
||||
NULL
|
||||
};
|
||||
ret = posix_spawn(&pid, checkra1n_path, NULL, NULL, checkra1n_argv, environ);
|
||||
if (pongo_path != NULL) free(pongo_path);
|
||||
pongo_path = NULL;
|
||||
if (pongo_path != NULL) {
|
||||
ret = posix_spawn(&pid, checkra1n_path, NULL, NULL, (char* []){
|
||||
checkra1n_path,
|
||||
args,
|
||||
"-k",
|
||||
pongo_path,
|
||||
NULL
|
||||
}, environ);
|
||||
} else {
|
||||
ret = posix_spawn(&pid, checkra1n_path, NULL, NULL, (char* []){
|
||||
checkra1n_path,
|
||||
args,
|
||||
NULL
|
||||
}, environ);
|
||||
}
|
||||
if (ret) {
|
||||
LOG(LOG_FATAL, "Cannot posix spawn %s: %d (%s)", checkra1n_path, errno, strerror(errno));
|
||||
if (ext_checkra1n != NULL) unlink(checkra1n_path);
|
||||
@@ -81,5 +165,19 @@ checkra1n_exec: {};
|
||||
checkra1n_path = NULL;
|
||||
}
|
||||
waitpid(pid, NULL, 0);
|
||||
if (!external_pongo && pongo_path != NULL) {
|
||||
unlink(pongo_path);
|
||||
}
|
||||
if (pongo_path != NULL) free(pongo_path);
|
||||
pongo_path = NULL;
|
||||
#if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER))
|
||||
if (libcheckra1nhelper_dylib_path != NULL) {
|
||||
unlink(libcheckra1nhelper_dylib_path);
|
||||
unsetenv("DYLD_INSERT_LIBRARIES");
|
||||
unsetenv("DYLD_FORCE_FLAT_NAMESPACE");
|
||||
free(libcheckra1nhelper_dylib_path);
|
||||
libcheckra1nhelper_dylib_path = NULL;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
+6
-1
@@ -15,7 +15,12 @@ unsigned char* checkra1n = NULL;
|
||||
unsigned int checkra1n_len = 0;
|
||||
#endif
|
||||
|
||||
#ifdef NO_BINPACK
|
||||
#ifdef NO_OVERLAY
|
||||
unsigned char* binpack_dmg = NULL;
|
||||
unsigned int binpack_dmg_len = 0;
|
||||
#endif
|
||||
|
||||
#ifdef NO_CUSTOM_PONGO
|
||||
unsigned char* Pongo_bin = NULL;
|
||||
unsigned int Pongo_bin_len = 0;
|
||||
#endif
|
||||
+25
-29
@@ -30,7 +30,7 @@
|
||||
#include <kerninfo.h>
|
||||
|
||||
pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex;
|
||||
#ifdef DEV_BUILD
|
||||
#ifdef TUI
|
||||
#include <newt.h>
|
||||
pthread_mutex_t tui_log_mutex;
|
||||
newtComponent tui_log_output = NULL;
|
||||
@@ -39,43 +39,39 @@ newtComponent tui_log_output = NULL;
|
||||
bool spin, found_pongo = 0;
|
||||
uint64_t ecid_wait_for_dfu = 0;
|
||||
|
||||
bool get_spin() {
|
||||
LOG(LOG_VERBOSE5, "locking spin mutex for get");
|
||||
pthread_mutex_lock(&spin_mutex);
|
||||
bool ret = spin;
|
||||
LOG(LOG_VERBOSE5, "UN-locking spin mutex, spin value is %d", spin);
|
||||
pthread_mutex_unlock(&spin_mutex);
|
||||
static bool get_locked_bool(bool* val, pthread_mutex_t* mutex) {
|
||||
// fprintf(stderr, "%s: val = %p mutex = %p\n", __func__, (void*)val, (void*)mutex);
|
||||
pthread_mutex_lock(mutex);
|
||||
bool ret = *val;
|
||||
pthread_mutex_unlock(mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool set_spin(bool val) {
|
||||
LOG(LOG_VERBOSE5, "locking spin mutex for set spin = %d", val);
|
||||
pthread_mutex_lock(&spin_mutex);
|
||||
spin = val;
|
||||
LOG(LOG_VERBOSE5, "UN-locking spin mutex after setting spin\n");
|
||||
pthread_mutex_unlock(&spin_mutex);
|
||||
return val;
|
||||
static bool set_locked_bool(bool* val, bool newval, pthread_mutex_t* mutex) {
|
||||
// fprintf(stderr, "%s: val = %p mutex = %p, newval = %d\n", __func__, (void*)val, (void*)mutex, newval);
|
||||
pthread_mutex_lock(mutex);
|
||||
*val = newval;
|
||||
pthread_mutex_unlock(mutex);
|
||||
return newval;
|
||||
}
|
||||
|
||||
bool get_found_pongo() {
|
||||
LOG(LOG_VERBOSE5, "locking found pongo mutex for get");
|
||||
pthread_mutex_lock(&found_pongo_mutex);
|
||||
bool ret = found_pongo;
|
||||
LOG(LOG_VERBOSE5, "UN-locking pongo mutex, found_pongo value is %d", found_pongo);
|
||||
pthread_mutex_unlock(&found_pongo_mutex);
|
||||
return ret;
|
||||
bool get_spin(void) {
|
||||
return get_locked_bool(&spin, &spin_mutex);
|
||||
}
|
||||
|
||||
bool set_spin(bool newval) {
|
||||
return set_locked_bool(&spin, newval, &spin_mutex);
|
||||
}
|
||||
|
||||
bool get_found_pongo(void) {
|
||||
return get_locked_bool(&found_pongo, &found_pongo_mutex);
|
||||
}
|
||||
|
||||
bool set_found_pongo(bool val) {
|
||||
LOG(LOG_VERBOSE5, "locking found pongo mutex for set found_pongo = %d", val);
|
||||
pthread_mutex_lock(&found_pongo_mutex);
|
||||
found_pongo = val;
|
||||
LOG(LOG_VERBOSE5, "UN-locking pongo mutex after setting found_pongo");
|
||||
pthread_mutex_unlock(&found_pongo_mutex);
|
||||
return val;
|
||||
return set_locked_bool(&found_pongo, val, &found_pongo_mutex);
|
||||
}
|
||||
|
||||
uint64_t get_ecid_wait_for_dfu() {
|
||||
uint64_t get_ecid_wait_for_dfu(void) {
|
||||
LOG(LOG_VERBOSE5, "locking ecid wait for dfu mutex for get");
|
||||
pthread_mutex_lock(&ecid_dfu_wait_mutex);
|
||||
uint64_t ret = ecid_wait_for_dfu;
|
||||
@@ -93,7 +89,7 @@ uint64_t set_ecid_wait_for_dfu(uint64_t ecid) {
|
||||
return ecid;
|
||||
}
|
||||
|
||||
#ifdef DEV_BUILD
|
||||
#ifdef TUI
|
||||
newtComponent get_tui_log() {
|
||||
pthread_mutex_lock(&tui_log_mutex);
|
||||
newtComponent ret = tui_log_output;
|
||||
|
||||
+10
-20
@@ -11,22 +11,19 @@
|
||||
#ifdef DEBUG
|
||||
#define log_debug(...) fprintf(stderr, __VA_ARGS__); fputc('\n', stderr)
|
||||
#else
|
||||
#define log_debug(...)
|
||||
#define log_debug(...) do {} while (0)
|
||||
#endif
|
||||
#define log_error(...) fprintf(stderr, __VA_ARGS__); fputc('\n', stderr)
|
||||
|
||||
int lockdown_connect_handle(uint32_t handle)
|
||||
{
|
||||
int lockdown_connect_handle(uint32_t handle) {
|
||||
int fd = usbmuxd_connect(handle, 62078);
|
||||
if (fd < 0) {
|
||||
log_debug("Can't connect to lockownd on device #%u", handle);
|
||||
return fd;
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
int lockdown_connect_udid(const char* udid)
|
||||
{
|
||||
int lockdown_connect_udid(const char* udid) {
|
||||
usbmuxd_device_info_t device;
|
||||
if (usbmuxd_get_device_by_udid(udid, &device) < 0) {
|
||||
log_debug("Can't find device %s", udid);
|
||||
@@ -35,8 +32,7 @@ int lockdown_connect_udid(const char* udid)
|
||||
return lockdown_connect_handle(device.handle);
|
||||
}
|
||||
|
||||
void lockdown_disconnect(int fd)
|
||||
{
|
||||
void lockdown_disconnect(int fd) {
|
||||
usbmuxd_disconnect(fd);
|
||||
}
|
||||
|
||||
@@ -56,8 +52,7 @@ static const int INTEGER_NODE_SIZE = sizeof(INTEGER_NODE)-1;
|
||||
static const int STRING_NODE_SIZE = sizeof(STRING_NODE)-1;
|
||||
static const int ERROR_KEY_NODE_SIZE = sizeof(ERROR_KEY_NODE)-1;
|
||||
|
||||
static void skip_ws(char** cur, char* end)
|
||||
{
|
||||
static void skip_ws(char** cur, char* end) {
|
||||
char* p = *cur;
|
||||
while (p < end && ((*p == ' ') || (*p == '\t') || (*p == '\r') || (*p == '\n'))) {
|
||||
p++;
|
||||
@@ -65,8 +60,7 @@ static void skip_ws(char** cur, char* end)
|
||||
*cur = p;
|
||||
}
|
||||
|
||||
static char* _send_request_and_get_reply(int fd, const char* request, uint32_t len, uint32_t* received)
|
||||
{
|
||||
static char* _send_request_and_get_reply(int fd, const char* request, uint32_t len, uint32_t* received) {
|
||||
uint32_t sent_bytes = 0;
|
||||
usbmuxd_send(fd, request, len, &sent_bytes);
|
||||
if (sent_bytes != len) {
|
||||
@@ -100,8 +94,7 @@ static char* _send_request_and_get_reply(int fd, const char* request, uint32_t l
|
||||
return resp;
|
||||
}
|
||||
|
||||
int lockdown_check_type(int fd, const char* type_match)
|
||||
{
|
||||
int lockdown_check_type(int fd, const char* type_match) {
|
||||
unsigned char tmp[512];
|
||||
uint32_t len = (uint32_t)snprintf((char*)tmp, 512, QUERY_TYPE_REQUEST);
|
||||
uint32_t belen = htonl(len-4);
|
||||
@@ -119,8 +112,7 @@ int lockdown_check_type(int fd, const char* type_match)
|
||||
return result;
|
||||
}
|
||||
|
||||
int lockdown_get_uint_value(int fd, const char* domain, const char* key, uint64_t* value)
|
||||
{
|
||||
int lockdown_get_uint_value(int fd, const char* domain, const char* key, uint64_t* value) {
|
||||
char tmp[1024];
|
||||
uint32_t len;
|
||||
if (domain) {
|
||||
@@ -159,8 +151,7 @@ int lockdown_get_uint_value(int fd, const char* domain, const char* key, uint64_
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lockdown_get_string_value(int fd, const char* domain, const char* key, char** value)
|
||||
{
|
||||
int lockdown_get_string_value(int fd, const char* domain, const char* key, char** value) {
|
||||
char tmp[1024];
|
||||
uint32_t len;
|
||||
if (domain) {
|
||||
@@ -212,8 +203,7 @@ int lockdown_get_string_value(int fd, const char* domain, const char* key, char*
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lockdown_enter_recovery(int fd)
|
||||
{
|
||||
int lockdown_enter_recovery(int fd) {
|
||||
char tmp[512];
|
||||
uint32_t len = (uint32_t)snprintf(tmp, 512, ENTER_RECOVERY_REQUEST);
|
||||
*(uint32_t*)&tmp = htonl(len-4);
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
#include <ANSI-color-codes.h>
|
||||
#include <palerain.h>
|
||||
|
||||
int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxname, char *__restrict format, ...)
|
||||
int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxname, const char *__restrict format, ...)
|
||||
{
|
||||
if (verbose >= 5
|
||||
#ifdef DEV_BUILD
|
||||
&& !checkrain_option_enabled(host_flags, host_option_tui)
|
||||
#ifdef TUI
|
||||
&& !checkrain_options_enabled(host_flags, host_option_tui)
|
||||
#endif
|
||||
) fprintf(stderr, "p1_log: loglevel %d from %s:%d:%s()\n", loglevel, fname, lineno, fxname);
|
||||
int ret = 0;
|
||||
@@ -23,7 +23,7 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
|
||||
va_start(args, format);
|
||||
if (verbose < (loglevel - 3) && loglevel > LOG_INFO) {
|
||||
if (verbose >= 5
|
||||
#ifdef DEV_BUILD
|
||||
#ifdef TUI
|
||||
&& !tui_started
|
||||
#endif
|
||||
) fprintf(stderr, "p1_log: hid log with high log level (%d < %d)\n", verbose, loglevel - 3);
|
||||
@@ -57,8 +57,12 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
|
||||
snprintf(colour_bold, 0x10, "%s", BWHT);
|
||||
break;
|
||||
}
|
||||
#ifdef DEV_BUILD
|
||||
if (checkrain_option_enabled(host_flags, host_option_tui) && tui_started) {
|
||||
if (checkrain_options_enabled(host_flags, host_option_no_colors)) {
|
||||
colour[0] = '\0';
|
||||
colour_bold[0] = '\0';
|
||||
}
|
||||
#ifdef TUI
|
||||
if (checkrain_options_enabled(host_flags, host_option_tui) && tui_started) {
|
||||
newtComponent co = get_tui_log();
|
||||
if (co == NULL) {
|
||||
return 0; /* 0 bytes printed */
|
||||
@@ -75,20 +79,31 @@ 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);
|
||||
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);
|
||||
if (verbose >= 2) {
|
||||
if (!checkrain_options_enabled(host_flags, host_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)) {
|
||||
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 {
|
||||
} else if (!checkrain_options_enabled(host_flags, host_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)) {
|
||||
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)) {
|
||||
printf(" - %s %s<%s>: ", timestring, colour_bold, type);
|
||||
}
|
||||
printf("%s", colour);
|
||||
ret = vprintf(format, args);
|
||||
va_end(args);
|
||||
|
||||
if (verbose < 2)
|
||||
if (verbose < 2 && !checkrain_options_enabled(host_flags, host_option_no_colors))
|
||||
printf(CRESET "\n");
|
||||
else
|
||||
else if (!checkrain_options_enabled(host_flags, host_option_no_colors))
|
||||
printf("\n%s-%s\n", colour, CRESET);
|
||||
else if (verbose < 2)
|
||||
printf("\n");
|
||||
else
|
||||
printf("\n%s-\n", colour);
|
||||
fflush(stdout);
|
||||
}
|
||||
pthread_mutex_unlock(&log_mutex);
|
||||
|
||||
+48
-38
@@ -7,6 +7,7 @@
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <sys/select.h>
|
||||
@@ -16,7 +17,6 @@
|
||||
#include <signal.h>
|
||||
#include <pthread.h>
|
||||
#include <inttypes.h>
|
||||
#include <getopt.h>
|
||||
#include <errno.h>
|
||||
#include <spawn.h>
|
||||
#include <sys/mman.h>
|
||||
@@ -56,9 +56,9 @@ void thr_cleanup(void* ptr) {
|
||||
*(int*)ptr = 0;
|
||||
}
|
||||
|
||||
int build_checks() {
|
||||
#if defined(__APPLE__)
|
||||
int build_checks(void) {
|
||||
#ifndef NO_CHECKRAIN
|
||||
#if defined(__APPLE__)
|
||||
struct mach_header_64* c1_header = (struct mach_header_64*)&checkra1n[0];
|
||||
if (c1_header->magic != MH_MAGIC_64 && c1_header->magic != MH_CIGAM_64) {
|
||||
LOG(LOG_FATAL, "Broken build: checkra1n is not a thin Mach-O");
|
||||
@@ -69,14 +69,19 @@ int build_checks() {
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
if (checkra1n_len <= (UCHAR_MAX + 1)) {
|
||||
LOG(LOG_FATAL, "checkra1n too small");
|
||||
}
|
||||
if (boyermoore_horspool_memmem(&checkra1n[0], checkra1n_len, (const unsigned char *)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL) {
|
||||
host_flags |= palerain_option_checkrain_is_clone;
|
||||
}
|
||||
#endif
|
||||
#ifndef NO_KPF
|
||||
struct mach_header_64 *kpf_hdr = (struct mach_header_64 *)checkra1n_kpf_pongo;
|
||||
if (kpf_hdr->magic != MH_MAGIC_64 && kpf_hdr->magic != MH_CIGAM_64) {
|
||||
LOG(LOG_FATAL, "Broken build: Invalid kernel patchfinder: Not thin 64-bit Mach-O");
|
||||
return -1;
|
||||
} else
|
||||
if (kpf_hdr->filetype != MH_KEXT_BUNDLE) {
|
||||
} else if (kpf_hdr->filetype != MH_KEXT_BUNDLE) {
|
||||
LOG(LOG_FATAL, "Broken build: Invalid kernel patchfinder: Not a kext bundle");
|
||||
return -1;
|
||||
} else if (kpf_hdr->cputype != CPU_TYPE_ARM64) {
|
||||
@@ -87,41 +92,67 @@ int build_checks() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef DEV_BUILD
|
||||
#ifdef TUI
|
||||
bool tui_started = false;
|
||||
#endif
|
||||
|
||||
#ifdef USE_LIBUSB
|
||||
void log_cb(libusb_context *ctx, enum libusb_log_level level, const char *str) {
|
||||
LOG(level + 0, str);
|
||||
}
|
||||
#endif
|
||||
|
||||
int palera1n(int argc, char *argv[]) {
|
||||
print_credits();
|
||||
int ret = 0;
|
||||
pthread_mutex_init(&log_mutex, NULL);
|
||||
pthread_mutex_init(&spin_mutex, NULL);
|
||||
pthread_mutex_init(&found_pongo_mutex, NULL);
|
||||
pthread_mutex_init(&ecid_dfu_wait_mutex, NULL);
|
||||
if ((ret = build_checks())) return ret;
|
||||
print_credits();
|
||||
if ((ret = optparse(argc, argv))) goto cleanup;
|
||||
if (checkrain_option_enabled(host_flags, host_option_palerain_version)) goto normal_exit;
|
||||
#ifdef DEV_BUILD
|
||||
if (checkrain_option_enabled(host_flags, host_option_tui)) {
|
||||
if (!checkrain_options_enabled(host_flags, host_option_device_info) && checkrain_options_enabled(host_flags, host_option_palerain_version)) goto normal_exit;
|
||||
#ifdef TUI
|
||||
if (checkrain_options_enabled(host_flags, host_option_tui)) {
|
||||
ret = tui();
|
||||
if (ret) goto cleanup;
|
||||
else goto normal_exit;
|
||||
}
|
||||
#endif
|
||||
LOG(LOG_INFO, "Waiting for devices");
|
||||
#ifdef USE_LIBUSB
|
||||
{
|
||||
libusb_set_log_cb(NULL, log_cb, LIBUSB_LOG_CB_GLOBAL);
|
||||
libusb_context* ctx = NULL;
|
||||
int test_libusb = libusb_init(&ctx);
|
||||
if (test_libusb) {
|
||||
LOG(LOG_ERROR, "cannot initialize libusb: %d (%s)\n", test_libusb, libusb_strerror(test_libusb));
|
||||
libusb_exit(ctx);
|
||||
goto cleanup;
|
||||
}
|
||||
libusb_exit(ctx);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!checkrain_options_enabled(host_flags, host_option_device_info))
|
||||
LOG(LOG_INFO, "Waiting for devices");
|
||||
|
||||
if (access("/var/run/usbmuxd", F_OK) != 0)
|
||||
LOG(LOG_WARNING, "/var/run/usbmuxd not found, normal mode device detection will not work.");
|
||||
|
||||
pthread_create(&pongo_thread, NULL, pongo_helper, NULL);
|
||||
pthread_create(&dfuhelper_thread, NULL, dfuhelper, NULL);
|
||||
pthread_join(dfuhelper_thread, NULL);
|
||||
set_spin(0);
|
||||
if (checkrain_option_enabled(host_flags, host_option_dfuhelper_only) ||
|
||||
checkrain_option_enabled(host_flags, host_option_reboot_device) ||
|
||||
checkrain_option_enabled(host_flags, host_option_exit_recovery) ||
|
||||
checkrain_option_enabled(host_flags, host_option_enter_recovery) ||
|
||||
device_has_booted)
|
||||
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
|
||||
) || device_has_booted)
|
||||
goto normal_exit;
|
||||
if (exec_checkra1n()) goto cleanup;
|
||||
|
||||
if (checkrain_option_enabled(host_flags, host_option_pongo_exit) || checkrain_option_enabled(host_flags, host_option_demote))
|
||||
if (checkrain_options_enabled(host_flags, host_option_pongo_exit | host_option_demote))
|
||||
goto normal_exit;
|
||||
set_spin(1);
|
||||
sleep(2);
|
||||
@@ -132,27 +163,6 @@ int palera1n(int argc, char *argv[]) {
|
||||
sleep(1);
|
||||
}
|
||||
normal_exit:
|
||||
if (access("/usr/bin/curl", F_OK) == 0 && !checkrain_option_enabled(host_flags, host_option_no_ohio)) {
|
||||
LOG(LOG_VERBOSE4, "Ohio");
|
||||
char* ohio_argv[] = {
|
||||
"/usr/bin/curl",
|
||||
"-sX",
|
||||
"POST",
|
||||
"-d",
|
||||
"{\"app_name\": \"palera1n_c-rewrite\"}",
|
||||
"-H",
|
||||
"Content-Type: application/json",
|
||||
"-H",
|
||||
"User-Agent: python-requests/99 palera1n-c-rewrite/0",
|
||||
"-o",
|
||||
"/dev/null",
|
||||
"https://ohio.itsnebula.net/hit",
|
||||
NULL
|
||||
};
|
||||
pid_t pid;
|
||||
posix_spawn(&pid, ohio_argv[0], NULL, NULL, ohio_argv, environ);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
if (override_kpf.magic == OVERRIDE_MAGIC) {
|
||||
munmap(override_kpf.ptr, (size_t)override_kpf.len);
|
||||
|
||||
+102
-28
@@ -9,15 +9,19 @@
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
#include <getopt.h>
|
||||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
#include <palerain.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
checkrain_option_t host_flags = 0;
|
||||
checkrain_option_p host_flags_p = &host_flags;
|
||||
static bool force_use_verbose_boot = false;
|
||||
|
||||
static struct option longopts[] = {
|
||||
{"setup-partial-fakefs", no_argument, NULL, 'B'},
|
||||
{"setup-fakefs", no_argument, NULL, 'c'},
|
||||
{"clean-fakefs", no_argument, NULL, 'c'},
|
||||
{"dfuhelper", no_argument, NULL, 'D'},
|
||||
{"help", no_argument, NULL, 'h'},
|
||||
{"pongo-shell", no_argument, NULL, 'p'},
|
||||
@@ -30,20 +34,23 @@ static struct option longopts[] = {
|
||||
{"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'},
|
||||
{"safe-mode", no_argument, NULL, 's'},
|
||||
{"version", no_argument, NULL, palerain_option_case_version},
|
||||
{"override-pongo", required_argument, NULL, 'k'},
|
||||
{"override-overlay", required_argument, NULL, 'o'},
|
||||
{"override-ramdisk", required_argument, NULL, 'r'},
|
||||
{"override-kpf", required_argument, NULL, 'K'},
|
||||
{"disable-ohio", no_argument, NULL, 'O'},
|
||||
{"override-checkra1n", required_argument, NULL, 'i'},
|
||||
{"reboot-device", no_argument, NULL, 'R'},
|
||||
{"exit-recovery", no_argument, NULL, 'n'},
|
||||
{"enter-recovery", no_argument, NULL, 'E'},
|
||||
{"device-info", no_argument, NULL, 'I'},
|
||||
#ifdef DEV_BUILD
|
||||
{"test1", no_argument, NULL, '1'},
|
||||
{"test2", no_argument, NULL, '2'},
|
||||
#endif
|
||||
#ifdef TUI
|
||||
{"tui", no_argument, NULL, 't'},
|
||||
#endif
|
||||
{NULL, 0, NULL, 0}
|
||||
@@ -52,27 +59,38 @@ static struct option longopts[] = {
|
||||
static int usage(int e, char* prog_name)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage: %s [-"
|
||||
"DEhpvVldsSLRnPI"
|
||||
#ifdef DEV_BUILD
|
||||
"Usage: %s [-12cCdDEfhlLnOpRstvV]"
|
||||
#else
|
||||
"Usage: %s [-cCdDEfhlLnOpRsvV]"
|
||||
"12"
|
||||
#endif
|
||||
" [-e boot arguments] [-k Pongo image] [-o overlay file] [-r ramdisk file] [-K KPF file] [-i checkra1n file]\n"
|
||||
#ifdef ROOTFUL
|
||||
"cCfB"
|
||||
#endif
|
||||
#ifdef TUI
|
||||
"t"
|
||||
#endif
|
||||
"] [-e boot arguments] [-k Pongo image] [-o overlay file] [-r ramdisk file] [-K KPF file] [-i checkra1n file]\n"
|
||||
"Copyright (C) 2023, palera1n team, All Rights Reserved.\n\n"
|
||||
"iOS/iPadOS 15+ arm64 jailbreaking tool\n\n"
|
||||
"iOS/iPadOS 15.0-16.5 arm64 jailbreaking tool\n\n"
|
||||
"\t--version\t\t\t\tPrint version\n"
|
||||
"\t--force-revert\t\t\t\tRemove jailbreak\n"
|
||||
#ifdef DEV_BUILD
|
||||
"\t-1, --test1\t\t\t\tSet palerain_option_test1\n"
|
||||
"\t-2, --test2\t\t\t\tSet palerain_option_test2\n"
|
||||
#endif
|
||||
#ifdef ROOTFUL
|
||||
"\t-B, --setup-partial-fakefs\t\tSetup partial fakefs\n"
|
||||
"\t-c, --setup-fakefs\t\t\tSetup fakefs\n"
|
||||
"\t-C, --clean-fakefs\t\t\tClean fakefs\n"
|
||||
#endif
|
||||
"\t-d, --demote\t\t\t\tDemote\n"
|
||||
"\t-D, --dfuhelper-only\t\t\tExit after entering DFU\n"
|
||||
"\t-D, --dfuhelper\t\t\t\tExit after entering DFU\n"
|
||||
"\t-e, --boot-args <boot arguments>\tXNU boot arguments\n"
|
||||
"\t-E, --enter-recovery\t\t\tEnter recovery mode\n"
|
||||
#ifdef ROOTFUL
|
||||
"\t-f, --fakefs \t\t\t\tBoots fakefs\n"
|
||||
#endif
|
||||
"\t-h, --help\t\t\t\tShow this help\n"
|
||||
"\t-i, --override-checkra1n <file>\t\tOverride checkra1n\n"
|
||||
"\t-k, --override-pongo <file>\t\tOverride Pongo image\n"
|
||||
@@ -80,18 +98,19 @@ static int usage(int e, char* prog_name)
|
||||
"\t-l, --rootless\t\t\t\tBoots rootless. This is the default\n"
|
||||
"\t-L, --jbinit-log-to-file\t\tMake jbinit log to /cores/jbinit.log (can be read from sandbox while jailbroken)\n"
|
||||
"\t-n, --exit-recovery\t\t\tExit recovery mode\n"
|
||||
"\t-I, --device-info\t\t\tPrint info about the connected device\n"
|
||||
"\t-o, --override-overlay <file>\t\tOverride overlay\n"
|
||||
"\t-O, --disable-ohio\t\t\tDisable Ohio\n"
|
||||
"\t-p, --pongo-shell\t\t\tBoots to PongoOS shell\n"
|
||||
"\t-P, --pongo-full\t\t\tBoots to a PongoOS shell with default images already uploaded\n"
|
||||
"\t-r, --override-ramdisk <file>\t\tOverride ramdisk\n"
|
||||
"\t-R, --reboot-device\t\t\tReboot connected device in normal mode\n"
|
||||
"\t-s, --safe-mode\t\t\t\tEnter safe mode\n"
|
||||
"\t-S, --no-colors\t\t\t\tDisable colors on the command line\n"
|
||||
"\t-v, --debug-logging\t\t\tEnable debug logging\n"
|
||||
"\t\tThis option can be repeated for extra verbosity.\n"
|
||||
"\t-V, --verbose-boot\t\t\tVerbose boot\n"
|
||||
|
||||
#ifdef DEV_BUILD
|
||||
#ifdef TUI
|
||||
"\t-t, --tui\t\t\t\tTerminal user interface\n"
|
||||
#endif
|
||||
"\nEnvironmental variables:\n"
|
||||
@@ -104,13 +123,13 @@ static int usage(int e, char* prog_name)
|
||||
int optparse(int argc, char* argv[]) {
|
||||
int opt;
|
||||
int index;
|
||||
while ((opt = getopt_long(argc, argv,
|
||||
while ((opt = getopt_long(argc, argv,
|
||||
"DEhpvVldsSLtRnPIe:o:r:K:k:i:"
|
||||
#ifdef DEV_BUILD
|
||||
"12BcDEhpvVldsOLftRnPe:o:r:K:k:i:",
|
||||
#else
|
||||
"BcDEhpvVldsOLfRnPe:o:r:K:k:i:",
|
||||
"12"
|
||||
#endif
|
||||
longopts, NULL)) != -1)
|
||||
"fCcB"
|
||||
,longopts, NULL)) != -1)
|
||||
{
|
||||
switch (opt) {
|
||||
case 'B':
|
||||
@@ -122,6 +141,9 @@ int optparse(int argc, char* argv[]) {
|
||||
palerain_flags |= palerain_option_setup_rootful;
|
||||
kpf_flags |= checkrain_option_verbose_boot;
|
||||
break;
|
||||
case 'C':
|
||||
palerain_flags |= palerain_option_clean_fakefs;
|
||||
break;
|
||||
case 'p':
|
||||
host_flags |= host_option_pongo_exit;
|
||||
break;
|
||||
@@ -139,6 +161,7 @@ int optparse(int argc, char* argv[]) {
|
||||
break;
|
||||
case 'V':
|
||||
kpf_flags |= checkrain_option_verbose_boot;
|
||||
force_use_verbose_boot = true;
|
||||
break;
|
||||
case 'e':
|
||||
if (strstr(optarg, "rootdev=") != NULL) {
|
||||
@@ -209,7 +232,36 @@ int optparse(int argc, char* argv[]) {
|
||||
} else if (!(st.st_mode & S_IXUSR) && !(st.st_mode & S_IXGRP) && !(st.st_mode & S_IXOTH)) {
|
||||
LOG(LOG_FATAL, "%s is not executable", optarg);
|
||||
return -1;
|
||||
};
|
||||
} else if (!S_ISREG(st.st_mode)) {
|
||||
LOG(LOG_FATAL, "%s is not a regular file", optarg);
|
||||
return -1;
|
||||
}
|
||||
if (st.st_size < (UCHAR_MAX+1)) {
|
||||
LOG(LOG_FATAL, "%s too small", optarg);
|
||||
return -1;
|
||||
}
|
||||
int checkra1n_fd = open(optarg, O_RDONLY);
|
||||
if (checkra1n_fd == -1) {
|
||||
LOG(LOG_FATAL, "Cannot open %s: %d (%s)", optarg, errno, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
void* addr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, checkra1n_fd, 0);
|
||||
if (addr == MAP_FAILED) {
|
||||
LOG(LOG_ERROR, "Failed to map file %s: %d (%s)", optarg, errno, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
if (boyermoore_horspool_memmem(addr, st.st_size, (const unsigned char*)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL)
|
||||
{
|
||||
host_flags |= palerain_option_checkrain_is_clone;
|
||||
LOG(LOG_VERBOSE3, "%s is checkra1n clone", optarg);
|
||||
}
|
||||
else
|
||||
{
|
||||
host_flags &= ~palerain_option_checkrain_is_clone;
|
||||
LOG(LOG_VERBOSE3, "%s is checkra1n", optarg);
|
||||
}
|
||||
munmap(addr, st.st_size);
|
||||
close(checkra1n_fd);
|
||||
ext_checkra1n = calloc(1, strlen(optarg) + 1);
|
||||
snprintf(ext_checkra1n, strlen(optarg) + 1, "%s", optarg);
|
||||
break;
|
||||
@@ -219,13 +271,18 @@ int optparse(int argc, char* argv[]) {
|
||||
case 'n':
|
||||
host_flags |= host_option_exit_recovery;
|
||||
break;
|
||||
case 'O':
|
||||
host_flags |= host_option_no_ohio;
|
||||
case 'I':
|
||||
host_flags |= host_option_device_info;
|
||||
break;
|
||||
#ifdef DEV_BUILD
|
||||
case 'S':
|
||||
host_flags |= host_option_no_colors;
|
||||
break;
|
||||
#ifdef TUI
|
||||
case 't':
|
||||
host_flags |= host_option_tui;
|
||||
break;
|
||||
#endif
|
||||
#ifdef DEV_BUILD
|
||||
case '1':
|
||||
palerain_flags |= palerain_option_test1;
|
||||
break;
|
||||
@@ -244,13 +301,28 @@ int optparse(int argc, char* argv[]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (checkrain_option_enabled(host_flags, host_option_palerain_version)) {
|
||||
#ifndef __INTELLISENSE__
|
||||
printf("palera1n version " PALERAIN_VERSION ": " BUILD_DATE "; " BUILD_WHOAMI ":" BUILD_TAG "/" BUILD_STYLE "\n");
|
||||
if (checkrain_options_enabled(host_flags, host_option_palerain_version)) {
|
||||
printf(
|
||||
"palera1n " PALERAIN_VERSION "\n"
|
||||
BUILD_COMMIT " " BUILD_NUMBER " (" BUILD_BRANCH ")\n\n"
|
||||
"Build date: " BUILD_DATE "\n"
|
||||
"Build style: " BUILD_STYLE "\n"
|
||||
"Build tag: " BUILD_TAG "\n"
|
||||
"Built by: " BUILD_WHOAMI "\n"
|
||||
#ifdef USE_LIBUSB
|
||||
"USB backend: libusb\n"
|
||||
#else
|
||||
"USB backend: IOKit\n"
|
||||
#endif
|
||||
"Build options: " BUILD_OPTIONS "\n"
|
||||
);
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -271,17 +343,17 @@ int optparse(int argc, char* argv[]) {
|
||||
LOG(LOG_VERBOSE4, "overlay override ptr %p -> %p", override_overlay.orig_ptr, **overlay_to_upload);
|
||||
}
|
||||
|
||||
if (!checkrain_option_enabled(palerain_flags, palerain_option_rootful)) {
|
||||
if (checkrain_option_enabled(palerain_flags, palerain_option_setup_rootful) || checkrain_option_enabled(palerain_flags, palerain_option_setup_rootful_forced)) {
|
||||
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)) {
|
||||
LOG(LOG_FATAL, "Cannot setup rootful when rootless is requested. Use -f to enable rootful mode.");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if (!(
|
||||
checkrain_option_enabled(host_flags, host_option_dfuhelper_only) ||
|
||||
checkrain_option_enabled(host_flags, host_option_enter_recovery) ||
|
||||
checkrain_option_enabled(host_flags, host_option_exit_recovery) ||
|
||||
checkrain_option_enabled(host_flags, host_option_reboot_device)))
|
||||
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)))
|
||||
{
|
||||
#ifdef NO_CHECKRAIN
|
||||
if (checkra1n_len == 0 && ext_checkra1n == NULL)
|
||||
@@ -289,7 +361,7 @@ int optparse(int argc, char* argv[]) {
|
||||
LOG(LOG_FATAL, "checkra1n omitted in build but no override specified");
|
||||
return -1;
|
||||
}
|
||||
if (!(checkrain_option_enabled(host_flags, host_option_pongo_exit) || checkrain_option_enabled(host_flags, host_option_pongo_exit)))
|
||||
if (!(checkrain_options_enabled(host_flags, host_option_pongo_exit) || checkrain_options_enabled(host_flags, host_option_pongo_exit)))
|
||||
{
|
||||
#ifdef NO_KPF
|
||||
if (checkra1n_kpf_pongo_len == 0)
|
||||
@@ -318,8 +390,10 @@ int optparse(int argc, char* argv[]) {
|
||||
}
|
||||
}
|
||||
if (verbose >= 2) setenv("LIBUSB_DEBUG", "1", 1);
|
||||
|
||||
if (verbose >= 3)
|
||||
{
|
||||
libusbmuxd_set_debug_level(verbose - 2);
|
||||
irecv_set_debug_level(1);
|
||||
setenv("LIBUSB_DEBUG", "2", 1);
|
||||
}
|
||||
|
||||
+40
-15
@@ -11,6 +11,7 @@
|
||||
#include <sys/stat.h> // fstst
|
||||
|
||||
#include <palerain.h>
|
||||
#include <ANSI-color-codes.h>
|
||||
|
||||
bool device_has_booted = 0;
|
||||
int pongo_thr_running = 0;
|
||||
@@ -28,15 +29,15 @@ void* pongo_helper(void* ptr) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *pongo_usb_callback(void *arg) {
|
||||
void *pongo_usb_callback(stuff_t *arg) {
|
||||
if (get_found_pongo())
|
||||
return NULL;
|
||||
set_found_pongo(1);
|
||||
if (checkrain_option_enabled(palerain_flags, palerain_option_setup_rootful)) {
|
||||
if (checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful)) {
|
||||
strncat(xargs_cmd, " wdt=-1", 0x270 - strlen(xargs_cmd) - 1);
|
||||
}
|
||||
LOG(LOG_INFO, "Found PongoOS USB Device");
|
||||
usb_device_handle_t handle = *(usb_device_handle_t *)arg;
|
||||
usb_device_handle_t handle = arg->handle;
|
||||
issue_pongo_command(handle, NULL);
|
||||
issue_pongo_command(handle, "fuse lock");
|
||||
issue_pongo_command(handle, "sep auto");
|
||||
@@ -45,7 +46,7 @@ void *pongo_usb_callback(void *arg) {
|
||||
issue_pongo_command(handle, kpf_flags_cmd);
|
||||
issue_pongo_command(handle, checkrain_flags_cmd);
|
||||
issue_pongo_command(handle, palerain_flags_cmd);
|
||||
if (checkrain_option_enabled(palerain_flags, palerain_option_rootful))
|
||||
if (checkrain_options_enabled(palerain_flags, palerain_option_rootful))
|
||||
{
|
||||
issue_pongo_command(handle, "rootfs");
|
||||
}
|
||||
@@ -57,7 +58,7 @@ void *pongo_usb_callback(void *arg) {
|
||||
upload_pongo_file(handle, **ramdisk_to_upload, ramdisk_dmg_len);
|
||||
issue_pongo_command(handle, "ramdisk");
|
||||
}
|
||||
#ifdef NO_BINPACK
|
||||
#ifdef NO_OVERLAY
|
||||
if (binpack_dmg_len != 0)
|
||||
#endif
|
||||
{
|
||||
@@ -65,15 +66,25 @@ void *pongo_usb_callback(void *arg) {
|
||||
issue_pongo_command(handle, "overlay");
|
||||
}
|
||||
issue_pongo_command(handle, xargs_cmd);
|
||||
if (checkrain_option_enabled(host_flags, host_option_pongo_full)) goto done;
|
||||
if (checkrain_options_enabled(host_flags, host_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)) {
|
||||
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)) {
|
||||
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.");
|
||||
}
|
||||
if (dfuhelper_thr_running) {
|
||||
pthread_cancel(dfuhelper_thread);
|
||||
dfuhelper_thr_running = false;
|
||||
}
|
||||
done:
|
||||
device_has_booted = true;
|
||||
#ifdef USE_LIBUSB
|
||||
libusb_unref_device(arg->dev);
|
||||
#endif
|
||||
set_spin(0);
|
||||
return NULL;
|
||||
}
|
||||
@@ -129,10 +140,10 @@ fetch_output:
|
||||
bad:
|
||||
if (ret != USB_RET_SUCCESS)
|
||||
{
|
||||
if (ret == USB_RET_NOT_RESPONDING)
|
||||
return 0;
|
||||
if (command != NULL && (!strncmp("boot", command, 4) && ret == USB_RET_IO))
|
||||
return 0;
|
||||
if (command != NULL && (!strncmp("boot", command, 4))) {
|
||||
if (ret == USB_RET_IO || ret == USB_RET_NO_DEVICE || ret == USB_RET_NOT_RESPONDING)
|
||||
return 0;
|
||||
}
|
||||
LOG(LOG_ERROR, "USB error: %s", usb_strerror(ret));
|
||||
return ret;
|
||||
}
|
||||
@@ -149,19 +160,28 @@ int upload_pongo_file(usb_device_handle_t handle, unsigned char *buf, unsigned i
|
||||
ret = USBBulkUpload(handle, buf, buf_len);
|
||||
if (ret == USB_RET_SUCCESS)
|
||||
{
|
||||
LOG(LOG_VERBOSE, "Uploaded %llu bytes to PongoOS", (unsigned long long)buf_len);
|
||||
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))
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (verbose >= 3) printf("pongoOS> ");
|
||||
return ret;
|
||||
}
|
||||
|
||||
void io_start(stuff_t *stuff)
|
||||
{
|
||||
int r = pthread_create(&stuff->th, NULL, &pongo_usb_callback, &stuff->handle);
|
||||
int r = pthread_create(&stuff->th, NULL, (pthread_start_t)pongo_usb_callback, stuff);
|
||||
if(r != 0)
|
||||
{
|
||||
ERR("pthread_create: %s", strerror(r));
|
||||
exit(-1); // TODO: ok with libusb?
|
||||
set_spin(0);
|
||||
return;
|
||||
}
|
||||
pthread_join(stuff->th, NULL);
|
||||
}
|
||||
@@ -172,14 +192,19 @@ void io_stop(stuff_t *stuff)
|
||||
if(r != 0)
|
||||
{
|
||||
ERR("pthread_cancel: %s", strerror(r));
|
||||
exit(-1); // TODO: ok with libusb?
|
||||
set_spin(0);
|
||||
return;
|
||||
}
|
||||
r = pthread_join(stuff->th, NULL);
|
||||
if(r != 0)
|
||||
{
|
||||
ERR("pthread_join: %s", strerror(r));
|
||||
exit(-1); // TODO: ok with libusb?
|
||||
set_spin(0);
|
||||
return;
|
||||
}
|
||||
#ifdef USE_LIBUSB
|
||||
libusb_unref_device(stuff->dev);
|
||||
#endif
|
||||
}
|
||||
|
||||
void write_stdout(char *buf, uint32_t len)
|
||||
|
||||
+59
-58
@@ -38,7 +38,7 @@
|
||||
#include <sys/stat.h> // fstst
|
||||
|
||||
#include <palerain.h>
|
||||
#define ERR(...) LOG(LOG_VERBOSE, __VA_ARGS__)
|
||||
#define ERR(...) LOG(LOG_ERROR, __VA_ARGS__)
|
||||
|
||||
void io_start(stuff_t *stuff);
|
||||
void io_stop(stuff_t *stuff);
|
||||
@@ -114,12 +114,12 @@ usb_ret_t USBBulkUpload(usb_device_handle_t handle, void *data, int len)
|
||||
|
||||
static int FoundDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *arg)
|
||||
{
|
||||
LOG(LOG_VERBOSE, "PongoOS USB Device connected");
|
||||
stuff_t *stuff = arg;
|
||||
if(stuff->handle)
|
||||
{
|
||||
return LIBUSB_SUCCESS;
|
||||
}
|
||||
LOG(LOG_VERBOSE, "PongoOS USB Device connected");
|
||||
|
||||
libusb_device_handle *handle;
|
||||
int r = libusb_open(dev, &handle);
|
||||
@@ -162,15 +162,16 @@ static int FoundDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_e
|
||||
|
||||
static int LostDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *arg)
|
||||
{
|
||||
LOG(LOG_VERBOSE, "PongoOS USB Device disconnected");
|
||||
stuff_t *stuff = arg;
|
||||
if(stuff->dev != dev)
|
||||
{
|
||||
return LIBUSB_SUCCESS;
|
||||
}
|
||||
LOG(LOG_VERBOSE, "PongoOS USB Device disconnected");
|
||||
|
||||
io_stop(stuff);
|
||||
libusb_close(stuff->handle);
|
||||
libusb_unref_device(dev);
|
||||
stuff->handle = NULL;
|
||||
stuff->dev = NULL;
|
||||
|
||||
@@ -180,9 +181,11 @@ static int LostDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_ev
|
||||
int wait_for_pongo(void)
|
||||
{
|
||||
stuff_t stuff;
|
||||
stuff.handle = NULL;
|
||||
libusb_hotplug_callback_handle hp[2];
|
||||
libusb_context* ctx = NULL;
|
||||
|
||||
int r = libusb_init(NULL);
|
||||
int r = libusb_init(&ctx);
|
||||
if(r != LIBUSB_SUCCESS)
|
||||
{
|
||||
ERR("libusb_init: %s", libusb_error_name(r));
|
||||
@@ -192,75 +195,73 @@ int wait_for_pongo(void)
|
||||
if(!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG))
|
||||
{
|
||||
ERR("libusb: no hotplug capability");
|
||||
libusb_exit(NULL);
|
||||
libusb_exit(ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
r = libusb_hotplug_register_callback(NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, 0, PONGO_USB_VENDOR, PONGO_USB_PRODUCT, LIBUSB_HOTPLUG_MATCH_ANY, FoundDevice, &stuff, &hp[0]);
|
||||
r = libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, PONGO_USB_VENDOR, PONGO_USB_PRODUCT, LIBUSB_HOTPLUG_MATCH_ANY, LostDevice, &stuff, &hp[1]);
|
||||
if(r != LIBUSB_SUCCESS)
|
||||
{
|
||||
ERR("libusb_hotplug: %s", libusb_error_name(r));
|
||||
libusb_exit(NULL);
|
||||
libusb_exit(ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
r = libusb_hotplug_register_callback(NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, PONGO_USB_VENDOR, PONGO_USB_PRODUCT, LIBUSB_HOTPLUG_MATCH_ANY, LostDevice, &stuff, &hp[1]);
|
||||
if(r != LIBUSB_SUCCESS)
|
||||
{
|
||||
ERR("libusb_hotplug: %s", libusb_error_name(r));
|
||||
libusb_exit(NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
libusb_device **list;
|
||||
ssize_t sz = libusb_get_device_list(NULL, &list);
|
||||
if(sz < 0)
|
||||
{
|
||||
ERR("libusb_get_device_list: %s", libusb_error_name((int)sz));
|
||||
libusb_exit(NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for(ssize_t i = 0; i < sz; ++i)
|
||||
{
|
||||
struct libusb_device_descriptor desc;
|
||||
r = libusb_get_device_descriptor(list[i], &desc);
|
||||
if(r != LIBUSB_SUCCESS)
|
||||
{
|
||||
ERR("libusb_get_device_descriptor: %s", libusb_error_name(r));
|
||||
// continue anyway
|
||||
}
|
||||
if(desc.idVendor != PONGO_USB_VENDOR || desc.idProduct != PONGO_USB_PRODUCT)
|
||||
{
|
||||
libusb_unref_device(list[i]);
|
||||
continue;
|
||||
}
|
||||
r = FoundDevice(NULL, list[i], LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, &stuff);
|
||||
for(ssize_t j = i + 1; j < sz; ++j)
|
||||
{
|
||||
libusb_unref_device(list[j]);
|
||||
}
|
||||
if(r != LIBUSB_SUCCESS)
|
||||
{
|
||||
libusb_free_device_list(list, 0);
|
||||
libusb_exit(NULL);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
libusb_free_device_list(list, 0);
|
||||
|
||||
while(get_spin())
|
||||
{
|
||||
r = libusb_handle_events(NULL);
|
||||
while (1) {
|
||||
r = libusb_handle_events(ctx);
|
||||
if(r != LIBUSB_SUCCESS)
|
||||
{
|
||||
ERR("libusb_handle_events: %s", libusb_error_name(r));
|
||||
break;
|
||||
}
|
||||
|
||||
libusb_device **list;
|
||||
ssize_t sz = libusb_get_device_list(ctx, &list);
|
||||
bool done = false;
|
||||
if(sz < 0)
|
||||
{
|
||||
ERR("libusb_get_device_list: %s", libusb_error_name((int)sz));
|
||||
libusb_exit(ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for(ssize_t i = 0; i < sz; ++i)
|
||||
{
|
||||
struct libusb_device_descriptor desc;
|
||||
r = libusb_get_device_descriptor(list[i], &desc);
|
||||
if(r != LIBUSB_SUCCESS)
|
||||
{
|
||||
ERR("libusb_get_device_descriptor: %s", libusb_error_name(r));
|
||||
// continue anyway
|
||||
}
|
||||
if(desc.idVendor != PONGO_USB_VENDOR || desc.idProduct != PONGO_USB_PRODUCT)
|
||||
{
|
||||
libusb_unref_device(list[i]);
|
||||
continue;
|
||||
}
|
||||
r = FoundDevice(ctx, list[i], LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, &stuff);
|
||||
for (ssize_t j = i; j < sz; ++j) {
|
||||
libusb_unref_device(list[j]);
|
||||
}
|
||||
|
||||
if(r != LIBUSB_SUCCESS)
|
||||
{
|
||||
libusb_free_device_list(list, 0);
|
||||
libusb_exit(ctx);
|
||||
return -1;
|
||||
} else {
|
||||
done = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
libusb_free_device_list(list, 0);
|
||||
|
||||
if (done) goto end;
|
||||
}
|
||||
|
||||
libusb_exit(NULL);
|
||||
return 0;
|
||||
end:
|
||||
libusb_exit(ctx);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
Reference in new issue
Block a user