mirror of
https://github.com/opa334/TrollStore.git
synced 2026-07-02 11:40:26 +08:00
Support injection of TrollInstaller2 into ANY AppStore encrypted IPA
This commit is contained in:
@@ -1,6 +0,0 @@
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface TSI2AppDelegate : UIResponder <UIApplicationDelegate>
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,7 @@
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface TSI2AppDelegateNoScene : UIResponder <UIApplicationDelegate>
|
||||
@property (nonatomic, strong) UIWindow *window;
|
||||
@property (nonatomic, strong) UINavigationController *rootViewController;
|
||||
@end
|
||||
@@ -0,0 +1,14 @@
|
||||
#import "TSI2AppDelegateNoScene.h"
|
||||
#import "TSI2RootViewController.h"
|
||||
|
||||
@implementation TSI2AppDelegateNoScene
|
||||
|
||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
||||
_window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
|
||||
_rootViewController = [[UINavigationController alloc] initWithRootViewController:[[TSI2RootViewController alloc] init]];
|
||||
_window.rootViewController = _rootViewController;
|
||||
[_window makeKeyAndVisible];
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface TSI2AppDelegateWithScene : UIResponder <UIApplicationDelegate>
|
||||
|
||||
@end
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
#import "TSI2AppDelegate.h"
|
||||
#import "TSI2AppDelegateWithScene.h"
|
||||
|
||||
@implementation TSI2AppDelegate
|
||||
@implementation TSI2AppDelegateWithScene
|
||||
|
||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
||||
return YES;
|
||||
@@ -1,14 +1,69 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "TSI2AppDelegate.h"
|
||||
#import "TSI2AppDelegateNoScene.h"
|
||||
#import "TSI2AppDelegateWithScene.h"
|
||||
#import "TSI2SceneDelegate.h"
|
||||
#import <objc/runtime.h>
|
||||
|
||||
extern int rootHelperMain(int argc, char *argv[], char *envp[]);
|
||||
|
||||
void classFixup(void)
|
||||
BOOL sceneDelegateFix(void)
|
||||
{
|
||||
Class newClass = objc_allocateClassPair([TSI2SceneDelegate class], "WWDC.SceneDelegate", 0);
|
||||
objc_registerClassPair(newClass);
|
||||
NSString* sceneDelegateClassName = nil;
|
||||
|
||||
NSDictionary* UIApplicationSceneManifest = [NSBundle.mainBundle objectForInfoDictionaryKey:@"UIApplicationSceneManifest"];
|
||||
if(UIApplicationSceneManifest && [UIApplicationSceneManifest isKindOfClass:NSDictionary.class])
|
||||
{
|
||||
NSDictionary* UISceneConfiguration = UIApplicationSceneManifest[@"UISceneConfigurations"];
|
||||
if(UISceneConfiguration && [UISceneConfiguration isKindOfClass:NSDictionary.class])
|
||||
{
|
||||
NSArray* UIWindowSceneSessionRoleApplication = UISceneConfiguration[@"UIWindowSceneSessionRoleApplication"];
|
||||
if(UIWindowSceneSessionRoleApplication && [UIWindowSceneSessionRoleApplication isKindOfClass:NSArray.class])
|
||||
{
|
||||
NSDictionary* sceneToUse = nil;
|
||||
if(UIWindowSceneSessionRoleApplication.count > 1)
|
||||
{
|
||||
for(NSDictionary* scene in UIWindowSceneSessionRoleApplication)
|
||||
{
|
||||
if([scene isKindOfClass:NSDictionary.class])
|
||||
{
|
||||
NSString* UISceneConfigurationName = scene[@"UISceneConfigurationName"];
|
||||
if([UISceneConfigurationName isKindOfClass:NSString.class])
|
||||
{
|
||||
if([UISceneConfigurationName isEqualToString:@"Default Configuration"])
|
||||
{
|
||||
sceneToUse = scene;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!sceneToUse)
|
||||
{
|
||||
sceneToUse = UIWindowSceneSessionRoleApplication.firstObject;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sceneToUse = UIWindowSceneSessionRoleApplication.firstObject;
|
||||
}
|
||||
|
||||
if(sceneToUse && [sceneToUse isKindOfClass:NSDictionary.class])
|
||||
{
|
||||
sceneDelegateClassName = sceneToUse[@"UISceneDelegateClassName"];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(sceneDelegateClassName && [sceneDelegateClassName isKindOfClass:NSString.class])
|
||||
{
|
||||
Class newClass = objc_allocateClassPair([TSI2SceneDelegate class], sceneDelegateClassName.UTF8String, 0);
|
||||
objc_registerClassPair(newClass);
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[], char *envp[]) {
|
||||
@@ -21,8 +76,15 @@ int main(int argc, char *argv[], char *envp[]) {
|
||||
}
|
||||
else
|
||||
{
|
||||
classFixup();
|
||||
return UIApplicationMain(argc, argv, nil, NSStringFromClass(TSI2AppDelegate.class));
|
||||
BOOL usesSceneDelegate = sceneDelegateFix();
|
||||
if(usesSceneDelegate)
|
||||
{
|
||||
return UIApplicationMain(argc, argv, nil, NSStringFromClass(TSI2AppDelegateWithScene.class));
|
||||
}
|
||||
else
|
||||
{
|
||||
return UIApplicationMain(argc, argv, nil, NSStringFromClass(TSI2AppDelegateNoScene.class));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user