手把手教你做屏蔽越狱检测的Tweak
手把手教你做屏蔽越狱检测的Tweak
什么是Tweak
Tweak实质是一种iOS平台上以dylib形式工作的动态库。通过Tweak的Info.plist中设置指定的BundleID,在打开对应App时,CydiaSubstrate就会让App去加载我们的Tweak了。
编写Tweak可以对指定应用进行Hook,修改函数逻辑,打印调用栈等。
创建Tweak项目
1. 可以通过Theos创建Tweak项目
2. 可以通过MonkeyDev直接创建LogosTweak项目或者CaptainHookTweak(推荐使用此种方式创建,方便快捷)
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. Logos语法[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. 使用%hook 该语法Hook NSFileManager的fileExistsAtPath,在代码中判断传入的路径
2. 在plist中设置要Hook的BundleID,运行后插件就安装到手机上了。
为插件设置开关
制作好插件后不知道大家有没有发现一个问题,plist中只能一个一个设置要生效的应用,而且每次设置完都要重新编译很不方便。如果想要生成一个在设置中可以打开关闭的插件则可以使用PreferenceLoader[4]。
1. 确保Cydia已经安装了AppList、PreferenceLoader
2. 在Tweak项目中,Package目录下,创建PreferenceLoader目录,再从该目录下创建Preferences目录,然后新建一个plist文件,还要放入一个你想设置的图片
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;
},
);
};
}
4. 在xm文件中,修改成如下代码
5. 重新编译打包到手机上,我们就能在设置里看到开关了
测试最终效果
1. 以相同的方式,将其他的检测越狱的点一一Hook后,重新编译安装到手机上,我们来测试一下屏蔽越狱的效果。
2. 我们在AppStore上随便安装一个金融类的应用。打开后会提示:当前设备已越狱,点击确认后会退出应用。
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
随手分享、点赞、在看是对我们最大的支持