From 238f92ce01880bf2c3c14674e1b43a95f59b0fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=88=9A=28noham=29=C2=B2?= <100566912+NohamR@users.noreply.github.com> Date: Tue, 30 Jun 2026 17:28:21 +0200 Subject: [PATCH] Add GPXViewer2 --- GPXViewer2/.gitignore | 3 +++ GPXViewer2/GPXViewer2.plist | 7 +++++ GPXViewer2/Makefile | 13 +++++++++ GPXViewer2/Tweak.x | 53 +++++++++++++++++++++++++++++++++++++ GPXViewer2/control | 9 +++++++ 5 files changed, 85 insertions(+) create mode 100644 GPXViewer2/.gitignore create mode 100644 GPXViewer2/GPXViewer2.plist create mode 100644 GPXViewer2/Makefile create mode 100644 GPXViewer2/Tweak.x create mode 100644 GPXViewer2/control diff --git a/GPXViewer2/.gitignore b/GPXViewer2/.gitignore new file mode 100644 index 0000000..faf8687 --- /dev/null +++ b/GPXViewer2/.gitignore @@ -0,0 +1,3 @@ +.theos/ +packages/ +.DS_Store diff --git a/GPXViewer2/GPXViewer2.plist b/GPXViewer2/GPXViewer2.plist new file mode 100644 index 0000000..d020281 --- /dev/null +++ b/GPXViewer2/GPXViewer2.plist @@ -0,0 +1,7 @@ +{ + Filter = { + Bundles = ( + "family.gander.gpxviewer2", + ); + }; +} \ No newline at end of file diff --git a/GPXViewer2/Makefile b/GPXViewer2/Makefile new file mode 100644 index 0000000..5317b87 --- /dev/null +++ b/GPXViewer2/Makefile @@ -0,0 +1,13 @@ +TARGET = iphone:latest:14.0 +INSTALL_TARGET_PROCESSES = gpxviewer2 +ARCHS = arm64 + +include $(THEOS)/makefiles/common.mk + +TWEAK_NAME = GPXViewer2 + +GPXViewer2_FILES = Tweak.x +GPXViewer2_CFLAGS = -fobjc-arc +GPXViewer2_FRAMEWORKS = Foundation UIKit + +include $(THEOS_MAKE_PATH)/tweak.mk diff --git a/GPXViewer2/Tweak.x b/GPXViewer2/Tweak.x new file mode 100644 index 0000000..8bfc391 --- /dev/null +++ b/GPXViewer2/Tweak.x @@ -0,0 +1,53 @@ +#import +#import +#import +#import +#import +#import + +%hook CKContainer ++ (id)defaultContainer { return nil; } ++ (id)containerWithIdentifier:(id)arg1 { return nil; } +%end + +%ctor { + @autoreleasepool { + // Device UUID + NSString *deviceUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; + if (!deviceUUID) deviceUUID = @""; + + // Compute SHA256 hashes for all product keys + NSString *salt = @"-gpxviewerbyjg-"; + NSArray *productKeys = @[ + // @"family.gander.gpxviewer2.iap.nc.coffee", + // @"family.gander.gpxviewer2.iap.nc.hikingsnack", + @"family.gander.gpxviewer2.iap.nc.hikingmeal", + // @"family.gander.gpxviewer2.easteregg.secret.access", + // @"family.gander.gpxviewer2.iap.nc.level1", + // @"family.gander.gpxviewer2.iap.nc.level2", + // @"family.gander.gpxviewer2.iap.nc.level3", + ]; + + NSMutableArray *hashes = [NSMutableArray array]; + for (NSString *key in productKeys) { + NSString *input = [NSString stringWithFormat:@"%@%@%@", deviceUUID, salt, key]; + const char *cstr = [input UTF8String]; + unsigned char digest[CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(cstr, (CC_LONG)strlen(cstr), digest); + NSMutableString *hex = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; + for (NSUInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { + [hex appendFormat:@"%02x", digest[i]]; + } + [hashes addObject:hex]; + } + + // // empty hashes array + // NSMutableArray *hashes = [NSMutableArray array]; + + [[NSUserDefaults standardUserDefaults] setObject:hashes + forKey:@"proversionmanager.storage.purchasedproducts"]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + NSLog(@"[GPXViewer2] Injected %lu product hashes", (unsigned long)[hashes count]); + } +} diff --git a/GPXViewer2/control b/GPXViewer2/control new file mode 100644 index 0000000..30da073 --- /dev/null +++ b/GPXViewer2/control @@ -0,0 +1,9 @@ +Package: com.rev.gpxviewer2unlock +Name: GPXViewer2 Unlock +Version: 1.0 +Architecture: iphoneos-arm +Description: Unlock all IAP products and easter egg in GPXViewer 2 +Maintainer: rev +Author: rev +Section: Tweaks +Depends: firmware (>= 14.0)