6 Commits
1.0.0 ... dev

Author SHA1 Message Date
√(noham)²
f314bf991f add JaysonPlus (not working) 2026-02-24 22:43:32 +01:00
√(noham)²
5973408630 Add CreditAgricoleJB tweak and docs 2026-02-24 22:42:48 +01:00
√(noham)²
a9ddc888f8 Add BusinessJB tweak and patch serve script 2026-02-24 20:40:06 +01:00
√(noham)²
90009b8956 Add TextasticPro tweak, assets, and update README 2026-02-23 23:18:46 +01:00
√(noham)²
a4907a5024 Lint :) 2026-02-23 19:02:00 +01:00
√(noham)²
b79c4e7602 Update package IDs in control files 2026-02-23 17:26:50 +01:00
35 changed files with 379 additions and 20 deletions

3
BusinessJB/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.theos/
packages/
.DS_Store

View File

@@ -0,0 +1,7 @@
{
Filter = {
Bundles = (
"fr.labanquepostale.pmo.mescomptes",
);
};
}

13
BusinessJB/Makefile Normal file
View File

@@ -0,0 +1,13 @@
TARGET = iphone:latest:14.0
INSTALL_TARGET_PROCESSES = Business
ARCHS = arm64 arm64e
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = BusinessJB
BusinessJB_FILES = Tweak.x
BusinessJB_CFLAGS = -fobjc-arc
BusinessJB_FRAMEWORKS = Foundation
include $(THEOS_MAKE_PATH)/tweak.mk

8
BusinessJB/Tweak.x Normal file
View File

@@ -0,0 +1,8 @@
#import <substrate.h>
#import <mach-o/dyld.h>
%hook JailbreakDetection
- (bool)jailbroken {
return FALSE;
}
%end

9
BusinessJB/control Normal file
View File

@@ -0,0 +1,9 @@
Package: xyz.nohamr.businessjb
Name: BusinessJB
Version: 1.0.0
Architecture: iphoneos-arm
Description: Bypass the jailbreak detection of the Business app.
Maintainer: NohamR
Author: NohamR
Section: Tweaks
Depends: mobilesubstrate (>= 0.9.5000)

26
BusinessJB/index.md Normal file
View File

