9 Commits

Author SHA1 Message Date
√(noham)²
432eafeb77 Select tvOS Theos repo and remove YouTubeHeader 2026-05-03 17:31:36 +02:00
√(noham)²
5a068bf71a Add iOS .gitignore and TF1Plus.plist 2026-05-03 16:11:20 +02:00
√(noham)²
9c7f571e8f Support tweak subpaths and tvOS builds 2026-05-03 16:08:25 +02:00
√(noham)²
6c5c90f060 Add TF1+ iOS tweak and build files 2026-05-03 16:08:08 +02:00
√(noham)²
d1af7d7a12 Add Build Tweak GitHub Actions workflow
Add a new GitHub Actions workflow (.github/workflows/build.yml) to build iOS tweaks.
2026-05-03 16:03:09 +02:00
√(noham)²
f69c20fb2c Add TF1+ tvOS tweak and docs 2026-04-10 21:06:13 +02:00
√(noham)²
2e08be66c0 Add Infuse rootless tweaks for iOS/tvOS 2026-04-09 21:45:44 +02: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
44 changed files with 763 additions and 6 deletions

118
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,118 @@
name: Build Tweak
on:
workflow_dispatch:
inputs:
tweak:
description: 'Tweak folder to build (e.g., BusinessJB, CreditAgricoleJB, Infuse-iOS, TF1Plus/TF1Plus-tvOS)'
required: false
default: 'BusinessJB'
branch:
description: 'Branch to build from'
required: false
default: 'main'
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.tweak || 'BusinessJB' }}
cancel-in-progress: true
jobs:
build:
name: Build ${{ inputs.tweak || 'BusinessJB' }}
runs-on: macos-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: ${{ inputs.branch || github.ref }}
- name: Install dependencies
run: brew install make ldid
- name: Set PATH environment variables
run: |
echo "$(brew --prefix make)/libexec/gnubin" >> $GITHUB_PATH
echo "THEOS=${{ github.workspace }}/theos" >> $GITHUB_ENV
# Original from YTweaks
- name: Get Theos commit
run: |
get_commit_hash() {
local repo_url=$1
git ls-remote "$repo_url" HEAD | awk '{print substr($1,1,7)}'
}
TWEAK_PATH="${{ inputs.tweak || 'BusinessJB' }}"
if [[ "$TWEAK_PATH" == *"tvOS"* || "$TWEAK_PATH" == *"TVOS"* ]]; then
THEOS_URL="https://github.com/NohamR/theos-tvOS"
else
THEOS_URL="https://github.com/roothide/theos"
fi
echo "THEOS_REPO=$THEOS_URL" >> $GITHUB_ENV
echo "THEOS_COMMIT=$(get_commit_hash "$THEOS_URL")" >> $GITHUB_ENV
- name: Cache Theos
id: cache-theos
uses: actions/cache@v5
with:
path: theos
key: Tweak-18.6-SDK-${{ env.THEOS_COMMIT }}
- name: Setup Theos
if: ${{ steps.cache-theos.outputs.cache-hit != 'true' }}
run: |
git clone --quiet --depth=1 --recurse-submodules ${{ env.THEOS_REPO }}.git theos
git clone --quiet --depth=1 -n --filter=tree:0 https://github.com/Tonwalter888/iOS-SDKs.git
cd iOS-SDKs
git sparse-checkout set --no-cone iPhoneOS18.6.sdk
git checkout --quiet
mv *.sdk "$THEOS/sdks"
- name: Clone headers
run: |
if [ ! -d "$THEOS/include/PSHeader" ]; then
git clone --quiet --depth=1 https://github.com/PoomSmart/PSHeader.git "$THEOS/include/PSHeader"
else
cd $THEOS/include/PSHeader
git pull --quiet --force
cd ${{ github.workspace }}
fi
- name: Build Tweak
run: |
TWEAK_PATH="${{ inputs.tweak || 'BusinessJB' }}"
TWEAK_NAME=$(basename "$TWEAK_PATH")
cd "$TWEAK_PATH"
echo "TWEAK_VERSION=$(grep '^Version:' control | cut -d ' ' -f2)" >> $GITHUB_ENV
echo "TWEAK_NAME=$TWEAK_NAME" >> $GITHUB_ENV
# Check if this is a tvOS tweak
if grep -q "TARGET.*appletv" Makefile; then
# tvOS tweaks don't use rootless/roothide schemes
make clean package DEBUG=0 FINALPACKAGE=1
else
# iOS tweaks build with multiple schemes
make clean package DEBUG=0 FINALPACKAGE=1
make clean package DEBUG=0 FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=rootless
make clean package DEBUG=0 FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
fi
mv packages/*.deb ${{ github.workspace }}
- name: Upload the tweak .deb(s)
uses: actions/upload-artifact@v7
with:
name: ${{ env.TWEAK_NAME }} v${{ env.TWEAK_VERSION }}
path: ${{ github.workspace }}/*.deb
if-no-files-found: error
overwrite: true
- name: Create a draft release
uses: softprops/action-gh-release@v3
with:
tag_name: ${{ env.TWEAK_NAME }}-v${{ env.TWEAK_VERSION }}
name: ${{ env.TWEAK_NAME }} v${{ env.TWEAK_VERSION }}
files: ${{ github.workspace }}/*.deb
draft: true

2
.gitignore vendored
View File

@@ -2,4 +2,4 @@
/CreditAgricoleTweak /CreditAgricoleTweak
/RMHook /RMHook
/rootless /rootless
Build.md Build.md

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
Infuse/Infuse-iOS/.gitignore vendored Normal file
View File

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

View File

@@ -0,0 +1,7 @@
{
Filter = {
Bundles = (
"com.firecore.infuse",
);
};
}

View File

@@ -0,0 +1,13 @@
TARGET = iphone:latest:14.0
INSTALL_TARGET_PROCESSES = infuse
ARCHS = arm64 arm64e
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = Infuse
Infuse_FILES = Tweak.x
Infuse_CFLAGS = -fobjc-arc
Infuse_FRAMEWORKS = Foundation
include $(THEOS_MAKE_PATH)/tweak.mk

81
Infuse/Infuse-iOS/Tweak.x Normal file
View File

@@ -0,0 +1,81 @@
// changes : FCInAppPurchaseServiceFreemium block deleted, FCTraktIAPManager block deleted, layoutSubviews -> awakeFromNib on FCVersionView, and the dead return %orig lines after return statements cleaned up (they were unreachable in the old version too)
#import <substrate.h>
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
%hook FCIAPGUIHelper
+(bool) isProAvailable {
return TRUE;
}
+(bool) isSubscriptionBought {
return TRUE;
}
%end
%hook FCInAppPurchaseServiceBase
- (bool)isFeaturePurchased:(long long)arg1 tillDate:(id*)arg2 {
return 1;
}
- (bool)isFeaturePurchased:(long long)arg1 {
return 1;
}
%end
%hook FCInAppPurchaseServiceDummy
- (bool)isFeaturePurchased:(long long)arg1 tillDate:(id*)arg2 {
return 1;
}
%end
// REMOVED: FCInAppPurchaseServiceFreemium (class gone from binary, replaced by SK2)
// SK2 IAP backend
%hook _TtC6infuse31InAppPurchaseServiceFreemiumSK2
- (bool)isFeaturePurchased:(long long)arg1 tillDate:(id*)arg2 {
return 1;
}
- (long long)iapVersionStatus {
// FCUpgradeToProViewController.featureHasBought checks iapVersionStatus > 0
return 1;
}
%end
%hook FCProductCollectionCell
-(bool) featurePurchased {
return TRUE;
}
%end
// REMOVED: FCTraktIAPManager (class gone from binary)
%hook FCUpgradeToProViewController
-(bool) featureHasBought {
return TRUE;
}
%end
// Add credits
@interface FCVersionView : UIView
@property (nonatomic, strong) UILabel *label;
@end
%hook FCVersionView
- (void)awakeFromNib {
%orig;
UILabel *label = (UILabel *)[self valueForKey:@"label"];
if ([label.text containsString:@"Infuse Pro"] && ![label.text hasPrefix:@"Infuse Team •"]) {
label.text = [NSString stringWithFormat:@"Infuse Team • %@", label.text];
}
}
%end
// iOS 16 Crash Fix
%hook CKContainer
+ (id)defaultContainer {
return nil;
}
+ (id)containerWithIdentifier:(id)arg1 {
return nil;
}
%end

10
Infuse/Infuse-iOS/control Normal file
View File

@@ -0,0 +1,10 @@
Package: io.infuseteam.infuserootless
Name: Infuse (Rootless)
Version: 2.0
Architecture: iphoneos-arm
Description: Unlock the full potential of Infuse
Maintainer: Infuse Team
Author: Infuse Team
Section: Tweaks
Depends: firmware (>= 18.3)
Conflicts: io.infuseteam.infuse, io.infuseteam.infuseroothide, io.infuseteam.infuselegacy, xyz.eshaydev.ignition, com.ippteam.infuse, com.strejda603.infuse6pro, xyz.eshaydev.infuse

View File

@@ -0,0 +1,26 @@
# Infuse (iOS)
Unlock the full potential of Infuse.
- **App**: [Infuse](https://apps.apple.com/fr/app/infuse/id1136220934)
- **Tested version**: 8.4.2
- **Target**: iOS 18+ (tested on iOS 18.7.1 using LiveContainer)
## Build
```sh
make package FINALPACKAGE=1
```
## Inject
```sh
cyan -i infuse-8.4.2.ipa \
-o infuse-8.4.2_patched.ipa \
-f io.infuseteam.infuserootless_2.0_iphoneos-arm.deb \
-u
```
## Screenshots
![mobile.png](../../docs/screens/Infuse/mobile.png)

3
Infuse/Infuse-tvOS/.gitignore vendored Normal file
View File

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

View File

@@ -0,0 +1,7 @@
{
Filter = {
Bundles = (
"com.firecore.infuse",
);
};
}

View File

@@ -0,0 +1,17 @@
TARGET = appletv:latest:18.3
ARCHS = arm64
INSTALL_TARGET_PROCESSES = infuse
THEOS_PACKAGE_SCHEME = rootless
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = Infuse
Infuse_FILES = Tweak.x
Infuse_CFLAGS = -fobjc-arc
Infuse_FRAMEWORKS = Foundation UIKit
include $(THEOS_MAKE_PATH)/tweak.mk
test-print:
@echo "ARCH is $(THEOS_PACKAGE_ARCH)"
@echo "CONTROL is $(_THEOS_DEB_PACKAGE_CONTROL_PATH)"

View File

@@ -0,0 +1,81 @@
// changes : FCInAppPurchaseServiceFreemium block deleted, FCTraktIAPManager block deleted, layoutSubviews -> awakeFromNib on FCVersionView, and the dead return %orig lines after return statements cleaned up (they were unreachable in the old version too)
#import <substrate.h>
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
%hook FCIAPGUIHelper
+(bool) isProAvailable {
return TRUE;
}
+(bool) isSubscriptionBought {
return TRUE;
}
%end
%hook FCInAppPurchaseServiceBase
- (bool)isFeaturePurchased:(long long)arg1 tillDate:(id*)arg2 {
return 1;
}
- (bool)isFeaturePurchased:(long long)arg1 {
return 1;
}
%end
%hook FCInAppPurchaseServiceDummy
- (bool)isFeaturePurchased:(long long)arg1 tillDate:(id*)arg2 {
return 1;
}
%end
// REMOVED: FCInAppPurchaseServiceFreemium (class gone from binary, replaced by SK2)
// SK2 IAP backend
%hook _TtC6infuse31InAppPurchaseServiceFreemiumSK2
- (bool)isFeaturePurchased:(long long)arg1 tillDate:(id*)arg2 {
return 1;
}
- (long long)iapVersionStatus {
// FCUpgradeToProViewController.featureHasBought checks iapVersionStatus > 0
return 1;
}
%end
%hook FCProductCollectionCell
-(bool) featurePurchased {
return TRUE;
}
%end
// REMOVED: FCTraktIAPManager (class gone from binary)
%hook FCUpgradeToProViewController
-(bool) featureHasBought {
return TRUE;
}
%end
// Add credits
@interface FCVersionView : UIView
@property (nonatomic, strong) UILabel *label;
@end
%hook FCVersionView
- (void)awakeFromNib {
%orig;
UILabel *label = (UILabel *)[self valueForKey:@"label"];
if ([label.text containsString:@"Infuse Pro"] && ![label.text hasPrefix:@"Infuse Team •"]) {
label.text = [NSString stringWithFormat:@"Infuse Team • %@", label.text];
}
}
%end
// iOS 16 Crash Fix
%hook CKContainer
+ (id)defaultContainer {
return nil;
}
+ (id)containerWithIdentifier:(id)arg1 {
return nil;
}
%end

View File

@@ -0,0 +1,10 @@
Package: io.infuseteam.infuserootless
Name: Infuse (Rootless)
Version: 2.0
Architecture: appletvos-arm64
Description: Unlock the full potential of Infuse
Maintainer: Infuse Team
Author: Infuse Team
Section: Tweaks
Depends: firmware
Conflicts: io.infuseteam.infuse, io.infuseteam.infuseroothide, io.infuseteam.infuselegacy, xyz.eshaydev.ignition, com.ippteam.infuse, com.strejda603.infuse6pro, xyz.eshaydev.infuse

View File

@@ -0,0 +1,26 @@
# Infuse tvOS
Unlock pro features in Infuse.
- **App**: [Infuse](https://apps.apple.com/fr/app/infuse/id1136220934)
- **Tested version**: 8.2.4
- **Target**: tvOS 18.3 (tested on tvOS 18.3)
## Build
```sh
make package FINALPACKAGE=1
```
## Inject
```sh
cyan -i infuse-8.2.4.ipa \
-o infuse-8.2.4_patched.ipa \
-f io.infuseteam.infuserootless_2.0_tvos-arm64.deb \
-u
```
## Screenshots
![../docs/screens/Infuse/settings.png](../docs/screens/Infuse/settings.png)

View File

@@ -4,11 +4,17 @@ iOS tweaks built with [Theos](https://theos.dev), injected into IPAs via [cyan](
## Tweaks ## Tweaks
| Tweak | App | Target | | Tweak | App | Target |
| ------------------------------------------------------- | ---------------- | ------- | | ------------------------------------------------------- | ---------------- | ---------- |
| [ServerCatPremium](ServerCatPremium/index.md) | ServerCat 1.30.0 | iOS 17+ | | [ServerCatPremium](ServerCatPremium/index.md) | ServerCat 1.30.0 | iOS 17+ |
| [ServerCatPremium (legacy)](ServerCatPremium_/index.md) | ServerCat 1.6.4 | iOS 15 | | [ServerCatPremium (legacy)](ServerCatPremium_/index.md) | ServerCat 1.6.4 | iOS 15 |
| [TextasticPro](TextasticPro/index.md) | Textastic 10.9.2 | iOS 18+ | | [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 |
| [Infuse](Infuse/Infuse-tvOS/index.md) | Infuse 8.2.4 | tvOS 18.3 |
| [Infuse (iOS)](Infuse/Infuse-iOS/index.md) | Infuse 8.4.2 | iOS 18+ |
| [TF1+ (tvOS)](TF1Plus/TF1Plus-tvOS/index.md) | TF1+ 11.36.0 | tvOS |
| [TF1+ (iOS)](TF1Plus/TF1Plus-iOS/index.md) | TF1+ 11.36.0 | iOS 14+ |
## Build ## Build

3
TF1Plus/TF1Plus-iOS/.gitignore vendored Normal file
View File

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

View File

@@ -0,0 +1,12 @@
TARGET = iphone:latest:14.0
ARCHS = arm64 arm64e
INSTALL_TARGET_PROCESSES = mytf1
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = TF1Plus
TF1Plus_FILES = Tweak.x
TF1Plus_CFLAGS = -fobjc-arc
include $(THEOS_MAKE_PATH)/tweak.mk

View File

@@ -0,0 +1,10 @@
{
Filter = {
Bundles = (
"com.tf1.applitf1",
);
Executables = (
mytf1,
);
};
}

View File

@@ -0,0 +1,7 @@
#import <Foundation/Foundation.h>
%hook FWRequestConfiguration
- (id)initWithServerURL:(id)arg1 playerProfile:(id)arg2 {
return self;
}
%end

View File

@@ -0,0 +1,9 @@
Package: xyz.nohamr.tf1plus
Name: TF1+ (iOS)
Version: 1.0
Architecture: iphoneos-arm64
Description: TF1+ Ads blocker hook for iOS
Maintainer: NohamR
Author: NohamR
Section: Tweaks
Depends: mobilesubstrate (>= 0.9.5000)

View File

@@ -0,0 +1,22 @@
# TF1+ iOS
Block ads initialization on TF1+.
- **App**: [TF1+ : Streaming, TV en Direct](https://apps.apple.com/fr/app/tf1-streaming-tv-en-direct/id407248490)
- **Tested version**: 11.36.0
- **Target**: iOS
## Build
```sh
make package FINALPACKAGE=1
```
## Inject
```sh
cyan -i tf1plus.ipa \
-o tf1plus_patched.ipa \
-f xyz.nohamr.tf1plus_1.0_iphoneos-arm64.deb \
-u
```

3
TF1Plus/TF1Plus-tvOS/.gitignore vendored Normal file
View File

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

View File

@@ -0,0 +1,13 @@
TARGET = appletv:latest:18.3
ARCHS = arm64
INSTALL_TARGET_PROCESSES = mytf1
THEOS_PACKAGE_SCHEME = rootless
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = TF1Plus
TF1Plus_FILES = Tweak.x
TF1Plus_CFLAGS = -fobjc-arc
include $(THEOS_MAKE_PATH)/tweak.mk

View File

@@ -0,0 +1,10 @@
{
Filter = {
Bundles = (
"com.tf1.applitf1",
);
Executables = (
mytf1,
);
};
}

View File

@@ -0,0 +1,7 @@
#import <Foundation/Foundation.h>
%hook FWRequestConfiguration
- (id)initWithServerURL:(id)arg1 playerProfile:(id)arg2 {
return self;
}
%end

View File

@@ -0,0 +1,9 @@
Package: xyz.nohamr.tf1plus
Name: TF1+ (Rootless)
Version: 1.0
Architecture: appletvos-arm64
Description: TF1+ Ads blocker hook
Maintainer: NohamR
Author: NohamR
Section: Tweaks
Depends: firmware

View File

@@ -0,0 +1,22 @@
# TF1+ tvOS
Block ads initialization on TF1+.
- **App**: [TF1+ : Streaming, TV en Direct](https://apps.apple.com/fr/app/tf1-streaming-tv-en-direct/id407248490)
- **Tested version**: 11.36.0
- **Target**: tvOS
## Build
```sh
make package FINALPACKAGE=1
```
## Inject
```sh
cyan -i tf1plus.ipa \
-o tf1plus_patched.ipa \
-f com.yourname.tf1plus_1.0_tvos-arm64.deb \
-u
```

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: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

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