查看原文
其他

手把手教你做屏蔽越狱检测的Tweak

AUV呀 移动安全星球 2023-01-20

手把手教你做屏蔽越狱检测的Tweak

什么是Tweak

Tweak实质是一种iOS平台上以dylib形式工作的动态库。通过Tweak的Info.plist中设置指定的BundleID,在打开对应App时,CydiaSubstrate就会让App去加载我们的Tweak了。

编写Tweak可以对指定应用进行Hook,修改函数逻辑,打印调用栈等。

创建Tweak项目

  1. 1. 可以通过Theos创建Tweak项目

  2. 2. 可以通过MonkeyDev直接创建LogosTweak项目或者CaptainHookTweak(推荐使用此种方式创建,方便快捷)

  3. 1)首先要安装MonkeyDev[1],安装步骤则根据wiki说明一步一步安装即可。

2)重启Xcode后,新建项目选择LogosTweak项目

3)创建一个AntiJailbreak的Tweak工程

  • • AntiJailbreak.xm:主要用来编写Hook代码(一开始并没有代码高亮,将Identity and Type设置为Objective-C++ Source然后重启项目)

  • • AntiJailbreak.mm:编译完成后,会将xm文件中的代码转为OC、C代码

  • • control:整个工程的信息,项目名称,作者名称,其中Depends为所需的依赖

  • • AntiJailbreak.plist:添加需要Hook的BundleID

  • • 在项目目录下还有一个Packages文件夹,并没有关联到项目中。编译成功后,会在该目录下生成插件的deb和zip包

4)了解了整个工程各个文件的作用,我们先直接来编译一次项目。首先会报一个An empty identity is not valid when signing a binary for the product type 'Dynamic Library.的错误

在TARGETS--BuildSettings--添加一个User-Defined--CODE_SIGNING_ALLOWED=NO

5)再次运行后,又会报错

如果手机已设置了免密登录,需要我们在User-Defined->MonkeyDevDeviceIP设置手机上的ip

再此编译后插件就已经安装到手机上了

Logos语法

  1. 1. Logos语法[2]

  2. 2. CydiaSubstrate的API[3]

我们这里就先了解几个经常使用的Logos语法

  • • %hook HOOK 某个类里面的某个方法

%hook ClassName
//对象方法
-(void)instanceMethod {
}
//类方法
+(void)classMethod {
}
%end
  • • %group 用来将代码分组。开发中hook代码会很多,这样方便管理Logos代码。和%init结合用

%group GROUP1
    %hook ClassName1
    
    -(void)method1{
    }
    %end
%end

%group GROUP2
    %hook ClassName2
    
    -(void)method2{
    }
    %end
%end
  • • %init 用来初始化某个组

  • • %ctor 构造函数,用于确定加载哪个组

%ctor {
    %init(GROUP1)%init(GROUP2)
}
  • • %orig 这个就是保持原有的方法实现,如果原来的方法有返回值,那么%orig 就有返回值的

- (BOOL)testOk:(NSString *)url{
        return %orig;
    }

开始编写插件

做了这么多准备工作,终于可以开始编写插件了:),首先我们要知道都有哪些方式检测越狱。这里我就不详细总结了,后面会单独出一篇越狱检测总结的文章,这里就以fileExistsAtPath这个方法为例。越狱成功后,如访问'/Applications/Cydia.app'、'/bin/bash'、'/usr/sbin/sshd'等路径均会返回true。所以我们的目的就是Hook该方法,当传入检测越狱的路径时就返回false。

NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:jailbreakPath]) {
    //你已经越狱
}
  1. 1. 使用%hook 该语法Hook NSFileManager的fileExistsAtPath,在代码中判断传入的路径

  2. 2. 在plist中设置要Hook的BundleID,运行后插件就安装到手机上了。

为插件设置开关

制作好插件后不知道大家有没有发现一个问题,plist中只能一个一个设置要生效的应用,而且每次设置完都要重新编译很不方便。如果想要生成一个在设置中可以打开关闭的插件则可以使用PreferenceLoader[4]

  1. 1. 确保Cydia已经安装了AppList、PreferenceLoader

  2. 2. 在Tweak项目中,Package目录下,创建PreferenceLoader目录,再从该目录下创建Preferences目录,然后新建一个plist文件,还要放入一个你想设置的图片

  3. 3. PreferenceLoader是一个MobileSubstrate提供的模块,它可以让开发者在系统设置界面添加应用程序入口。AppList是一个让开发者获取系统中已安装应用信息的库。这两个模块相结合即可实现Tweak设置开关的效果。plist中的内容主要如下

{
    entry = {
        cell = PSLinkCell;
        label = AntiJailbreak;
        icon = "logos.png";   //图片名字
        items = (
            {
                bundle = AppList;
                isController = 1;
                cell = PSLinkCell;
                label = "Enabled Applications";
                ALSettingsPath = "/var/mobile/Library/Preferences/cyc.AntiJailbreak.plist";
                ALSettingsKeyPrefix = "MyAntiJailbreak-";
                "ALSettingsDefaultValue" = 0;
                ALAllowsSelection = 1;
                ALChangeNotification = "cyc.AntiJailbreak.settingschanged";
                ALSectionDescriptors = (
                    {
                        title = "User Applications";
                        predicate = "isSystemApplication = FALSE";
                        "icon-size" = 29;
                        "suppress-hidden-apps" = 1;
                        "cell-class-name" = ALSwitchCell;
                    },
                    {
                        title = "System Applications";
                        predicate = "isSystemApplication = TRUE AND NOT (displayIdentifier IN {'com.iptm.bigboss.sbsettings', 'com.booleanmagic.overboard', 'eu.heinelt.ifile'})";
                        "icon-size" = 29;
                        "suppress-hidden-apps" = 1;
                        "cell-class-name" = ALSwitchCell;
                    },
                );
            },
            {
                cell = PSGroupCell;
                footerText = AntiJailbreak;
            },
        );
    };
}
  1. 4. 在xm文件中,修改成如下代码

  2. 5. 重新编译打包到手机上,我们就能在设置里看到开关了

测试最终效果

  1. 1. 以相同的方式,将其他的检测越狱的点一一Hook后,重新编译安装到手机上,我们来测试一下屏蔽越狱的效果。

  2. 2. 我们在AppStore上随便安装一个金融类的应用。打开后会提示:当前设备已越狱,点击确认后会退出应用。

  1. 3. 在插件中打开开关,重新运行应用,发现已经没有温馨提示了。(完整版插件可到星球自取)


引用链接

[1] MonkeyDev: https://github.com/AloneMonkey/MonkeyDev/wiki/%E5%AE%89%E8%A3%85
[2] Logos语法: https://theos.dev/docs/logos-syntax
[3] CydiaSubstrate的API: http://www.cydiasubstrate.com/api/c/MSHookFunction/
[4] PreferenceLoader: https://iphonedevwiki.net/index.php/PreferenceLoader







随手分享、点赞、在看是对我们最大的支持

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存