Compare commits

..
1 Commits
Author SHA1 Message Date
Nick Chan f92cc2c04d rootful real part 1 2023-04-15 22:15:08 +08:00
30 changed files with 425 additions and 1541 deletions

No files matched your search

+12 -60
View File
@@ -24,7 +24,7 @@ on:
jobs:
build-docs:
runs-on: ubuntu-latest
steps:
steps:
- name: Checkout
uses: actions/checkout@v3
@@ -39,10 +39,6 @@ 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]
@@ -52,9 +48,9 @@ jobs:
username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }}
forceUpload: true
dryRun: true
dryRun: false
localDir: 'ready/'
remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref_name }}/${{ github.run_number }}"
remoteDir: '/palera1n/artifacts/c-rewrite'
build-darwin:
strategy:
@@ -74,7 +70,7 @@ jobs:
minos: 7.0
runs-on: macos-12
env:
MBEDTLS_VERSION: 3.4.0
MBEDTLS_VERSION: 3.3.0
READLINE_VERSION: 8.2
SLANG_VERSION: 2.3.3
NEWT_VERSION: 0.52.23
@@ -329,10 +325,6 @@ 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]
@@ -342,9 +334,9 @@ jobs:
username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }}
forceUpload: true
dryRun: true
dryRun: false
localDir: 'ready/'
remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref }}/${{ github.run_number }}"
remoteDir: '/palera1n/artifacts/c-rewrite'
- name: Upload ${{ matrix.os }} thin ${{ matrix.arch }} build
if: ${{ github.event_name != 'pull_request' }}
@@ -361,7 +353,7 @@ 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
@@ -469,19 +461,6 @@ jobs:
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' }}
@@ -492,9 +471,9 @@ jobs:
username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }}
forceUpload: true
dryRun: true
dryRun: false
localDir: 'ready/'
remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref }}/${{ github.run_number }}"
remoteDir: '/palera1n/artifacts/c-rewrite'
build-Linux:
strategy:
@@ -506,7 +485,7 @@ jobs:
- aarch64-linux-musl
runs-on: ubuntu-latest
env:
MBEDTLS_VERSION: 3.4.0
MBEDTLS_VERSION: 3.3.0
LIBUSB_VERSION: 1.0.26
READLINE_VERSION: 8.2
SLANG_VERSION: 2.3.3
@@ -792,10 +771,6 @@ jobs:
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]
@@ -805,29 +780,6 @@ jobs:
username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }}
forceUpload: true
dryRun: true
dryRun: false
localDir: 'ready/'
remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref }}/${{ 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\"}")
remoteDir: '/palera1n/artifacts/c-rewrite'
+4 -13
View File
@@ -4,13 +4,11 @@ SRC = $(shell pwd)
DEP = $(SRC)/dep_root
STRIP = strip
CC ?= cc
CXX ?= c++
CFLAGS += -I$(DEP)/include -I$(SRC)/include -I$(SRC) -D_XOPEN_SOURCE=500
CFLAGS += -Wall -Wextra -Wno-unused-parameter -DPALERAIN_VERSION=\"2.0.0\"
CFLAGS += -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=200112L
CXXFLAGS += -I$(DEP)/include -I$(SRC)/include -I$(SRC) -std=c++11
LIBS += $(DEP)/lib/libimobiledevice-1.0.a $(DEP)/lib/libirecovery-1.0.a $(DEP)/lib/libusbmuxd-2.0.a
LIBS += $(DEP)/lib/libimobiledevice-glue-1.0.a $(DEP)/lib/libplist-2.0.a -pthread -lm
LIBS += $(DEP)/lib/libimobiledevice-glue-1.0.a $(DEP)/lib/libplist-2.0.a -pthread
ifeq ($(TARGET_OS),)
TARGET_OS = $(shell uname -s)
endif
@@ -33,13 +31,6 @@ ifeq ($(TARGET_OS),Linux)
LIBS += $(DEP)/lib/libgpm.a
endif
endif
ifeq ($(GUI),1)
LIBS += $(DEP)/lib/libguira1n.a
ifeq ($(TARGET_OS),Darwin)
LIBS += -framework Foundation -framework AppKit
CXXFLAGS += -x objective-c++
endif
endif
ifeq ($(DEV_BUILD),1)
CFLAGS += -O0 -g -DDEV_BUILD -fno-omit-frame-pointer
ifeq ($(ASAN),1)
@@ -73,7 +64,7 @@ CFLAGS += -DBUILD_WHOAMI="\"$(BUILD_WHOAMI)\"" -DBUILD_TAG="\"$(BUILD_TAG)\""
CFLAGS += -DBUILD_NUMBER="\"$(BUILD_NUMBER)\"" -DBUILD_BRANCH="\"$(BUILD_BRANCH)\""
CFLAGS += -DBUILD_COMMIT="\"$(BUILD_COMMIT)\""
export SRC DEP CC CXX CFLAGS CXXFLAGS LDFLAGS LIBS TARGET_OS DEV_BUILD BUILD_DATE BUILD_TAG BUILD_WHOAMI BUILD_STYLE BUILD_NUMBER BUILD_BRANCH
export SRC DEP CC CFLAGS LDFLAGS LIBS TARGET_OS DEV_BUILD BUILD_DATE BUILD_TAG BUILD_WHOAMI BUILD_STYLE BUILD_NUMBER BUILD_BRANCH
all: palera1n
+31 -15
View File
@@ -2,20 +2,36 @@
<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>
<h3 align="right">An iOS 15.0-16.4 work-in-progress, <br>semi-tethered checkm8 jailbreak</h3>
<br clear="both"/>
<p align="right" >
<strong><a href="https://cdn.nickchan.lol/palera1n/c-rewrite/releases/v2.0.0-beta.4/palera1n.1.html">Usage</a></strong>
•
<strong><a href="https://github.com/palera1n/palera1n/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>
## 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).
## If you want a jailbreak, you should read the [guide](https://palera.in).
### You can obtain v2.0.0 beta [here](https://github.com/palera1n/palera1n/releases).
If you need an older v2.0.0 beta, please get it [here](https://github.com/palera1n/palera1n-c/releases/tag/v2.0.0-beta.4).
# Warnings
- This palera1n rewrite has noticeably different arguments compared to the shell version of palera1n.
- Highly recommended that 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).
- This does **NOT** support tethered creation or booting. You must use the older [shell version of palera1n](https://github.com/palera1n/palera1n/tree/legacy) (clone with `-b legacy`).
## 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`.
- palera1n will never work in VirtualBox, VMware or any virtual machine that doesn't support PCI passthrough.
## Requirements
# 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).
@@ -25,12 +41,8 @@
- 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
@@ -38,15 +50,19 @@ 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 `-VvL` would help with debugging.
Using `-V` and `-v` would help with debugging.
Join the [Support Discord](https://dsc.gg/palera1n), and create a thread in [#support](https://discord.com/channels/1028398973452570725/1028730487700738130) or ask in [#general](https://discord.com/channels/1028398973452570725/1028398976640229380).
## Credits
<details><summary>Credits</summary>
# Credits
<details><summary>palera1n-c Contributors and Credits</summary>
<p>
- [Lakhan Lothiyi](https://github.com/llsc12) for older palera1n loader app
- [Nick Chan](https://github.com/asdfugil) for the rewrite
- [Nebula](https://github.com/itsnebulalol) - palera1n owner and manager
- [Mineek](https://github.com/mineek)
- [Tom](https://github.com/plooshi) for updated ploosh kpf and universal loader
- [Lakhan Lothiyi](https://github.com/llsc12) for 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
+12 -24
View File
@@ -6,7 +6,7 @@
.Dt palera1n 1
.Sh NAME
.Nm palera1n
.Nd iOS 15.0-16.5 arm64 iOS/iPadOS jailbreaking tool
.Nd iOS 15.0-16.4 arm64 iOS/iPadOS jailbreaking tool
.Sh SYNOPSIS
.Nm
.Op Fl cCdDEfhIlLnpRsSvV
@@ -20,7 +20,7 @@
.Op Fl -force-revert
.Sh DESCRIPTION
.Nm
jailbreaks any iOS/iPadOS device with an arm64 (arm64e excluded) on iOS 15.0-16.5,
jailbreaks any iOS/iPadOS device with an arm64 (arm64e excluded) on iOS 15.0-16.4,
utilizing the
.Em checkm8
bootROM exploit.
@@ -52,7 +52,7 @@ In the remainder of this document, the term "iOS" and "iPadOS" will be used inte
as the difference is negligible as far as the jailbreak is concerened.
.Pp
.Sh SUPPORTED DEVICES
As described above, arm64 iOS 15.0-16.5 devices are supported, here is an explicit
As described above, arm64 iOS 15.0-16.4 devices are supported, here is an explicit
list of supported devicecs:
.Bl -tag -compact
@@ -96,11 +96,11 @@ Remove the jailbreak while keeping user data. Some jailbreak files may remain
after running this command. Additionally, jailbreak apps will remain on the
home screen on for a while even when the files are deleted as the icon cache
still has their icons. When used with
.Fl f , -fakefs ,
.Fl f , -rootful ,
this will actually boot the device in rootless mode then delete the jailbreak
files. As a result, using the loader app to install the jailbreak environment
is not supported when this option is used together with
.Fl f , -fakefs
.Fl f , -rootful
\[char46]
.It Fl B , -setup-fakefs-partial
Like
@@ -111,20 +111,8 @@ when setting up fakefs for rootful, as they do not have enough storage for full
This option currently does not work on iOS 16.
.It Fl c , -setup-fakefs
When used with
.Fl f , -fakefs ,
creates the new APFS volume required for rootful. Will fail if one already exists.
.It Fl C , -clean-fakefs
This reverts the fakefs to the
.Em orig-fs
snapshot that is created when the fakefs
is first created, then the device will continue to boot jailbroken. This option
allows resetting the rootful environment without deleting the entire fakefs.
Note that this option will not work if the fakefs is created in an older version
of palera1n that does not create the
.Em orig-fs
snapshot on the fakefs. This option will also remove some jailbreak files inside
of /var. The files in /var will not be deleted when a userspace reboot is done
with this flag set.
.Fl f , -rootful ,
creates the new APFS volume required for rootful on iOS/iPadOS. Will fail if one already exists.
.It Fl d , -demote
Set the effective production fuse to 0, so as to enable hardware debugging features.
.It Fl D , -dfuhelper
@@ -140,7 +128,7 @@ and cannot be overriden. Additionally, the
argument is used during fakefs setup.
.It Fl E , -enter-recovery
Exit after entering recovery mode.
.It Fl f , -fakefs
.It Fl f , -rootful
Proceed in rootful mode. This applies to both full fakefs and partial fakefs.
.It Fl h , -help
Prints help text.
@@ -155,13 +143,13 @@ 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/palera1n/PongoOS
.Sy https://github.com/guacaplushy/PongoOS
iOS15 branch or your own fork of it.
.It Fl l , -rootless
Proceed in rootless mode, this is the default when neither
.Fl l , -rootless
and
.Fl f , -fakefs
.Fl f , -rootful
is specified.
.Fl L , -jbinit-log-to-file
Makes jbinit log to
@@ -271,7 +259,7 @@ before they can be ran on a device jailbroken with
\[char46]
.Pp
When using rootful mode, the
.Fl f , -fakefs
.Fl f , -rootful
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
@@ -323,7 +311,7 @@ may crash if the machine it is running on:
.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.
The device may randomly crash and reboot due to launchd receiving signal 7 (SIGEMT).
.Sh NOTES
.Nm
injects a dylib into launchd to allow the
-33
View File
@@ -1,33 +0,0 @@
#ifndef COMMON_H
#define COMMON_H
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
extern "C" {
#include <palerain.h>
#include <gui.h>
}
#define DISCONNECTED 0
#define NORMAL 1
#define RECOVERY 2
#define DFU 3
#define rest(a) std::this_thread::sleep_for(std::chrono::seconds(a))
#define FLOAT_TO_INT(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
void guifree(void);
void dfuhelper();
void send_alert(const char *title, const char *msg);
extern devinfo_t dev;
extern bool waiting_for_device;
extern bool unsupported_device;
extern bool supported_device;
extern bool recovery_wait;
extern bool jailbreak;
extern bool enter_dfu;
extern bool dfu_helper;
extern int device_status;
#endif
-55
View File
@@ -1,55 +0,0 @@
#ifndef DESIGN_H
#define DESIGN_H
#define set_pos(a,b) ImGui::SetCursorPos(ImVec2(a,b))
#define font(a) ImGui::PushFont(io.Fonts->Fonts[a])
#define btn_text_on colors[ImGuiCol_Text] = ImVec4{.05f, .05f, .05f, 1.0f}
#define btn_text_off colors[ImGuiCol_Text] = ImVec4{1.0f, 1.0f, 1.0f, 1.0f}
#define dfu_text_light colors[ImGuiCol_Text] = ImVec4{1.0f, 1.0f, 1.0f, 1.0f}
#define dfu_text_dark colors[ImGuiCol_Text] = ImVec4{1.0f, 1.0f, 1.0f, 0.3f}
#define size(x,y) ImVec2(x,y)
#define pos(x,y) ImVec2(x,y)
/* Fonts we have loaded into memory */
#define SF_Reg 0
#define SF_Med 2
#define SF_Bold 1
#define SF_Sm_Bold 3
#define Hack 4
#define SF_RoundBold 5
#define SF_RegMed 6
#define SF_BoldLarge 7
#define WHITE ImVec4{1.0f, 1.0f, 1.0f, 1.0f}
void ImageRotated(ImTextureID tex_id, ImVec2 center, ImVec2 size, float angle);
void draw_box(ImVec2 location, ImVec2 size, ImVec4 color, float radius);
void reset_design(void);
void reset_views(void);
bool is_hovered(const char* id, int w, int h);
bool is_pressed(const char* id, int w, int h);
void anim_btn(const char* id, ImVec2 size, ImVec2 size_to, ImVec2 pos, ImVec2 pos_to);
void anim_box(const char* id, ImVec2 size, ImVec2 size_to, ImVec2 pos, ImVec2 pos_to);
void label(const char *text, ImVec2 location, ImVec4 color, int font);
void rotate_image(const char *image, ImVec2 pos, ImVec2 size, float angle, float speed);
std::string addstr2(const char *str1, const char *str2);
std::string addstr3(const char *str1, const char *str2, const char *str3);
std::string addstr4(const char *str1, const char *str2, const char *str3, const char *str4);
void image_btn_style_alt(void);
void init_style(void);
void init_colors(void);
ImVec4 hex_color(int hex, float alpha);
ImColor hex_imcolor(int hex, float alpha);
void image_btn_style();
extern float btn_w;
extern float btn_h;
extern float btn_x;
extern float btn_y;
extern float box_w;
extern float box_h;
extern float box_x;
extern float box_y;
#endif
-36
View File
@@ -1,36 +0,0 @@
#ifndef GUI_H
#define GUI_H
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#define WINDOW_X 0
#define WINDOW_Y 0
#define WINDOW_SIZE_X 550
#define WINDOW_SIZE_Y 300
#define WINDOW_TITLE "palera1n"
#define WINDOW_RESIZE false
#define WINDOW_RESTORE true
#define WINDOW_ALLOW_FULLSCREEN false
#define WINDOW_BORDERLESS false
#define WINDOW_DECORATIONS true
#define IDLE false
#define TARGET_FPS 60
#define CONFIG_FILE "palera1n.ini"
#define EMBED_ASSETS true
#define ASSETS_DIRECTORY "assets"
#define NORMAL_MODE 1
#define RECOVERY_MODE 2
#define DFU_MODE 3
#define NONE 4
#define PONGO_MODE 5
int palera1n(int argc, char *argv[]);
#endif
+14 -6
View File
@@ -61,11 +61,9 @@
#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 */
#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 */
#ifdef DEV_BUILD
#define palerain_option_test1 (1 << 29)
@@ -127,8 +125,18 @@ struct kpfinfo {
options = (checkrain_option_t)(options & ~option); \
} while (0);
static inline bool checkrain_options_enabled(checkrain_option_t flags, checkrain_option_t opt)
static inline bool checkrain_option_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;
}
+9 -5
View File
@@ -22,8 +22,14 @@
#define CMD_LEN_MAX 512
#define OVERRIDE_MAGIC 0xd803b376
#define palerain_option_case_version palerain_option_case(0)
#define palerain_option_case_force_revert palerain_option_case(1)
#define palerain_option_case_version palerain_option_case(0)
#define palerain_option_case_force_revert palerain_option_case(1)
#ifdef DEV_BUILD
#define palerain_option_case_ignore_ssv palerain_option_case(2)
#define palerain_option_case_force_fakefs palerain_option_case(3)
#define palerain_option_case_rootless_livefs palerain_option_case(4)
#endif
#ifdef USE_LIBUSB
#include <libusb-1.0/libusb.h>
@@ -100,8 +106,6 @@ 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
@@ -205,7 +209,7 @@ boyermoore_horspool_memmem(const unsigned char* haystack, size_t hlen,
const unsigned char* needle, size_t nlen);
extern void* pongo_usb_callback(stuff_t* arg);
extern void* pongo_usb_callback(void* 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(void);
+1 -1
View File
@@ -20,7 +20,7 @@
#define PI_STEP_CURRENT NEWT_COLORSET_CUSTOM(1)
#define PI_STEP_OTHER NEWT_COLORSET_CUSTOM(2)
#define CHECKBOX_STATE(flags, opt) checkrain_options_enabled(flags, opt) ? '*' : ' '
#define CHECKBOX_STATE(flags, opt) checkrain_option_enabled(flags, opt) ? '*' : ' '
typedef enum tui_screens {
ERROR_SCREEN = -1,
+2 -2
View File
@@ -8,8 +8,8 @@ Depends: usbmuxd
Section: Utilities
Priority: optional
Homepage: https://palera.in
Description: iOS 15.0-16.5 semi-tethered checkm8 jailbreak
palera1n is an iOS/iPadOS 15.0-16.5 semi tethered jailbreak
Description: iOS 15.0-16.4 semi-tethered checkm8 jailbreak
palera1n is an iOS/iPadOS 15.0-15.3.1 semi tethered jailbreak
based on the checkm8 exploit.
.
palera1n is able to jailbreak the device in fakefs-rootful mode,
+2 -2
View File
@@ -7,8 +7,8 @@ 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
Description: iOS 15.0-16.4 semi-tethered checkm8 jailbreak
palera1n is an iOS/iPadOS 15.0-15.3.1 semi tethered jailbreak
based on the checkm8 exploit.
.
palera1n is able to jailbreak the device in fakefs-rootful mode,
-27
View File
@@ -1,27 +0,0 @@
class Palera1n < Formula
desc "iOS 15.0-16.3.1 semi-tethered checkm8 jailbreak"
homepage "https://palera.in/"
url ""
version "2.0.0"
sha256 ""
license "MIT"
depends_on "cmake" => :build
depends_on "libimobiledevice" => :build
depends_on "libirecovery" => :build
depends_on "libusb" => :build
depends_on "libusbmuxd" => :build
depends_on "mbedtls" => :build
depends_on "pkg-config" => :build
depends_on "readline" => :build
def install
system "cmake", "."
system "make"
bin.install "output/palera1n" => "palera1n"
end
test do
system "false"
end
end
-6
View File
@@ -1,6 +0,0 @@
[Desktop Entry]
Name=palera1n
Exec=~/usr/local/bin
Icon=~/.palera1n/icon.ico
Terminal=false
Type=Application
@@ -1,6 +1,6 @@
From a2d012f3ba459f6debe636b576ad9aeab7b3c2aa Mon Sep 17 00:00:00 2001
From 632cdb6de3f1693fb90d60d81552b723e8dd5e84 Mon Sep 17 00:00:00 2001
From: Nick Chan <[email protected]>
Date: Sat, 27 May 2023 23:50:23 +0800
Date: Wed, 25 Jan 2023 01:53:00 +0800
Subject: [PATCH] Allow empty x509 cert issuer
---
@@ -8,24 +8,25 @@ 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 cf62532f2..ef25b3d77 100644
index 0eee97cb6..46702f683 100644
--- a/library/x509_crt.c
+++ b/library/x509_crt.c
@@ -1061,13 +1061,13 @@ static int x509_crt_parse_der_core(mbedtls_x509_crt *crt,
if ((ret = mbedtls_asn1_get_tag(&p, end, &len,
MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
- mbedtls_x509_crt_free(crt);
- return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);
+ /*mbedtls_x509_crt_free(crt);
+ return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);*/
@@ -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 ) );
}
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 -14
View File
@@ -56,12 +56,6 @@ BUILD_OPTIONS += TUI
CFLAGS += -DTUI
endif
ifeq ($(GUI),1)
CXXOBJECTS = gui_alerts.o gui_design.o gui_device.o gui_main.o
BUILD_OPTIONS += GUI
CFLAGS += -DGUI
endif
CHECKRA1N_VERSION ?= 0.1337.1
LIPO = lipo
LDID = ldid
@@ -131,15 +125,8 @@ xxd-%.c: %
%.o: %.c $(wildcard ../include/*.h)
$(CC) -c $(CFLAGS) $<
%.o: %.cpp $(wildcard ../include/*.h)
$(CXX) -c $(CXXFLAGS) $<
palera1n: $(OBJECTS)
ifeq ($(GUI),1)
$(CXX) $(LDFLAGS) $(OBJECTS) $(CXXOBJECTS) $(LIBS) -o palera1n
else
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $(LIBS) -o palera1n
endif
ifeq (,$(findstring macosx, $(CFLAGS)))
ifneq (,$(findstring version-min=, $(CFLAGS)))
$(LDID) -Susb.xml palera1n
@@ -153,7 +140,7 @@ checkra1n-kpf-pongo:
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/checkra1n-kpf-pongo
ramdisk.dmg:
curl -LO https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/jbinit_rootless/ramdisk.dmg
binpack.dmg:
curl -LO https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg
+3 -3
View File
@@ -1,7 +1,7 @@
#include <stdio.h>
#ifndef BAKERAIN_DEVELOPE_R
#define BAKERAIN_DEVELOPE_R "kok3shidoll"
#define BAKERAIN_DEVELOPE_R "dora2ios"
#endif
#define THE_PLUSH "Ploosh"
@@ -12,8 +12,8 @@
#define B stderr
#define L ,
#define E "# == palera1n-c == \n#\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 M "# Made by: Nick Chan, " THE_PLUSH ", Mineek, Nebula, llsc12\n#\n"
#define A "# Thanks to: " BAKERAIN_DEVELOPE_R ", pythonplayer, 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 )
+75 -78
View File
@@ -76,27 +76,27 @@ bool cpid_is_arm64(unsigned int cpid) {
* ========== 0x8960 ===========
* (ARM64) A7
*/
return (
cpid == 0x8960 || cpid == 0x7000 || cpid == 0x7001 ||
cpid == 0x8000 || cpid == 0x8001 || cpid == 0x8003 ||
cpid == 0x8010 || cpid == 0x8011 || cpid == 0x8012 ||
cpid == 0x8015
);
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;
}
int subscribe_cmd(usbmuxd_event_cb_t device_event_cb, irecv_device_event_cb_t irecv_event_cb)
{
int ret;
if ((ret = usbmuxd_events_subscribe(&usbmuxdctx, device_event_cb, NULL))) return ret;
if ((ret = irecv_device_event_subscribe(&irecvctx, irecv_event_cb, NULL))) return ret;
usbmuxd_events_subscribe(&usbmuxdctx, device_event_cb, NULL);
irecv_device_event_subscribe(&irecvctx, irecv_event_cb, NULL);
return 0;
}
int unsubscribe_cmd(void)
{
int ret;
if ((ret = usbmuxd_events_unsubscribe(usbmuxdctx))) return ret;
if ((ret = irecv_device_event_unsubscribe(irecvctx))) return ret;
usbmuxd_events_unsubscribe(usbmuxdctx);
irecv_device_event_unsubscribe(irecvctx);
irecvctx = NULL;
usbmuxdctx = NULL;
return 0;
@@ -119,15 +119,15 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
}
if (lockdownd_client_new(device, &lockdown, "palera1n") != LOCKDOWN_E_SUCCESS)
{
(void)idevice_free(device);
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)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
lockdownd_client_free(lockdown);
idevice_free(device);
LOG(LOG_ERROR, "Error getting ECID");
return -1;
}
@@ -137,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)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
lockdownd_client_free(lockdown);
idevice_free(device);
LOG(LOG_ERROR, "Error getting product type");
return -1;
}
@@ -148,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)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
lockdownd_client_free(lockdown);
idevice_free(device);
LOG(LOG_ERROR, "Error getting CPU type");
return -1;
}
@@ -159,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)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
lockdownd_client_free(lockdown);
idevice_free(device);
LOG(LOG_ERROR, "Error getting product version");
return -1;
}
@@ -170,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)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
lockdownd_client_free(lockdown);
idevice_free(device);
LOG(LOG_ERROR, "Error getting build version");
return -1;
}
plist_get_string_val(node, &buildVersion);
plist_free(node);
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
lockdownd_client_free(lockdown);
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;
}
@@ -209,22 +209,23 @@ int enter_recovery_cmd(const char* udid) {
LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret));
return -1;
}
ldret = lockdownd_enter_recovery(lockdown);
if (ldret == LOCKDOWN_E_SESSION_INACTIVE) {
lockdownd_client_free(lockdown);
lockdown = NULL;
ldret = lockdownd_client_new_with_handshake(device, &lockdown, "palera1n");
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);
}
if (ldret != LOCKDOWN_E_SUCCESS) {
LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret));
LOG(LOG_ERROR, "Could not trigger entering recovery mode: %s", lockdownd_strerror(ldret));
return -1;
}
ldret = lockdownd_enter_recovery(lockdown);
}
if (ldret != LOCKDOWN_E_SUCCESS) {
LOG(LOG_ERROR, "Could not trigger entering recovery mode: %s", lockdownd_strerror(ldret));
return -1;
}
lockdownd_client_free(lockdown);
lockdownd_client_free(lockdown);
} while (0);
idevice_free(device);
return 0;
}
@@ -241,8 +242,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.");
}
(void)diagnostics_relay_goodbye(diag);
(void)diagnostics_relay_client_free(diag);
diagnostics_relay_goodbye(diag);
diagnostics_relay_client_free(diag);
} else {
LOG(LOG_ERROR, "Could not connect to device.");
return -1;
@@ -301,9 +302,9 @@ int passstat_cmd(unsigned char* status, const char* udid) {
derr = diagnostics_relay_query_mobilegestalt(diagnostics_client, keys, &node);
plist_free(keys);
(void)diagnostics_relay_client_free(diagnostics_client);
(void)lockdownd_service_descriptor_free(service);
(void)idevice_free(dev);
diagnostics_relay_client_free(diagnostics_client);
lockdownd_service_descriptor_free(service);
idevice_free(dev);
if (derr != DIAGNOSTICS_RELAY_E_SUCCESS || !node)
{
@@ -321,7 +322,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);
@@ -348,16 +349,20 @@ 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) goto err;
if (err != IRECV_E_SUCCESS) {
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
return -1;
}
int mode = 0;
err = irecv_get_mode(client, &mode);
if (err != IRECV_E_SUCCESS) goto err;
irecv_get_mode(client, &mode);
char *ibootver = NULL;
err = irecv_getenv(client, "build-version", &ibootver);
if (err != IRECV_E_SUCCESS) goto err;
irecv_getenv(client, "build-version", &ibootver);
irecv_device_t device;
err = irecv_devices_get_device_by_client(client, &device);
if (err != IRECV_E_SUCCESS) goto err;
if (err != IRECV_E_SUCCESS) {
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
return -1;
}
info->mode = mode;
info->cpid = device->chip_id;
snprintf(info->product_type, 0x20, "%s", device->product_type);
@@ -366,41 +371,33 @@ 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) 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));
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));
return -1;
}
}
int exitrecv_cmd(const uint64_t ecid) {
irecv_client_t client = NULL;
irecv_error_t err = irecv_open_with_ecid(&client, ecid);
if (err != IRECV_E_SUCCESS) goto err;
err = irecv_setenv(client, "auto-boot", "true");
if (err != IRECV_E_SUCCESS) goto err;
err = irecv_saveenv(client);
if (err != IRECV_E_SUCCESS) goto err;
err = irecv_reboot(client);
if (err != IRECV_E_SUCCESS) goto err;
err = irecv_close(client);
if (err != IRECV_E_SUCCESS) goto err;
return 0;
err:
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
return -1;
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;
}
}
+80 -104
View File
@@ -36,20 +36,12 @@ int dfuhelper_thr_running = false;
void step(int time, int time2, char *text, bool (*cond)(uint64_t), uint64_t cond_arg) {
for (int i = time2; i < time; i++) {
printf(
checkrain_options_enabled(host_flags, host_option_no_colors)
? "\r\033[K%s (%d)"
: BCYN "\r\033[K%s (%d)" CRESET, text, time - i + time2
);
printf(checkrain_option_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(
checkrain_options_enabled(host_flags, host_option_no_colors)
? "\r%s (%d)"
: CYN "\r%s (%d)" CRESET, text, time2
);
printf(checkrain_option_enabled(host_flags, host_option_no_colors) ? "\r%s (%d)" : CYN "\r%s (%d)" CRESET, text, time2);
if (time2 == 0) puts("");
}
@@ -61,14 +53,13 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
LOG(LOG_ERROR, "Unable to get device information");
return 0;
}
if (strncmp(dev.CPUArchitecture, "arm64", strlen("arm64"))) {
if (strcmp(dev.CPUArchitecture, "arm64")) {
devinfo_free(&dev);
LOG(LOG_WARNING, "Ignoring non-arm64 device...");
LOG(LOG_WARNING, "palera1n doesn't and never will work on A12+ (arm64e)");
return -1;
}
if (!strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) {
if (!checkrain_options_enabled(host_flags, host_option_device_info))
if (!checkrain_option_enabled(host_flags, host_option_device_info))
LOG(LOG_VERBOSE2, "Product %s requires passcode to be disabled", dev.productType);
unsigned char passcode_state = 0;
ret = passstat_cmd(&passcode_state, usbmuxd_device->udid);
@@ -79,14 +70,14 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
}
if (passcode_state) {
LOG(LOG_ERROR, "Passcode must be disabled on this device");
if (!checkrain_options_enabled(host_flags, host_option_device_info))
if (!checkrain_option_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)) {
if (checkrain_option_enabled(host_flags, host_option_device_info)) {
printf("Mode: normal\n");
printf("ProductType: %s\n", dev.productType);
printf("Architecture: %s\n", dev.CPUArchitecture);
@@ -101,7 +92,7 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
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_options_enabled(host_flags, host_option_enter_recovery)) {
if (checkrain_option_enabled(host_flags, host_option_enter_recovery)) {
device_has_booted = true;
set_spin(0);
unsubscribe_cmd();
@@ -146,14 +137,17 @@ void* connected_recovery_mode(struct irecv_device_info* info) {
return NULL;
}
printf("\r\033[K");
if (NOHOME) {
bool nohome = NOHOME;
if (nohome)
step(2, 0, "Hold volume down + side button", NULL, 0);
step(10, 0, "Hold volume down button", conditional, ecid);
} else {
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) {
if (get_ecid_wait_for_dfu() != ecid) {
} else {
LOG(LOG_WARNING, "Whoops, device did not enter DFU mode");
LOG(LOG_INFO, "Waiting for device to reconnect...");
set_ecid_wait_for_dfu(0);
@@ -181,15 +175,13 @@ void device_event_cb(const usbmuxd_event_t *event, void* userdata) {
switch (event->event) {
case UE_DEVICE_ADD:
LOG(LOG_VERBOSE, "Normal mode device connected");
if (checkrain_options_enabled(host_flags, host_option_exit_recovery)) {
if (checkrain_option_enabled(host_flags, host_option_exit_recovery)) {
break;
} 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();
}
} 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();
pthread_exit(NULL);
break;
}
@@ -203,85 +195,69 @@ 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) {
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);
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_option_enabled(host_flags, host_option_device_info))
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;
}
break;
if (checkrain_option_enabled(host_flags, host_option_device_info)) {
recvinfo_t info;
recvinfo_cmd(&info, event->device_info->ecid);
printf("Mode: recovery\n");
printf("ProductType: %s\n", info.product_type);
printf("DisplayName: %s\n", info.display_name);
device_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) {
if (!checkrain_option_enabled(host_flags, host_option_device_info))
LOG(LOG_VERBOSE, "DFU mode device %ld connected", event->device_info->ecid);
if (checkrain_option_enabled(host_flags, host_option_device_info)) {
recvinfo_t info;
recvinfo_cmd(&info, event->device_info->ecid);
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_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)) {
break;
}
pthread_create(&dfu_thread, NULL, (void* (*)(void*))connected_dfu_mode, event->device_info);
}
break;
case IRECV_DEVICE_REMOVE:
LOG(LOG_VERBOSE, "Recovery mode device disconnected");
break;
+3 -3
View File
@@ -126,11 +126,11 @@ int exec_checkra1n(void) {
#endif
checkra1n_exec: {};
char args[0x10] = "-E";
if (checkrain_options_enabled(host_flags, host_option_demote)) strncat(args, "d", 0xf);
if (!checkrain_options_enabled(host_flags, palerain_option_checkrain_is_clone)) {
if (checkrain_option_enabled(host_flags, host_option_demote)) strncat(args, "d", 0xf);
if (!checkrain_option_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);
if (checkrain_option_enabled(host_flags, host_option_no_colors)) strncat(args, "n", 0xf);
} else {
strncat(args, "R", 0xf);
}
-67
View File
@@ -1,67 +0,0 @@
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <gui.h>
// 50/50 chance this will be removed for in-window alerts
#if __APPLE__
#include <CoreFoundation/CoreFoundation.h>
#define IDOK 1
#define IDCANCEL 2
#define AL kCFUserNotificationNoteAlertLevel
#elif _WIN32
#include <windows.h>
#include <winuser.h>
#elif __linux__
// #include <gtk/gtk.h>
#elif BSD
#elif __ANDROID__
#else
#endif
void send_alert(const char *title, const char *msg) {
#if __APPLE__
CFStringRef header_ref = CFStringCreateWithCString(NULL, title, strlen(title));
CFStringRef message_ref = CFStringCreateWithCString(NULL, msg, strlen(msg));
// CFStringRef url_ref = CFStringCreateWithCString( NULL, "", strlen("") );
CFURLRef icon_ref = CFURLCreateWithString(kCFAllocatorDefault, NULL, NULL);
CFOptionFlags result;
CFUserNotificationDisplayAlert(0, AL, icon_ref, NULL, NULL, header_ref, message_ref, NULL, NULL, NULL, &result);
CFRelease(header_ref);
CFRelease(message_ref);
#elif _WIN32
MessageBox(0, msg, title, MB_OK);
#elif __linux__
char line[256];
FILE *fp;
fp=popen("zenity --version","r");
if (fp==NULL) {
perror("Pipe returned a error");
} else {
while (fgets(line,sizeof(line),fp)) printf("%s",line);
pclose(fp);
}
char *str_msg = (char*)malloc(40+strlen(title)+strlen(msg)+1);
sprintf(str_msg, "zenity --info --title '%s' --text '%s'", title, msg);
fp=popen(str_msg, "r");
if (fp==NULL) {
perror("Pipe returned a error");
} else {
printf("Exit code: %i\n",WEXITSTATUS(pclose(fp)));
}
#elif BSD
#elif __ANDROID__
#else
#endif
}
-372
View File
@@ -1,372 +0,0 @@
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include <stdarg.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <hello_imgui/hello_imgui.h>
#include <imgui/imgui_internal.h>
#include <common.h>
#include <design.h>
/* ----------------- [ Animation Varibles ] ----------------- */
float btn_w = 0.0f;
float btn_h = 0.0f;
float btn_x = 0.0f;
float btn_y = 0.0f;
float box_w = 0.0f;
float box_h = 0.0f;
float box_x = 0.0f;
float box_y = 0.0f;
/* ----------------- [ UI Init/Reset ] ----------------- */
void init_colors() {
auto &colors = ImGui::GetStyle().Colors;
colors[ImGuiCol_WindowBg] = ImVec4{0.21f, 0.23f, 0.31f, 1.0f};
colors[ImGuiCol_MenuBarBg] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
// Border
colors[ImGuiCol_Border] = ImVec4{0.44f, 0.37f, 0.61f, 0.0f};
colors[ImGuiCol_BorderShadow] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
// Text
colors[ImGuiCol_Text] = ImVec4{1.0f, 1.0f, 1.0f, 1.0f};
colors[ImGuiCol_TextDisabled] = ImVec4{0.5f, 0.5f, 0.5f, 1.0f};
// Headers
colors[ImGuiCol_Header] = ImVec4{0.13f, 0.13f, 0.17, 1.0f};
colors[ImGuiCol_HeaderHovered] = ImVec4{0.19f, 0.2f, 0.25f, 1.0f};
colors[ImGuiCol_HeaderActive] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
// Buttons
colors[ImGuiCol_Button] = ImVec4{0.9f, 0.9f, 0.9f, 1.0f};
colors[ImGuiCol_ButtonHovered] = ImVec4{0.9f, 0.9f, 0.9f, 1.0f};
colors[ImGuiCol_ButtonActive] = ImVec4{0.9f, 0.9f, 0.9f, 1.0f};
colors[ImGuiCol_CheckMark] = ImVec4{0.9f, 0.9f, 0.9f, 1.0f};
// Popups
colors[ImGuiCol_PopupBg] = ImVec4{0.1f, 0.1f, 0.13f, 0.92f};
// Slider
colors[ImGuiCol_SliderGrab] = ImVec4{0.44f, 0.37f, 0.61f, 0.54f};
colors[ImGuiCol_SliderGrabActive] = ImVec4{0.74f, 0.58f, 0.98f, 0.54f};
// Frame BG
colors[ImGuiCol_FrameBg] = ImVec4{0.13f, 0.13f, 0.15f, 0.7f};
colors[ImGuiCol_FrameBgHovered] = ImVec4{0.13f, 0.13f, 0.15f, 0.7f};
colors[ImGuiCol_FrameBgActive] = ImVec4{0.13f, 0.13f, 0.15f, 0.7f};
// Tabs
colors[ImGuiCol_Tab] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_TabHovered] = ImVec4{0.24, 0.24f, 0.32f, 1.0f};
colors[ImGuiCol_TabActive] = ImVec4{0.2f, 0.22f, 0.27f, 1.0f};
colors[ImGuiCol_TabUnfocused] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_TabUnfocusedActive] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
// Title
colors[ImGuiCol_TitleBg] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_TitleBgActive] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_TitleBgCollapsed] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
// Scrollbar
colors[ImGuiCol_ScrollbarBg] = ImVec4{0.1f, 0.1f, 0.13f, 1.0f};
colors[ImGuiCol_ScrollbarGrab] = ImVec4{0.16f, 0.16f, 0.21f, 1.0f};
colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4{0.19f, 0.2f, 0.25f, 1.0f};
colors[ImGuiCol_ScrollbarGrabActive] = ImVec4{0.24f, 0.24f, 0.32f, 1.0f};
// Seperator
colors[ImGuiCol_Separator] = ImVec4{0.44f, 0.37f, 0.61f, 1.0f};
colors[ImGuiCol_SeparatorHovered] = ImVec4{0.74f, 0.58f, 0.98f, 1.0f};
colors[ImGuiCol_SeparatorActive] = ImVec4{0.84f, 0.58f, 1.0f, 1.0f};
// Resize Grip
colors[ImGuiCol_ResizeGrip] = ImVec4{0.44f, 0.37f, 0.61f, 0.29f};
colors[ImGuiCol_ResizeGripHovered] = ImVec4{0.74f, 0.58f, 0.98f, 0.29f};
colors[ImGuiCol_ResizeGripActive] = ImVec4{0.84f, 0.58f, 1.0f, 0.29f};
// Docking
colors[ImGuiCol_DockingPreview] = ImVec4{0.44f, 0.37f, 0.61f, 1.0f};
}
void init_style() {
auto &style = ImGui::GetStyle();
style.TabRounding = 0;
style.ScrollbarRounding = 0;
style.WindowRounding = 0;
style.GrabRounding = 0;
style.FrameRounding = 20;
style.PopupRounding = 0;
style.ChildRounding = 0;
}
void reset_design() {
ImGui::SetCursorPos(ImVec2(0, 0));
init_colors();
init_style();
}
void reset_views() {
waiting_for_device = false;
unsupported_device = false;
supported_device = false;
recovery_wait = false;
jailbreak = false;
enter_dfu = false;
dfu_helper = false;
}
/* ----------------- [ UI Element Styles ] ----------------- */
void image_btn_style() {
auto &colors = ImGui::GetStyle().Colors;
colors[ImGuiCol_Button] = ImVec4{1.0f, 1.0f, 1.0f, 1.0f};
colors[ImGuiCol_ButtonHovered] = ImVec4{0.95f, 0.95f, 0.95f, 1.0f};
colors[ImGuiCol_ButtonActive] = ImVec4{0.95f, 0.95f, 0.95f, 1.0f};
colors[ImGuiCol_CheckMark] = ImVec4{0.95f, 0.95f, 0.95f, 1.0f};
colors[ImGuiCol_Text] = ImVec4{0.1f, 0.1f, 0.1f, 1.0f};
}
void image_btn_style_alt() {
auto &colors = ImGui::GetStyle().Colors;
colors[ImGuiCol_Button] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
colors[ImGuiCol_ButtonHovered] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
colors[ImGuiCol_ButtonActive] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
colors[ImGuiCol_CheckMark] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
colors[ImGuiCol_Text] = ImVec4{0.0f, 0.0f, 0.0f, 0.0f};
}
/* ----------------- [ IDK Anymore ] ----------------- */
std::string addstr2(const char *str1, const char *str2) {
size_t str1_len = strlen(str1);
size_t str2_len = strlen(str2);
int buf_size = (int)str1_len + (int)str2_len + 1;
char buffer[buf_size];
sprintf(buffer, str1, str2);
return buffer;
}
std::string addstr3(const char *str1, const char *str2, const char *str3) {
size_t str1_len = strlen(str1);
size_t str2_len = strlen(str2);
size_t str3_len = strlen(str3);
int buf_size = (int)str1_len + (int)str2_len + (int)str3_len + 1;
char buffer[buf_size];
sprintf(buffer, str1, str2, str3);
return buffer;
}
std::string addstr4(const char *str1, const char *str2, const char *str3, const char *str4) {
size_t str1_len = strlen(str1);
size_t str2_len = strlen(str2);
size_t str3_len = strlen(str3);
size_t str4_len = strlen(str4);
int buf_size = (int)str1_len + (int)str2_len + (int)str3_len + (int)str4_len + 1;
char buffer[buf_size];
sprintf(buffer, str1, str2, str3, str4);
return buffer;
}
/* ----------------- [ UI Colors ] ----------------- */
ImVec4 hex_color(int hex, float alpha) {
float r = ((hex >> 16) & 0xFF) / 255.0f;
float g = ((hex >> 8) & 0xFF) / 255.0f;
float b = ((hex) & 0xFF) / 255.0f;
return ImVec4{r, g, b, alpha};
}
ImColor hex_imcolor(int hex, float alpha) {
float r = ((hex >> 16) & 0xFF) / 255.0f;
float g = ((hex >> 8) & 0xFF) / 255.0f;
float b = ((hex) & 0xFF) / 255.0f;
return ImColor{r, g, b, alpha};
}
/* ----------------- [ UI Element States ] ----------------- */
bool is_hovered(const char* id, int w, int h) {
ImGuiContext& g = *GImGui;
ImGuiWindow* window = ImGui::GetCurrentWindow();
ImGuiID btn_id = window->GetID(id);
const ImRect bb(window->DC.CursorPos, ImVec2(window->DC.CursorPos.x + w, window->DC.CursorPos.x + h));
bool hovered = false;
ImGui::ButtonBehavior(bb,btn_id,&hovered,NULL);
return hovered;
}
bool is_pressed(const char* id, int w, int h) {
ImGuiContext& g = *GImGui;
ImGuiWindow* window = ImGui::GetCurrentWindow();
ImGuiID btn_id = window->GetID(id);
const ImRect bb(window->DC.CursorPos, ImVec2(window->DC.CursorPos.x + w, window->DC.CursorPos.x + h));
bool pressed = false;
ImGui::ButtonBehavior(bb,btn_id,NULL,&pressed);
return pressed;
}
/* ----------------- [ Common UI Types ] ----------------- */
void label(const char *text, ImVec2 location, ImVec4 color, int font) {
auto &style = ImGui::GetStyle();
ImGuiIO &io = ImGui::GetIO();
ImGui::SetCursorPos(location);
ImGui::PushFont(io.Fonts->Fonts[font]);
auto &colors = ImGui::GetStyle().Colors;
colors[ImGuiCol_Text] = color;
ImGui::Text(text);
ImGui::PopFont();
reset_design();
}
void draw_box(ImVec2 location, ImVec2 size, ImVec4 color, float radius) {
auto &colors = ImGui::GetStyle().Colors;
auto &style = ImGui::GetStyle();
float temp_rounding = style.FrameRounding;
ImVec4 temp_color_idle = colors[ImGuiCol_FrameBg];
ImVec4 temp_color_hover = colors[ImGuiCol_FrameBgHovered];
ImVec4 temp_color_active = colors[ImGuiCol_FrameBgActive];
style.FrameRounding = radius;
colors[ImGuiCol_FrameBg] = color;
colors[ImGuiCol_FrameBgHovered] = color;
colors[ImGuiCol_FrameBgActive] = color;
ImGui::SetCursorPos(location);
ImGui::ProgressBar(0.0f, size, "");
style.FrameRounding = temp_rounding;
colors[ImGuiCol_FrameBg] = temp_color_idle;
colors[ImGuiCol_FrameBgHovered] = temp_color_hover;
colors[ImGuiCol_FrameBgActive] = temp_color_active;
}
/* ----------------- [ Animation Systems ] ----------------- */
void anim_btn(const char* id, ImVec2 size, ImVec2 size_to, ImVec2 pos, ImVec2 pos_to) {
ImGuiIO &io = ImGui::GetIO();
float global = 25.0f;
bool new_w_positive,new_h_positive,new_x_positive,new_y_positive = false;
float new_w,new_h,new_x,new_y = 0.0f;
float lrg_size,lrg_pos,lrg = 0.0f;
if (size.x > size_to.x) {new_w = size.x - size_to.x; new_w_positive = false;}
else {new_w = size_to.x - size.x; new_w_positive = true;}
if (size.y > size_to.y) {new_h = size.y - size_to.y; new_h_positive = false;}
else {new_h = size_to.y - size.y;new_h_positive = true;}
if (pos.x > pos_to.x) {new_x = pos.x - pos_to.x; new_x_positive = false;}
else {new_x = pos_to.x - pos.x;new_x_positive = true;}
if (pos.y > pos_to.y) {new_y = pos.y - pos_to.y; new_y_positive = false;}
else {new_y = pos_to.y - pos.y;new_y_positive = true;}
if (new_w > new_h) lrg_size = new_w;
else lrg_size = new_h;
if (new_x > new_y) lrg_pos = new_x;
else lrg_pos = new_y;
if (lrg_size > lrg_pos) lrg = lrg_size;
else lrg = lrg_pos;
if (new_w_positive) {if (btn_w < size_to.x) btn_w += (new_w / lrg) * global * io.DeltaTime;}
else {if (btn_w > size_to.x) btn_w -= (new_w / lrg) * global * io.DeltaTime;}
if (new_h_positive) {if (btn_h < size_to.y) btn_h += (new_h / lrg) * global * io.DeltaTime;}
else {if (btn_h > size_to.y) btn_h -= (new_h / lrg) * global * io.DeltaTime;}
if (new_x_positive) {if (btn_x < pos_to.x) btn_x += (new_x / lrg) * global * io.DeltaTime;}
else {if (btn_x > pos_to.x) btn_x -= (new_x / lrg) * global * io.DeltaTime;}
if (new_y_positive) {if (btn_y < pos_to.y) btn_y += (new_y / lrg) * global * io.DeltaTime;}
else {if (btn_y > pos_to.y) btn_y -= (new_y / lrg) * global * io.DeltaTime;}
}
void anim_box(const char* id, ImVec2 size, ImVec2 size_to, ImVec2 pos, ImVec2 pos_to) {
ImGuiIO &io = ImGui::GetIO();
float global = 500.0f;
bool new_w_positive,new_h_positive,new_x_positive,new_y_positive = false;
float new_w,new_h,new_x,new_y = 0.0f;
float lrg_size,lrg_pos,lrg = 0.0f;
if (size.x > size_to.x) {new_w = size.x - size_to.x; new_w_positive = false;}
else {new_w = size_to.x - size.x; new_w_positive = true;}
if (size.y > size_to.y) {new_h = size.y - size_to.y; new_h_positive = false;}
else {new_h = size_to.y - size.y;new_h_positive = true;}
if (pos.x > pos_to.x) {new_x = pos.x - pos_to.x; new_x_positive = false;}
else {new_x = pos_to.x - pos.x;new_x_positive = true;}
if (pos.y > pos_to.y) {new_y = pos.y - pos_to.y; new_y_positive = false;}
else {new_y = pos_to.y - pos.y;new_y_positive = true;}
if (new_w > new_h) lrg_size = new_w;
else lrg_size = new_h;
if (new_x > new_y) lrg_pos = new_x;
else lrg_pos = new_y;
if (lrg_size > lrg_pos) lrg = lrg_size;
else lrg = lrg_pos;
if (new_w_positive) {if (box_w < size_to.x) box_w += (new_w / lrg) * global * io.DeltaTime;}
else {if (box_w > size_to.x) box_w -= (new_w / lrg) * global * io.DeltaTime;}
if (new_h_positive) {if (box_h < size_to.y) box_h += (new_h / lrg) * global * io.DeltaTime;}
else {if (box_h > size_to.y) box_h -= (new_h / lrg) * global * io.DeltaTime;}
if (new_x_positive) {if (box_x < pos_to.x) box_x += (new_x / lrg) * global * io.DeltaTime;}
else {if (box_x > pos_to.x) box_x -= (new_x / lrg) * global * io.DeltaTime;}
if (new_y_positive) {if (box_y < pos_to.y) box_y += (new_y / lrg) * global * io.DeltaTime;}
else {if (box_y > pos_to.y) box_y -= (new_y / lrg) * global * io.DeltaTime;}
}
static inline ImVec2 operator+(const ImVec2 &lhs, const ImVec2 &rhs) {
return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y);
}
void ImageRotated(ImTextureID tex_id, ImVec2 center, ImVec2 size, float angle) {
ImDrawList *draw_list = ImGui::GetWindowDrawList();
float cos_a = cosf(angle);
float sin_a = sinf(angle);
ImVec2 pos[4] = {
center + ImRotate(ImVec2(-size.x * 0.5f, -size.y * 0.5f), cos_a, sin_a),
center + ImRotate(ImVec2(+size.x * 0.5f, -size.y * 0.5f), cos_a, sin_a),
center + ImRotate(ImVec2(+size.x * 0.5f, +size.y * 0.5f), cos_a, sin_a),
center + ImRotate(ImVec2(-size.x * 0.5f, +size.y * 0.5f), cos_a, sin_a)};
ImVec2 uvs[4] = {
ImVec2(0.0f, 0.0f),
ImVec2(1.0f, 0.0f),
ImVec2(1.0f, 1.0f),
ImVec2(0.0f, 1.0f)};
draw_list->AddImageQuad(tex_id, pos[0], pos[1], pos[2], pos[3], uvs[0], uvs[1], uvs[2], uvs[3], IM_COL32_WHITE);
}
void rotate_image(const char *image, ImVec2 pos, ImVec2 size, float angle, float speed) {
ImGuiIO &io = ImGui::GetIO();
ImTextureID image_texture = HelloImGui::ImTextureIdFromAsset(image);
static float image_angle = angle;
image_angle += io.DeltaTime * speed;
ImVec2 image_center = ImVec2(pos.x, pos.y);
ImGui::SetCursorPos(pos);
ImageRotated(image_texture, image_center, size, image_angle);
}
-133
View File
@@ -1,133 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdbool.h>
#include <unistd.h>
#include <ctype.h>
#include <libimobiledevice/libimobiledevice.h>
#include <libimobiledevice/lockdown.h>
#include <libimobiledevice/diagnostics_relay.h>
#include <plist/plist.h>
#include <libirecovery.h>
#include <usbmuxd.h>
#include <common.h>
extern "C" {
#include <palerain.h>
#include <gui.h>
}
/*
This will all be removed and merged
into devhelper.c and dfuhelper.c
later on, so for now it stays ig
*/
irecv_device_event_context_t irecvctx_gui = NULL;
usbmuxd_subscription_context_t usbmuxdctx_gui = NULL;
int device_status = DISCONNECTED;
devinfo_t dev;
char const *udid_gui;
int connected_normal_mode_gui(const usbmuxd_device_info_t *usbmuxd_device) {
int ret;
ret = devinfo_cmd(&dev, usbmuxd_device->udid);
if (ret != 0) {
LOG(LOG_ERROR, "Unable to get device information");
return 0;
}
udid_gui = usbmuxd_device->udid;
device_status = NORMAL;
if (strcmp(dev.CPUArchitecture, "arm64")) {
LOG(LOG_WARNING, "Ignoring non-arm64 device...");
return -1;
}
if (!strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) {
if (!checkrain_option_enabled(host_flags, host_option_device_info))
LOG(LOG_VERBOSE2, "Product %s requires passcode to be disabled", dev.productType);
unsigned char passcode_state = 0;
ret = passstat_cmd(&passcode_state, usbmuxd_device->udid);
if (ret != 0) {
LOG(LOG_ERROR, "Failed to get passcode state");
devinfo_free(&dev);
return -1;
}
if (passcode_state) {
LOG(LOG_ERROR, "Passcode must be disabled on this device");
if (!checkrain_option_enabled(host_flags, host_option_device_info))
LOG(LOG_ERROR, "Additionally, passcode must never be set since restore on iOS 16+");
devinfo_free(&dev);
return -1;
}
}
}
void device_event_cb_gui(const usbmuxd_event_t *event, void* userdata) {
if (event->device.conn_type != CONNECTION_TYPE_USB) return;
switch (event->event) {
case UE_DEVICE_ADD:
fprintf(stderr, "Normal mode device connected\n");
connected_normal_mode_gui(&event->device);
break;
case UE_DEVICE_REMOVE:
fprintf(stderr, "Normal mode device disconnected\n");
device_status = DISCONNECTED;
devinfo_free(&dev);
if (supported_device || unsupported_device) {
supported_device = false;
unsupported_device = false;
waiting_for_device = true;
}
break;
}
}
void irecv_device_event_cb_gui(const irecv_device_event_t *event, void* userdata) {
switch(event->type) {
case IRECV_DEVICE_ADD:
if (event->mode == IRECV_K_RECOVERY_MODE_1 || event->mode == IRECV_K_RECOVERY_MODE_2 || event->mode == IRECV_K_RECOVERY_MODE_3 || event->mode == IRECV_K_RECOVERY_MODE_4) {
fprintf(stderr, "Recovery mode device %llu connected\n", event->device_info->ecid);
recvinfo_t info;
recvinfo_cmd(&info, event->device_info->ecid);
printf("Mode: recovery\n");
printf("ProductType: %s\n", info.product_type);
printf("DisplayName: %s\n", info.display_name);
device_status = RECOVERY;
if (waiting_for_device) {
device_status = RECOVERY;
exitrecv_cmd(event->device_info->ecid);
send_alert("Device in Recovery", "Exiting recovery, device must start from normal mode.");
}
} else if (event->mode == IRECV_K_DFU_MODE) {
device_status == DFU;
fprintf(stderr, "DFU mode device %llu connected\n", event->device_info->ecid);
}
break;
case IRECV_DEVICE_REMOVE:
fprintf(stderr, "Recovery mode device disconnected\n");
device_status = DISCONNECTED;
if (enter_dfu) {
device_status = DISCONNECTED;
enter_dfu = false;
waiting_for_device = true;
}
break;
}
}
void dfuhelper() {
subscribe_cmd(device_event_cb_gui, irecv_device_event_cb_gui);
}
void guifree() {
devinfo_free(&dev);
unsubscribe_cmd();
}
-350
View File
@@ -1,350 +0,0 @@
#include <thread>
#include <iostream>
#include <math.h>
#include<unistd.h>
#include <imgui/imgui_internal.h>
#include <hello_imgui/hello_imgui.h>
#include <hello_imgui/app_window_params.h>
#include <design.h>
#include <common.h>
extern "C" {
#include <gui.h>
}
/* Bools for which view to show */
bool waiting_for_device = true;
bool unsupported_device = false;
bool supported_device = false;
bool recovery_wait = false;
bool jailbreak = false;
bool enter_dfu = false;
bool dfu_helper = false;
bool settings = false;
bool execjb = false;
uint64_t ms() {
using namespace std::chrono;
return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}
/* ----------------- [ Main Function ] ----------------- */
int main(int argc, char *argv[]) {
if (argc >= 2) {
// temp for testing
return palera1n(argc, argv);
}
dfuhelper();
/* Vars for DFU Healper */
int dfu_step1 = 3;
int dfu_step2 = 5;
int dfu_step3 = 10;
bool dfu_done = false;
bool set_ms = true;
auto desired = ms() + 1000;
/* HelloImGui Stuff */
HelloImGui::RunnerParams params;
params.fpsIdling.fpsIdle = 60.f;
params.appWindowParams.borderless = false;
params.appWindowParams.resizable = false;
params.appWindowParams.windowGeometry.size = {550, 300};
params.appWindowParams.windowTitle = "palera1n";
params.appWindowParams.restorePreviousGeometry = false;
params.imGuiWindowParams.defaultImGuiWindowType = HelloImGui::DefaultImGuiWindowType::NoDefaultWindow;
/* Color & Size Stuff */
bool open = true;
ImColor grad_color_left = ImColor(255, 177, 35);
ImColor grad_color_right = ImColor(4, 121, 168);
int grad_color_left_r = 255;
float text_alpha = 0.0f;
bool reverse_gradient = false;
/* ImGui Loop */
params.callbacks.ShowGui = [&]() {
{
/* Init colors, style, and fonts */
auto &colors = ImGui::GetStyle().Colors;
auto &style = ImGui::GetStyle();
ImGuiIO &io = ImGui::GetIO();
init_colors();
init_style();
/* Init window size and start ImGui */
ImGui::SetNextWindowSize(ImVec2(560, 300));
ImGui::SetNextWindowPos(ImVec2(-5, 0));
ImGui::Begin("palera1n", &open, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar);
/* Set our background gradient */
ImGui::SetCursorPos(ImVec2(0, 0));
ImGuiWindow* window = ImGui::GetCurrentWindow();
if (!reverse_gradient) grad_color_left_r -= FLOAT_TO_INT(io.DeltaTime * 100.f) /2;
else grad_color_left_r += FLOAT_TO_INT(io.DeltaTime * 100.f) /2;
if (grad_color_left_r <= 140) reverse_gradient = true;
if (grad_color_left_r >= 255) reverse_gradient = false;
grad_color_left = ImColor(135, 63, grad_color_left_r) ;
grad_color_right = ImColor(4, 160, grad_color_left_r) ;
auto dl(ImGui::GetWindowDrawList());
dl->AddRectFilledMultiColor(ImVec2(0, 0), // pos - x y
ImVec2(560, 300), // size - width height
grad_color_left, // color top left
hex_imcolor(0x2390b4, 1.0f), // color
hex_imcolor(0x04c2a8, 1.0f), // color
grad_color_right); // color
if (!recovery_wait && !dfu_helper && !jailbreak) {
ImTextureID settings_icon = HelloImGui::ImTextureIdFromAsset("s60.png"); // pngs will be embedded soon
ImTextureID about_icon = HelloImGui::ImTextureIdFromAsset("i60.png"); // pngs will be embedded soon
image_btn_style_alt();
ImGui::SetCursorPos(ImVec2(455, 245));
ImGui::ImageButton(about_icon, ImVec2(33.0f, 33.0f));
ImGui::SetCursorPos(ImVec2(500, 245));
ImGui::ImageButton(settings_icon, ImVec2(33.0f, 33.0f));
reset_design();
}
/* Waiting for device view */
if (waiting_for_device) {
if (device_status == NORMAL) {
const char *name = dev.displayName;
char *arch = dev.CPUArchitecture;
char *type = dev.productType;
char *version = dev.productVersion;
if (strcmp("arm64", arch) != 0) {
waiting_for_device = false;
unsupported_device = true;
btn_x = 213.0f;
btn_y = 190.0f;
btn_w = 125.0f;
btn_h = 35.0f;
} else if (strstr(version, "15") != 0 || strstr(version, "16") != 0) {
waiting_for_device = false;
supported_device = true;
btn_x = 213.0f;
btn_y = 190.0f;
btn_w = 125.0f;
btn_h = 35.0f;
}
}
box_x = 55.0f; box_y = 75.0f; box_w = 450.0f; box_h = 150.0f;
draw_box(pos(55, 75), size(450, 150), hex_color(0x000000, 0.25f), 20.0f); // box in center
rotate_image("spinner.png", pos(95, 150), size(40, 40), 0.0f, 4.0f); // loading anim in box
label("Waiting for connection...", pos(135,122), WHITE, SF_BoldLarge); // Large title
label("Connect your device in normal mode to get started!", pos(138, 157), WHITE, SF_Reg); // Sub title
/* Unsupported device view */
} else if (unsupported_device) {
anim_box("Jailbreak", ImVec2(450,150),ImVec2(300,200),ImVec2(54,75),ImVec2(129,50));
draw_box(ImVec2(box_x, box_y),ImVec2(box_w, box_h), hex_color(0x000000, 0.25f), 20.0f);
set_pos(167, 90); font(SF_Bold);
ImGui::Text("%s", dev.displayName);
ImGui::PopFont();
set_pos(167, 120); font(SF_RegMed);
ImGui::Text("%s running iOS %s (%s)", dev.productType, dev.productVersion, dev.CPUArchitecture);
colors[ImGuiCol_Text] = hex_color(0xEB5160, 1.0f);
set_pos(167, 147); ImGui::Text(ICON_FA_BAN);
colors[ImGuiCol_Text] = hex_color(0xFFFFFF, 1.0f);
ImGui::SameLine(); ImGui::Text("Unsupported device connected");
ImGui::PopFont();
set_pos(213, 190); font(SF_RoundBold); btn_text_on;
bool hovered = is_hovered("Exit", 125, 35);
bool pressed = is_pressed("Exit", 125, 35);
ImVec2 btn_size = ImVec2(120, 30);
if (hovered) {
anim_btn("Exit", ImVec2(125,35),ImVec2(127,37),ImVec2(213,190),ImVec2(212,189));
btn_size = ImVec2(btn_w, btn_h);
ImGui::SetCursorPos(ImVec2(btn_x,btn_y));
} else {
anim_btn("Exit", ImVec2(127,37),ImVec2(125,35),ImVec2(212,189),ImVec2(213,190));
btn_size = ImVec2(btn_w, btn_h);
ImGui::SetCursorPos(ImVec2(btn_x,btn_y));
}
ImGui::Button("Exit", btn_size);
if (pressed) {
exit(0);
}
/* Supported device view */
} else if (supported_device) {
anim_box("Jailbreak", ImVec2(450,150),ImVec2(300,200),ImVec2(54,75),ImVec2(129,50));
draw_box(ImVec2(box_x, box_y),ImVec2(box_w, box_h), hex_color(0x000000, 0.25f), 20.0f);
set_pos(167, 90); font(SF_Bold);
ImGui::Text("%s", dev.displayName);
ImGui::PopFont();
set_pos(167, 120); font(SF_RegMed);
ImGui::Text("%s running iOS %s (%s)", dev.productType, dev.productVersion, dev.CPUArchitecture);
colors[ImGuiCol_Text] = hex_color(0x3CFF55, 1.0f);
set_pos(167, 147); ImGui::Text(ICON_FA_CHECK_CIRCLE);
colors[ImGuiCol_Text] = hex_color(0xFFFFFF, 1.0f);
ImGui::SameLine(); ImGui::Text("Connected and ready.");
ImGui::PopFont();
set_pos(213, 190); font(SF_RoundBold); btn_text_on;
bool hovered = is_hovered("Jailbreak", 125, 35);
bool pressed = is_pressed("Jailbreak", 125, 35);
ImVec2 btn_size = ImVec2(120, 30);
if (hovered) {
anim_btn("Jailbreak", ImVec2(125,35),ImVec2(127,37),ImVec2(213,190),ImVec2(212,189));
btn_size = ImVec2(btn_w, btn_h);
ImGui::SetCursorPos(ImVec2(btn_x,btn_y));
} else {
anim_btn("Jailbreak", ImVec2(127,37),ImVec2(125,35),ImVec2(212,189),ImVec2(213,190));
btn_size = ImVec2(btn_w, btn_h);
ImGui::SetCursorPos(ImVec2(btn_x,btn_y));
}
ImGui::Button("Jailbreak", btn_size);
if (pressed) {
enter_recovery_cmd(0);
box_x = 140.0f; box_y = 55.0f; box_w = 320.0f; box_h = 240.0f;
supported_device = false;
recovery_wait = true;
btn_text_off;
ImGui::PopFont();
}
/* Waiting for recovery view */
} else if (recovery_wait) {
draw_box(ImVec2(125, 105),ImVec2(300, 90), hex_color(0x000000, 0.25f), 20.0f);
//ImageRotated(loader, ImVec2(160, 150), ImVec2(40.0f, 40.0f), angle);
set_pos(210, 138); font(SF_Bold);
ImGui::Text("Entering recovery...");
ImGui::PopFont();
if (device_status == RECOVERY) {
recovery_wait = false;
enter_dfu = true;
}
/* Ready for DFU view */
} else if (enter_dfu) {
draw_box(ImVec2(65, 105),ImVec2(450, 90), hex_color(0x000000, 0.25f), 20.0f);
set_pos(110, 128); font(SF_Bold);
ImGui::Text("Time to enter DFU mode!");
ImGui::PopFont();
set_pos(110, 153); font(SF_Reg);
ImGui::Text("Locate the power and volume down button before you proceed.");
set_pos(108, 210); font(SF_Sm_Bold); btn_text_on;
if (ImGui::Button("Start", ImVec2(125, 35))) {
enter_dfu = false;
dfu_helper = true;
btn_text_off;
ImGui::PopFont();
}
/* DFU helper view */
} else if (dfu_helper) {
draw_box(ImVec2(75, 65),ImVec2(450, 220), hex_color(0x000000, 0.5f), 20.0f);
if (dfu_step1 > 0) dfu_text_light;
else dfu_text_dark;
set_pos(110, 110); font(SF_Reg);
ImGui::Text("1. Get Ready! %d", dfu_step1);
if (dfu_step2 > 0 && dfu_step1 == 0) dfu_text_light;
else dfu_text_dark;
set_pos(110, 160); ImGui::Text("2. Hold volume down + side button %d", dfu_step2);
if (dfu_step3 > 0 && dfu_step2 == 0) dfu_text_light;
else dfu_text_dark;;
set_pos(110, 210);ImGui::Text("3. Release side button, but keep holding volume down %d", dfu_step3);
ImGui::PopFont();
if (!dfu_done) {
if (set_ms) {
desired = ms() + 1000;
set_ms = false;
}
if (ms() >= desired) {
set_ms = true;
if (dfu_step1 > 0) dfu_step1 -= 1;
else if (dfu_step2 > 0) dfu_step2 -= 1;
else if (dfu_step3 > 0) dfu_step3 -= 1;
else dfu_done = true;
}
}
if (dfu_step2 == 2) exitrecv_cmd(dev.ecid);
if (dfu_done) {
if (device_status == DFU) {
guifree();
dfu_helper = false;
jailbreak = true;
} else {
send_alert("Failed to enter DFU", "Device failed to enter DFU mode, please try again.");
dfu_step1 = 3; dfu_step2 = 5; dfu_step3 = 10;
dfu_done = false;
dfu_helper = false;
waiting_for_device = true;
}
}
/* Main Jailbreak view */
} else if (jailbreak) {
pthread_t jb;
draw_box(ImVec2(25, 70),ImVec2(500, 200), hex_color(0x000000, 0.25f), 20.0f);
set_pos(20, 15); font(SF_Bold);
ImGui::Text("Installing jailbreak...");
ImGui::PopFont();
set_pos(20, 40); font(SF_Reg);
ImGui::Text("This will take a moment to jailbreak, hang tight!");
set_pos(50, 100); font(Hack);
if (!execjb) {
execjb = true;
palera1n(1, NULL);
}
// redirect logs here...
ImGui::Text("[*] Running...");
set_pos(50, 125); ImGui::Text("[*] Some epic log stuff will go here :3");
set_pos(50, 150); ImGui::Text("[*] lorem ipsum :frcoal:");
ImGui::PopFont();
} else {
}
if (settings) {
draw_box(ImVec2(50.0f, 65.0f),ImVec2(230.0f, 230.0f), hex_color(0x000000, 0.5f), 20.0f);
draw_box(ImVec2(320.0f, 65.0f),ImVec2(230.0f, 230.0f), hex_color(0x000000, 0.5f), 20.0f);
}
ImGui::End();
}
};
HelloImGui::Run(params);
return 0;
}
+20 -10
View File
@@ -11,19 +11,22 @@
#ifdef DEBUG
#define log_debug(...) fprintf(stderr, __VA_ARGS__); fputc('\n', stderr)
#else
#define log_debug(...) do {} while (0)
#define log_debug(...)
#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);
@@ -32,7 +35,8 @@ 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);
}
@@ -52,7 +56,8 @@ 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++;
@@ -60,7 +65,8 @@ 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) {
@@ -94,7 +100,8 @@ 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);
@@ -112,7 +119,8 @@ 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) {
@@ -151,7 +159,8 @@ 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) {
@@ -203,7 +212,8 @@ 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);
+10 -10
View File
@@ -12,7 +12,7 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
{
if (verbose >= 5
#ifdef TUI
&& !checkrain_options_enabled(host_flags, host_option_tui)
&& !checkrain_option_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;
@@ -57,12 +57,12 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
snprintf(colour_bold, 0x10, "%s", BWHT);
break;
}
if (checkrain_options_enabled(host_flags, host_option_no_colors)) {
if (checkrain_option_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) {
if (checkrain_option_enabled(host_flags, host_option_tui) && tui_started) {
newtComponent co = get_tui_log();
if (co == NULL) {
return 0; /* 0 bytes printed */
@@ -79,26 +79,26 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
time_t curtime;
time(&curtime);
struct tm* timeinfo = localtime(&curtime);
if (!checkrain_options_enabled(host_flags, host_option_no_colors))
if (!checkrain_option_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)) {
if (verbose >= 2 && !checkrain_option_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 if (!checkrain_options_enabled(host_flags, host_option_no_colors)) {
} else if (!checkrain_option_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)) {
} else if (verbose >= 2 && checkrain_option_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)) {
} else if (checkrain_option_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 && !checkrain_options_enabled(host_flags, host_option_no_colors))
if (verbose < 2 && !checkrain_option_enabled(host_flags, host_option_no_colors))
printf(CRESET "\n");
else if (!checkrain_options_enabled(host_flags, host_option_no_colors))
else if (!checkrain_option_enabled(host_flags, host_option_no_colors))
printf("\n%s-%s\n", colour, CRESET);
else if (verbose < 2)
printf("\n");
+14 -15
View File
@@ -28,7 +28,6 @@
#include <palerain.h>
#include <xxd-embedded.h>
#include <kerninfo.h>
#include <gui.h>
#define CMD_LEN_MAX 512
#define OVERRIDE_MAGIC 0xd803b376
@@ -73,7 +72,7 @@ int build_checks(void) {
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) {
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
@@ -82,7 +81,8 @@ int build_checks(void) {
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) {
@@ -112,9 +112,10 @@ int palera1n(int argc, char *argv[]) {
pthread_mutex_init(&ecid_dfu_wait_mutex, NULL);
if ((ret = build_checks())) return ret;
if ((ret = optparse(argc, argv))) goto cleanup;
if (!checkrain_options_enabled(host_flags, host_option_device_info) && checkrain_options_enabled(host_flags, host_option_palerain_version)) goto normal_exit;
if (!checkrain_option_enabled(host_flags, host_option_device_info))
if (checkrain_option_enabled(host_flags, host_option_palerain_version)) goto normal_exit;
#ifdef TUI
if (checkrain_options_enabled(host_flags, host_option_tui)) {
if (checkrain_option_enabled(host_flags, host_option_tui)) {
ret = tui();
if (ret) goto cleanup;
else goto normal_exit;
@@ -134,7 +135,7 @@ int palera1n(int argc, char *argv[]) {
}
#endif
if (!checkrain_options_enabled(host_flags, host_option_device_info))
if (!checkrain_option_enabled(host_flags, host_option_device_info))
LOG(LOG_INFO, "Waiting for devices");
if (access("/var/run/usbmuxd", F_OK) != 0)
@@ -144,16 +145,16 @@ int palera1n(int argc, char *argv[]) {
pthread_create(&dfuhelper_thread, NULL, dfuhelper, NULL);
pthread_join(dfuhelper_thread, NULL);
set_spin(0);
if (checkrain_options_enabled(host_flags, host_option_dfuhelper_only |
host_option_reboot_device |
host_option_exit_recovery |
host_option_enter_recovery |
host_option_device_info
) || device_has_booted)
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) ||
checkrain_option_enabled(host_flags, host_option_device_info) ||
device_has_booted)
goto normal_exit;
if (exec_checkra1n()) goto cleanup;
if (checkrain_options_enabled(host_flags, host_option_pongo_exit | host_option_demote))
if (checkrain_option_enabled(host_flags, host_option_pongo_exit) || checkrain_option_enabled(host_flags, host_option_demote))
goto normal_exit;
set_spin(1);
sleep(2);
@@ -186,8 +187,6 @@ cleanup:
}
#ifndef GUI
int main (int argc, char* argv[]) {
return palera1n(argc, argv);
}
#endif
+53 -20
View File
@@ -19,9 +19,10 @@ checkrain_option_p host_flags_p = &host_flags;
static bool force_use_verbose_boot = false;
static struct option longopts[] = {
#ifdef ROOTFUL
{"setup-partial-fakefs", no_argument, NULL, 'B'},
{"setup-fakefs", no_argument, NULL, 'c'},
{"clean-fakefs", no_argument, NULL, 'c'},
#endif
{"dfuhelper", no_argument, NULL, 'D'},
{"help", no_argument, NULL, 'h'},
{"pongo-shell", no_argument, NULL, 'p'},
@@ -29,7 +30,9 @@ static struct option longopts[] = {
{"debug-logging", no_argument, NULL, 'v'},
{"verbose-boot", no_argument, NULL, 'V'},
{"boot-args", required_argument, NULL, 'e'},
#ifdef ROOTFUL
{"fakefs", no_argument, NULL, 'f'},
#endif
{"rootless", no_argument, NULL, 'l'},
{"jbinit-log-to-file", no_argument, NULL, 'L'},
{"demote", no_argument, NULL, 'd'},
@@ -49,6 +52,9 @@ static struct option longopts[] = {
#ifdef DEV_BUILD
{"test1", no_argument, NULL, '1'},
{"test2", no_argument, NULL, '2'},
{"ignore-ssv", no_argument, NULL, palerain_option_case_ignore_ssv},
{"rootless-livefs", no_argument, NULL, palerain_option_case_rootless_livefs},
{"force-fakefs", no_argument, NULL, palerain_option_case_force_fakefs},
#endif
#ifdef TUI
{"tui", no_argument, NULL, 't'},
@@ -65,37 +71,39 @@ static int usage(int e, char* prog_name)
"12"
#endif
#ifdef ROOTFUL
"cCfB"
"cfB"
#endif
#ifdef TUI
"t"
#endif
"] [-e boot arguments] [-k Pongo image] [-o overlay file] [-r ramdisk file] [-K KPF file] [-i checkra1n file]\n"
"Copyright (C) 2023, palera1n team, All Rights Reserved.\n\n"
"iOS/iPadOS 15.0-16.5 arm64 jailbreaking tool\n\n"
"iOS/iPadOS 15.0-16.4 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--ignore-ssv\t\t\t\tAssume the platform has no SSV\n"
"\t--force-fakefs\t\t\t\tAllow fakefs to be created and used even on platforms without SSV\n"
"\t--rootless-livefs\t\t\t\tMount the root livefs on rootless\n"
"\t-1, --test1\t\t\t\tSet palerain_option_test1\n"
"\t-2, --test2\t\t\t\tSet palerain_option_test2\n"
#endif
#ifdef ROOTFUL
"\t-B, --setup-partial-fakefs\t\tSetup partial fakefs\n"
"\t-c, --setup-fakefs\t\t\tSetup fakefs\n"
"\t-C, --clean-fakefs\t\t\tClean fakefs\n"
#endif
"\t-d, --demote\t\t\t\tDemote\n"
"\t-D, --dfuhelper\t\t\t\tExit after entering DFU\n"
"\t-e, --boot-args <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"
"\t-f, --rootful \t\t\t\tSet jailbreak mode to rootful.\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"
"\t-K, --override-kpf <file>\t\tOverride kernel patchfinder\n"
"\t-l, --rootless\t\t\t\tBoots rootless. This is the default\n"
"\t-l, --rootless\t\t\t\tSet jailbreak mode to rootless.\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"
@@ -128,10 +136,13 @@ int optparse(int argc, char* argv[]) {
#ifdef DEV_BUILD
"12"
#endif
"fCcB"
#ifdef ROOTFUL
"fcB"
#endif
,longopts, NULL)) != -1)
{
switch (opt) {
#ifdef ROOTFUL
case 'B':
palerain_flags |= palerain_option_setup_partial_root;
palerain_flags |= palerain_option_setup_rootful;
@@ -141,9 +152,7 @@ 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;
#endif
case 'p':
host_flags |= host_option_pongo_exit;
break;
@@ -173,13 +182,17 @@ int optparse(int argc, char* argv[]) {
}
snprintf(xargs_cmd, sizeof(xargs_cmd), "xargs %s", optarg);
break;
#ifdef ROOTFUL
case 'f':
snprintf(rootfs_cmd, sizeof(rootfs_cmd), "rootfs %s", optarg);
snprintf(dtpatch_cmd, 0x20, "dtpatch %s", optarg);
palerain_flags |= palerain_option_rootful;
break;
#endif
case 'l':
palerain_flags &= ~palerain_option_rootful;
#ifdef ROOTFUL
palerain_flags |= palerain_option_rootless;
#endif
break;
case 'L':
palerain_flags |= palerain_option_jbinit_log_to_file;
@@ -289,6 +302,15 @@ int optparse(int argc, char* argv[]) {
case '2':
palerain_flags |= palerain_option_test2;
break;
case palerain_option_case_force_fakefs:
palerain_flags |= palerain_option_case_force_fakefs;
break;
case palerain_option_case_rootless_livefs:
palerain_flags |= palerain_option_case_rootless_livefs;
break;
case palerain_option_case_ignore_ssv:
palerain_flags |= palerain_option_no_ssv;
break;
#endif
case palerain_option_case_force_revert:
checkrain_flags |= checkrain_option_force_revert;
@@ -301,7 +323,7 @@ int optparse(int argc, char* argv[]) {
break;
}
}
if (checkrain_options_enabled(host_flags, host_option_palerain_version)) {
if (checkrain_option_enabled(host_flags, host_option_palerain_version)) {
printf(
"palera1n " PALERAIN_VERSION "\n"
BUILD_COMMIT " " BUILD_NUMBER " (" BUILD_BRANCH ")\n\n"
@@ -319,7 +341,7 @@ int optparse(int argc, char* argv[]) {
return 0;
}
if ((strstr(xargs_cmd, "serial=") != NULL) && !force_use_verbose_boot && checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful)) {
if ((strstr(xargs_cmd, "serial=") != NULL) && !force_use_verbose_boot && checkrain_option_enabled(palerain_flags, palerain_option_setup_rootful)) {
kpf_flags &= ~checkrain_option_verbose_boot;
}
@@ -343,17 +365,28 @@ int optparse(int argc, char* argv[]) {
LOG(LOG_VERBOSE4, "overlay override ptr %p -> %p", override_overlay.orig_ptr, **overlay_to_upload);
}
if (!checkrain_options_enabled(palerain_flags, palerain_option_rootful)) {
if (checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful) || checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful_forced)) {
if (checkrain_option_enabled(palerain_flags, palerain_option_rootful) && checkrain_option_enabled(palerain_flags, palerain_option_rootless)) {
LOG(LOG_FATAL, "cannot have rootful and rootless at the same time");
return -1;
}
if (!checkrain_option_enabled(palerain_flags, palerain_option_rootful) && !checkrain_option_enabled(palerain_flags, palerain_option_rootless)) {
LOG(LOG_FATAL, "must have either rootful or rootless, use --help for help");
return -1;
}
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)) {
LOG(LOG_FATAL, "Cannot setup rootful when rootless is requested. Use -f to enable rootful mode.");
return -1;
}
}
if (!(
checkrain_options_enabled(host_flags, host_option_dfuhelper_only) ||
checkrain_options_enabled(host_flags, host_option_enter_recovery) ||
checkrain_options_enabled(host_flags, host_option_exit_recovery) ||
checkrain_options_enabled(host_flags, host_option_reboot_device)))
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)))
{
#ifdef NO_CHECKRAIN
if (checkra1n_len == 0 && ext_checkra1n == NULL)
@@ -361,7 +394,7 @@ int optparse(int argc, char* argv[]) {
LOG(LOG_FATAL, "checkra1n omitted in build but no override specified");
return -1;
}
if (!(checkrain_options_enabled(host_flags, host_option_pongo_exit) || checkrain_options_enabled(host_flags, host_option_pongo_exit)))
if (!(checkrain_option_enabled(host_flags, host_option_pongo_exit) || checkrain_option_enabled(host_flags, host_option_pongo_exit)))
{
#ifdef NO_KPF
if (checkra1n_kpf_pongo_len == 0)
+10 -10
View File
@@ -29,15 +29,15 @@ void* pongo_helper(void* ptr) {
return NULL;
}
void *pongo_usb_callback(stuff_t *arg) {
void *pongo_usb_callback(void *arg) {
if (get_found_pongo())
return NULL;
set_found_pongo(1);
if (checkrain_options_enabled(palerain_flags, palerain_option_setup_rootful)) {
if (checkrain_option_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 = arg->handle;
usb_device_handle_t handle = (((stuff_t *)arg)->handle);
issue_pongo_command(handle, NULL);
issue_pongo_command(handle, "fuse lock");
issue_pongo_command(handle, "sep auto");
@@ -46,7 +46,7 @@ void *pongo_usb_callback(stuff_t *arg) {
issue_pongo_command(handle, kpf_flags_cmd);
issue_pongo_command(handle, checkrain_flags_cmd);
issue_pongo_command(handle, palerain_flags_cmd);
if (checkrain_options_enabled(palerain_flags, palerain_option_rootful))
if (checkrain_option_enabled(palerain_flags, palerain_option_rootful))
{
issue_pongo_command(handle, "rootfs");
}
@@ -66,13 +66,13 @@ void *pongo_usb_callback(stuff_t *arg) {
issue_pongo_command(handle, "overlay");
}
issue_pongo_command(handle, xargs_cmd);
if (checkrain_options_enabled(host_flags, host_option_pongo_full)) goto done;
if (checkrain_option_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)) {
if (checkrain_option_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)) {
} else if (checkrain_option_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.");
}
@@ -83,7 +83,7 @@ void *pongo_usb_callback(stuff_t *arg) {
done:
device_has_booted = true;
#ifdef USE_LIBUSB
libusb_unref_device(arg->dev);
libusb_unref_device(((stuff_t *)arg)->dev);
#endif
set_spin(0);
return NULL;
@@ -163,7 +163,7 @@ int upload_pongo_file(usb_device_handle_t handle, unsigned char *buf, unsigned i
if (verbose < 3 || verbose > 4) {
LOG(LOG_VERBOSE, "Uploaded %llu bytes to PongoOS", (unsigned long long)buf_len);
} else {
if (checkrain_options_enabled(host_flags, host_option_no_colors))
if (checkrain_option_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);
@@ -176,7 +176,7 @@ int upload_pongo_file(usb_device_handle_t handle, unsigned char *buf, unsigned i
void io_start(stuff_t *stuff)
{
int r = pthread_create(&stuff->th, NULL, (pthread_start_t)pongo_usb_callback, stuff);
int r = pthread_create(&stuff->th, NULL, &pongo_usb_callback, stuff);
if(r != 0)
{
ERR("pthread_create: %s", strerror(r));
+52 -51
View File
@@ -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,12 +162,12 @@ 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);
@@ -181,7 +181,6 @@ 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;
@@ -199,6 +198,14 @@ int wait_for_pongo(void)
return -1;
}
r = libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, 0, PONGO_USB_VENDOR, PONGO_USB_PRODUCT, LIBUSB_HOTPLUG_MATCH_ANY, FoundDevice, &stuff, &hp[0]);
if(r != LIBUSB_SUCCESS)
{
ERR("libusb_hotplug: %s", libusb_error_name(r));
libusb_exit(ctx);
return -1;
}
r = libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, PONGO_USB_VENDOR, PONGO_USB_PRODUCT, LIBUSB_HOTPLUG_MATCH_ANY, LostDevice, &stuff, &hp[1]);
if(r != LIBUSB_SUCCESS)
{
@@ -207,61 +214,55 @@ int wait_for_pongo(void)
return -1;
}
while (1) {
libusb_device **list;
ssize_t sz = libusb_get_device_list(ctx, &list);
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 + 1; j < sz; ++j)
{
libusb_unref_device(list[j]);
}
if(r != LIBUSB_SUCCESS)
{
libusb_free_device_list(list, 0);
libusb_exit(ctx);
return -1;
}
break;
}
libusb_free_device_list(list, 0);
while(get_spin())
{
r = libusb_handle_events(ctx);
if(r != LIBUSB_SUCCESS)
{
ERR("libusb_handle_events: %s", libusb_error_name(r));
break;
}
libusb_device **list;
ssize_t sz = libusb_get_device_list(ctx, &list);
bool done = false;
if(sz < 0)
{
ERR("libusb_get_device_list: %s", libusb_error_name((int)sz));
libusb_exit(ctx);
return -1;
}
for(ssize_t i = 0; i < sz; ++i)
{
struct libusb_device_descriptor desc;
r = libusb_get_device_descriptor(list[i], &desc);
if(r != LIBUSB_SUCCESS)
{
ERR("libusb_get_device_descriptor: %s", libusb_error_name(r));
// continue anyway
}
if(desc.idVendor != PONGO_USB_VENDOR || desc.idProduct != PONGO_USB_PRODUCT)
{
libusb_unref_device(list[i]);
continue;
}
r = FoundDevice(ctx, list[i], LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, &stuff);
for (ssize_t j = i; j < sz; ++j) {
libusb_unref_device(list[j]);
}
if(r != LIBUSB_SUCCESS)
{
libusb_free_device_list(list, 0);
libusb_exit(ctx);
return -1;
} else {
done = true;
}
break;
}
libusb_free_device_list(list, 0);
if (done) goto end;
}
end:
libusb_exit(ctx);
return 0;
libusb_exit(ctx);
return 0;
}
#endif