一个Tweak如何同时作用在两个bundle上?

我更改了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呢

  1. 在XXX.plist中添加A1、A2的filter;
  2. 在tweak程序中将两组hook代码分组,%group;
  3. 在tweak的初始化(%ctor)中判断当前程序是A1还是A2,然后后分别初始化不同的group;

Theos的预处理器会判断对应类是否存在的哇

我是用Theos的,问题就是在Theos发生的。。。张总

用什么方法判断当前的程序是A1还是A2呢

NSBundle里有方法。。。。。。。

我的程序中也有很多类似的需求,大致是按这几种方法来判断的:

  1. 从NSBundle中取bundleId来判断
  2. 通过进程名来判断
  3. 是否存在某特定的类进行判断

大概是这个样子:

//==================================================//
// 分组 主要针对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 个赞

btw constructor里还有传统的argc和argv

logos %ctor 该怎么声明argc和argv?

master上的theos ctor展开自带argc argv envp

哦, 那WINDOWS版没救了

更新下theos就完了啊。本体是Perl写的跨平台啊

之前更新过一次, 更新完缺了好多文件, 就懒得再搞了

谢谢张总我明白了

谢谢!我懂了

大神还有一个问题,__progname变量是来自于哪里的?

"extern "