Support injection of TrollInstaller2 into ANY AppStore encrypted IPA

This commit is contained in:
opa334
2022-10-07 18:34:06 +02:00
parent e9aaaa1bbc
commit 7dd6c86c3d
9 changed files with 136 additions and 40 deletions
@@ -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
@@ -1,6 +1,6 @@
#import "TSI2AppDelegate.h"
#import "TSI2AppDelegateWithScene.h"
@implementation TSI2AppDelegate
@implementation TSI2AppDelegateWithScene
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
+68 -6
View File
@@ -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));
}
}
}
}