@@ -0,0 +1,26 @@
# BusinessJB
Disables jailbreak detection in La Banque Postale by forcing `JailbreakDetection` to return `FALSE`.
- **App**: [Business La Banque Postale](https://apps.apple.com/fr/app/business-la-banque-postale/id1438089314)
- **Latest version**: 2.3.000
- **Tested on**: iOS 15.8.6
## Build
```sh
make clean && make package THEOS_PACKAGE_SCHEME=rootless DEBUG=0
```
## Inject
```sh
cyan -i com.labanquepostale.business-2.3.000.ipa \
-o com.labanquepostale.business-2.3.000_patched.ipa \
-f xyz.nohamr.businessjb_1.0.0-1_iphoneos-arm64.deb \
-u
```
## Screenshots
![../docs/screens/BusinessJB/jailbreak.png](../docs/screens/BusinessJB/jailbreak.png)

3
CreditAgricoleJB/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.theos/
packages/
.DS_Store

View File

@@ -0,0 +1,7 @@
{
Filter = {
Bundles = (
"fr.creditagricole.monbudget",
);
};
}

13
CreditAgricoleJB/Makefile Normal file
View File

@@ -0,0 +1,13 @@
TARGET = iphone:latest:14.0
INSTALL_TARGET_PROCESSES = nmb_prod
ARCHS = arm64 arm64e
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = CreditAgricoleTweak
CreditAgricoleTweak_FILES = Tweak.x
CreditAgricoleTweak_CFLAGS = -fobjc-arc
CreditAgricoleTweak_FRAMEWORKS = Foundation
include $(THEOS_MAKE_PATH)/tweak.mk

27
CreditAgricoleJB/Tweak.x Normal file
View File

@@ -0,0 +1,27 @@
#import <substrate.h>
#import <mach-o/dyld.h>
#import <string.h>
#import <Foundation/Foundation.h>
#define TARGET_MODULE "nmb_prod"
#define IDA_BASE 0x100000000
#define ADDR_JB_DETECT 0x10055F914 // Address of target function in IDA (adjust if needed)
static void *(*original_sub)(void);
static void *hooked_sub(void) {
return 0;
}
%ctor {
for (uint32_t i = 0; i < _dyld_image_count(); i++) {
const char *name = _dyld_get_image_name(i);
if (name && strstr(name, TARGET_MODULE)) {
uintptr_t base = (uintptr_t)_dyld_get_image_header(i);
uintptr_t addr = base + (ADDR_JB_DETECT - IDA_BASE);
MSHookFunction((void *)addr, (void *)hooked_sub, (void **)&original_sub);
NSLog(@"[CreditAgricoleTweak] Hooked function at 0x%lx", addr);
return;
}
}
}

9
CreditAgricoleJB/control Normal file
View File

@@ -0,0 +1,9 @@
Package: xyz.nohamr.creditagricolejb
Name: CreditAgricoleJB (Rootless)
Version: 1.0.0
Architecture: iphoneos-arm
Description: Bypas jailbreak detection in Credit Agricole app
Maintainer: NohamR
Author: NohamR
Section: Tweaks
Depends: mobilesubstrate (>= 0.9.5000)

26
CreditAgricoleJB/index.md Normal file
View File

@@ -0,0 +1,26 @@
# CreditAgricoleJB
Disables jailbreak detection in Ma Banque.
- **App**: [Ma Banque](https://apps.apple.com/fr/app/ma-banque/id376202925)
- **Latest version**: 47.0.0
- **Tested on**: iOS 15.8.6
## Build
```sh
make clean && make package THEOS_PACKAGE_SCHEME=rootless DEBUG=0
```
## Inject
```sh
cyan -i com.creditagricole.mabanque-47.0.0.ipa \
-o com.creditagricole.mabanque-47.0.0_patched.ipa \
-f xyz.nohamr.creditagricolejb_1.0.0-1_iphoneos-arm64.deb \
-u
```
## Screenshots
![../docs/screens/CreditAgricoleJB/undetected.png](../docs/screens/CreditAgricoleJB/undetected.png)

3
JaysonPlus/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.theos/
packages/
.DS_Store

View File

@@ -0,0 +1,7 @@
{
Filter = {
Bundles = (
"dk.simonbs.Jayson",
);
};
}

13
JaysonPlus/Makefile Normal file
View File

@@ -0,0 +1,13 @@
TARGET = iphone:latest:14.0
INSTALL_TARGET_PROCESSES = Jayson
ARCHS = arm64 arm64e
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = JaysonPlus
JaysonPlus_FILES = Tweak.x
JaysonPlus_CFLAGS = -fobjc-arc
JaysonPlus_FRAMEWORKS = Foundation
include $(THEOS_MAKE_PATH)/tweak.mk

11
JaysonPlus/Tweak.x Normal file
View File

@@ -0,0 +1,11 @@
#import <substrate.h>
%hook UnlockEverythingManager
- (BOOL)haveUnlockedEverything {
return TRUE;
}
- (void)setHaveUnlockedEverything:(BOOL)unlocked {
%orig(YES);
}
%end

9
JaysonPlus/control Normal file
View File

@@ -0,0 +1,9 @@
Package: xyz.nohamr.jaysonplus
Name: JaysonPlus
Version: 1.0.0
Architecture: iphoneos-arm
Description: Unlocks everything in the Jayson app.
Maintainer: NohamR
Author: NohamR
Section: Tweaks
Depends: mobilesubstrate (>= 0.9.5000)

View File

@@ -4,10 +4,13 @@ iOS tweaks built with [Theos](https://theos.dev), injected into IPAs via [cyan](
## Tweaks
| Tweak | App | Target |
| ----------------------------------------------- | ---------------- | ------- |
| [ServerCatPremium](ServerCatPremium/index.md) | ServerCat 1.30.0 | iOS 17+ |
| [ServerCatPremium (legacy)](ServerCatPremium_/index.md) | ServerCat 1.6.4 | iOS 15 |
| Tweak | App | Target |
| ------------------------------------------------------- | ---------------- | ---------- |
| [ServerCatPremium](ServerCatPremium/index.md) | ServerCat 1.30.0 | iOS 17+ |
| [ServerCatPremium (legacy)](ServerCatPremium_/index.md) | ServerCat 1.6.4 | iOS 15 |
| [TextasticPro](TextasticPro/index.md) | Textastic 10.9.2 | iOS 18+ |
| [BusinessJB](BusinessJB/index.md) | Business 2.3.000 | iOS 15 |
| [CreditAgricoleJB](CreditAgricoleJB/index.md) | Ma Banque 47.0.0 | iOS 15.8.6 |
## Build

View File

@@ -7,9 +7,10 @@
#define IDA_BASE 0x100000000
#define ADDR_IS_PREMIUM 0x10009CD24 // Address of "isPremiumActive" in IDA (adjust if needed)
static int (*orig_isPremiumActive)();
static int hook_isPremiumActive() {
return 1;
static int (*orig_isPremiumActive)(void);
static int hook_isPremiumActive(void) {
return 1;
}
%ctor {
@@ -17,9 +18,9 @@ static int hook_isPremiumActive() {
const char *name = _dyld_get_image_name(i);
if (name && strstr(name, TARGET_MODULE)) {
uintptr_t base = (uintptr_t)_dyld_get_image_header(i);
uintptr_t addr = base + (ADDR_IS_PREMIUM - IDA_BASE);
uintptr_t addr = base + (ADDR_IS_PREMIUM - IDA_BASE);
MSHookFunction((void *)addr, (void *)hook_isPremiumActive, (void **)&orig_isPremiumActive);
NSLog(@"[ServerCatPremium] Hooked isPremiumActive at 0x%lx", addr);
NSLog(@"[ServerCatPremium] Hooked isPremiumActive at 0x%lx", addr);
return;
}
}
@@ -30,10 +31,7 @@ static int hook_isPremiumActive() {
+ (id)defaultContainer {
return nil;
}
+ (id)containerWithIdentifier:(id)arg1 {
arg1 = nil;
+ (id)containerWithIdentifier:(id) arg1 {
return nil;
return %orig;
}
%end

View File

@@ -1,4 +1,4 @@
Package: xyz.nohamr
Package: xyz.nohamr.servercatpremium
Name: ServerCatPremium (Latest)
Version: 1.0.0
Architecture: iphoneos-arm

View File

@@ -7,9 +7,10 @@
#define IDA_BASE 0x100000000
#define ADDR_IS_PREMIUM 0x100454D70 // Address of "isPremiumActive" in IDA (adjust if needed)
static int (*orig_isPremiumActive)();
static int hook_isPremiumActive() {
return 1;
static int (*orig_isPremiumActive)(void);
static int hook_isPremiumActive(void) {
return 1;
}
%ctor {
@@ -17,9 +18,9 @@ static int hook_isPremiumActive() {
const char *name = _dyld_get_image_name(i);
if (name && strstr(name, TARGET_MODULE)) {
uintptr_t base = (uintptr_t)_dyld_get_image_header(i);
uintptr_t addr = base + (ADDR_IS_PREMIUM - IDA_BASE);
uintptr_t addr = base + (ADDR_IS_PREMIUM - IDA_BASE);
MSHookFunction((void *)addr, (void *)hook_isPremiumActive, (void **)&orig_isPremiumActive);
NSLog(@"[ServerCatPremium] Hooked isPremiumActive at 0x%lx", addr);
NSLog(@"[ServerCatPremium] Hooked isPremiumActive at 0x%lx", addr);
return;
}
}

View File

@@ -1,4 +1,4 @@
Package: xyz.nohamr
Package: xyz.nohamr.servercatpremiumlegacy
Name: ServerCatPremium (Legacy)
Version: 1.0.0
Architecture: iphoneos-arm

3
TextasticPro/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.theos/
packages/
.DS_Store

13
TextasticPro/Makefile Normal file
View File

@@ -0,0 +1,13 @@
TARGET = iphone:latest:14.0
INSTALL_TARGET_PROCESSES = Textastic
ARCHS = arm64 arm64e
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = TextasticPro
TextasticPro_FILES = Tweak.x
TextasticPro_CFLAGS = -fobjc-arc
TextasticPro_FRAMEWORKS = Foundation
include $(THEOS_MAKE_PATH)/tweak.mk

View File

@@ -0,0 +1,7 @@
{
Filter = {
Bundles = (
"com.textasticapp.textastic-universal",
);
};
}

32
TextasticPro/Tweak.x Normal file
View File

@@ -0,0 +1,32 @@
#import <substrate.h>
#import <mach-o/dyld.h>
#import <string.h>
#import <Foundation/Foundation.h>
%hook TextasticStore
- (bool)textasticProActive {
return TRUE;
}
- (bool)isVPPReceipt {
return FALSE;
}
- (bool)isLegacyPurchase {
return TRUE;
}
- (bool)isLegacyPurchaseOrProActive {
return TRUE;
}
- (bool)isLegacyPurchaseOrProActiveOrTestFlight {
return TRUE;
}
%end
// iOS 16 Crash Fix
%hook CKContainer
+ (id)defaultContainer {
return nil;
}
+ (id)containerWithIdentifier:(id) arg1 {
return nil;
}
%end

9
TextasticPro/control Normal file
View File

@@ -0,0 +1,9 @@
Package: xyz.nohamr.textasticpro
Name: TextasticPro
Version: 1.0.0
Architecture: iphoneos-arm
Description: Unlocks premium features in Textastic app.
Maintainer: NohamR
Author: NohamR
Section: Tweaks
Depends: mobilesubstrate (>= 0.9.5000)

28
TextasticPro/index.md Normal file
View File

@@ -0,0 +1,28 @@
# TextasticPro
Unlocks premium features in Textastic.
- **App**: [Textastic](https://apps.apple.com/fr/app/textastic/id572491815?l=en-GB&mt=12)
- **Tested on**: Textastic 10.9.2, iOS iOS 18.3
## Build
```sh
make clean && make package THEOS_PACKAGE_SCHEME=rootless DEBUG=0
```
## Inject
```sh
cyan -i com.textasticapp.textastic-universal-10.9.2.ipa \
-o com.textasticapp.textastic-universal-10.9.2_patched.ipa \
-f xxyz.nohamr.textasticpro_1.0.0-1_iphoneos-arm64.deb \
-u
```
## Screenshots
![../docs/screens/TextasticPro/pro.png](../docs/screens/TextasticPro/pro.png)
![../docs/screens/TextasticPro/search.png](../docs/screens/TextasticPro/search.png)
![../docs/screens/TextasticPro/shh1.png](../docs/screens/TextasticPro/ssh1.png)
![../docs/screens/TextasticPro/ssh2.png](../docs/screens/TextasticPro/ssh2.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

71
scripts/patch_and_serve.sh Executable file
View File

@@ -0,0 +1,71 @@
#!/bin/bash
set -e
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <file.ipa> <file.deb>"
exit 1
fi
IPA=""
DEB=""
for arg in "$@"; do
case "$arg" in
*.ipa)
IPA="$arg"
;;
*.deb)
DEB="$arg"
;;
*)
echo "Unknown file type: $arg"
exit 1
;;
esac
done
if [ -z "$IPA" ] || [ -z "$DEB" ]; then
echo "You must provide one .ipa and one .deb file."
exit 1
fi
# ---- Prepare output folder ----
OUT_DIR="/tmp/ipa_patched"
mkdir -p "$OUT_DIR"
IPA_NAME=$(basename "$IPA")
OUTPUT_IPA="$OUT_DIR/$IPA_NAME"
echo "[+] Patching IPA with cyan..."
cyan -i "$IPA" -o "$OUTPUT_IPA" -f "$DEB" -u --overwrite
echo "[+] Patch complete."
LOCAL_IP=$(ipconfig getifaddr en0 2>/dev/null)
if [ -z "$LOCAL_IP" ]; then
LOCAL_IP=$(hostname -I 2>/dev/null | awk '{print $1}')
fi
if [ -z "$LOCAL_IP" ]; then
echo "Could not detect local IP automatically."
LOCAL_IP="YOUR_IP"
fi
DOWNLOAD_LINK="http://$LOCAL_IP:8000/$IPA_NAME"
cd "$OUT_DIR"
echo ""
echo "=========================================="
echo "Download link:"
echo "$DOWNLOAD_LINK"
echo "=========================================="
echo ""
echo -n "$DOWNLOAD_LINK" | pbcopy
echo "[+] Download link copied to clipboard."
echo "[+] Starting HTTP server..."
echo "Press Ctrl+C to stop."
echo ""
python3 -m http.server 8000