我更改了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变量是来自于哪里的?