root app 飞行模式

需求:基于Root权限app,不使用插件实现飞行模式开关。

操作步骤:
1.iOS设备中WiFi、蓝牙和飞行模式的开启与关闭(私有API)_zrhloveswallow的专栏-CSDN博客 这种以通知方式实现的已经试过,可用,但是觉得麻烦,希望通过app单独实现。
2.iOS 使用动态库(dylib)和动态加载framework_donwei8的专栏-CSDN博客 使用以dlopen加载私有库的方法过程中,私有库可以成功打开,但是获取函数地址后,调用直接crash。代码:

#define SBSERVPATH “/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices”
#define UIKITPATH “/System/Library/Frameworks/UIKit.framework/UIKit”

@implementation MSToolAirplaneMgr

  • (void)setIsInAirplaneMode:(BOOL)mode {
    mach_port_t *thePort;
    void *uikit = dlopen(UIKITPATH, RTLD_LAZY);
    if (!uikit) {
    NSLog(@“uikit----->error:%s”, dlerror());
    return;
    }
    int (*SBSSpringBoardServerPort)(void) = dlsym(uikit, “SBSSpringBoardServerPort”);
    if (dlerror() != NULL) {
    NSLog(@“SBSSpringBoardServerPort----->error:%s”, dlerror());
    }
    thePort = SBSSpringBoardServerPort();
    dlclose(uikit);
    NSLog(@“uikit success”);

    // Link to SBSetAirplaneModeEnabled
    void *sbserv = dlopen(SBSERVPATH, RTLD_LAZY);
    if (!sbserv) {
    NSLog(@“sbserv----->error:%s”, dlerror());
    return;
    }
    int (setAPMode)(mach_port_t port, BOOL status) = dlsym(sbserv, “SBSetAirplaneModeEnabled”);
    if (dlerror() != NULL) {
    NSLog(@“SBSSpringBoardServerPort----->error:%s”, dlerror());
    }
    setAPMode(thePort, mode);
    dlclose(sbserv);
    }

crash日志:
Nov 8 17:32:09 iPhone SpringBoard[96] <Warning>: Failed to setpriority() on <FBApplicationProcess: 0x139c0b740; bash; pid: 1057>: Unknown error: -1 (-1)

Nov 8 17:32:14 iPhone SpringBoard[96] <Warning>: HW kbd: Failed to set (null) as keyboard focus

Nov 8 17:32:14 iPhone SpringBoard[96] <Warning>: Application ‘UIKitApplication:com.morgen.MSTransform[0xbca1]’ crashed.

各位大神有经验的话可以帮我提供下思路、有代码的话更好~

函数指针本身打印出来看看呢

张总我刚看到,打印出来是null

不用dlopen的话,有木有其他办法能实现呢?

先把库导出来看看有没有这个符号,是不是私有符号

库的话是直接从手机拷贝出来的, 然后用论坛的方法导出来,能拿到二进制文件,但是二进制文件没办法class-dump

符号nm就可以了。。。。

不太懂。。。

nm 二进制 | grep “要找的符号”

1 个赞