我更改了XXX.plist文件的Filter,添加了两个bundle。
但是打开app以后会发生闪退,原因是找不到另外一个我本想hook另外一个app的类。
形象的来讲就是:
1.我已经添加了两个我需要修改的app的bundle。两个app分别是A1和A2。
2.我hook了A1的C1类的方法并且hook了A2的C2类的方法。
3.打开A1、A2时闪退,打开A1的时候,显示找不到A2的C2类;打开A2的时候,显示找不到A1的C1类.。
请问应该如果正确地hook两个不同bundle的app呢
我是用Theos的,问题就是在Theos发生的。。。张总
hubomk
(hubo)
7
我的程序中也有很多类似的需求,大致是按这几种方法来判断的:
- 从NSBundle中取bundleId来判断
- 通过进程名来判断
- 是否存在某特定的类进行判断
大概是这个样子:
//==================================================//
// 分组 主要针对SpringBoard的HOOK操作
%group HookSpringBoard
%hook SpringBoard
- (void)applicationDidFinishLaunching:(id)arg1 {
NSLog(@"SpringBoard 启动");
%orig;
}
%end
%end
//==================================================//
//==================================================//
// 分组 主要针对XXXX的HOOK操作
%group HookMyTest
%hook MyTest
- (void)dosomething {
NSLog(@"dosomething...");
%orig;
}
%end
%end
//==================================================//
extern const char *__progname;
%ctor
{
NSLog(@"启动......");
NSString* bundleId = [[NSBundle mainBundle] bundleIdentifier];
NSLog(@"bundleId: %@", bundleId);
NSLog(@"进程名: %s", __progname);
// 如果bundleId是com.apple.springboard 则初始化HookSpringBoard
if([@"com.apple.springboard" isEqualToString:bundleId]) {
%init(HookSpringBoard);
}
// 如果bundleId是com.mytest.xxx 则初始化HookMyTest
else if([@"com.mytest.xxx" isEqualToString:bundleId]) {
%init(HookMyTest);
}
// 如果进程名是otherprocess
else if(strcmp(__progname, "otherprocess") == 0) {
// 干点其它的事...
}
// 如果存在XXXX的类
else if(objc_getClass("XXXX") != nil) {
// 干点其它的事...
}
}
1 个赞
Zhang
8
btw constructor里还有传统的argc和argv
logos %ctor 该怎么声明argc和argv?
Zhang
10
master上的theos ctor展开自带argc argv envp
Zhang
12
更新下theos就完了啊。本体是Perl写的跨平台啊
之前更新过一次, 更新完缺了好多文件, 就懒得再搞了
lanvsblue
(lanvsblue)
16
大神还有一个问题,__progname变量是来自于哪里的?