我正在为iOS 7中的应用寻找全球function
。
更具体地说,我希望在启动时将代码注入应用程序,这只会影响app
,而不影响SpringBoard
。
我尝试过几件事,但它们只影响SpringBoard
:
%hook SBApplicationIcon
- (id)application {
return %orig;
}
- (id)initWithApplication:(id)arg1 {
return %orig;
}
%end
%hook SBApplicationController
- (id)init {
return %orig;
}
%end
%hook SBUIController
- (void)launchIcon:(id)arg1 fromLocation:(int)arg2 {
%orig;
}
- (id)contentView {
return %orig;
}
%end
%hook SBApplication
- (void)didLaunch:(id)arg1 {
%orig;
}
%end
这些只是我尝试functions
的几个例子。
我怀疑过滤器也需要更改,但这取决于函数所在的位置(com.apple.springboard
设置为atm)。
我收到了一条提示,要求将过滤器设置为*
,但如果我不知道function
到%hook
的内容,那对我来说并不是很好。
请尽可能解释你的答案。
答案 0 :(得分:4)
您的代码仅在 SpringBoard 中运行,因为您已选择在SpringBoard类中使用 hook 方法(例如SBUIController
,SBApplicationController
等。),并且您的过滤器设置为仅挂钩SpringBoard本身。
Try checking out the MobileSubstrate docs here
我不是百分百肯定我明白你要做什么,但听起来你只是想要在所有普通“应用程序”中运行的任何方法?
如果是这样,您可以更改过滤器以挂钩使用UIKit的所有内容:
Filter = {
Bundles = (com.apple.UIKit);
};
然后,您可以尝试使用MSHookFunction()
挂钩C函数as shown in this example。
在您的代码中,尝试挂钩UIApplicationMain(),我相信所有正常的应用都会使用。
另一种可能的技术是从UIApplicationDelegate
协议挂钩任何常用的启动回调方法。但是,为了使用挂钩,您需要发现哪些类实现此协议。 See this answer for an example of doing this (with another protocol)
答案 1 :(得分:1)
使用 NSDistributedNotificationCenter 的解决方法可以满足您的需求。
首先,您需要将过滤器设置为 com.apple.UIKit ,以便动态库可以连接到所有进程。
然后创建一个Class(.h和.m文件)并命名为 GlobalFunction :
GlobalFunction.h文件
@interface GlobalFunction: NSObject
@end
GlobalFunction.m文件
#import "GlobalFunction.h"
@implementation GlobalFunction
- (id)init {
self = [super init];
if (self) {
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(globalNotificationReceived:) name:@"info.ilendemli.globalNotification" object:nil];
}
return self;
}
- (void)globalNotificationReceived:(NSNotification *)notification {
NSLog(@"Notification Received");
}
@end
并在 Tweak.xm 中执行以下操作:
#import "GlobalFunction.h"
%hook SpringBoard
- (void)applicationDidFinishLaunching:(id)application {
%orig;
[GlobalFunction new];
}
%end
所以当 SpringBoard 加载时,类会被初始化。然后使用:
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"info.ilendemli.globalNotification" object:nil];
发布通知,以便调用该方法。
我没有对此进行过测试,但它应该可行,并且它类似于我之前制作的内容,效果很好。
要在app-launch上执行该方法,请在 Tweak.xm 文件中添加以下内容:
static NSArray *blackList = @[ @"MailAppController", @"SpringBoard", @"FBWildeApplication" ];
%hook UIApplication
- (void)_run {
NSString *classString = NSStringFromClass([self class]);
if (![blackList containsObject:classString]) {
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"info.ilendemli.globalNotification" object:nil];
}
%orig;
}
%end
编辑帖子删除%ctor,因为这可能不起作用。通过挂钩SpringBoard并在那里初始化Class来添加替代方法。