IOS - 越狱检测

这篇具有很好参考价值的文章主要介绍了IOS - 越狱检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

判断是否能打开越狱软件

利用URL Scheme来查看是否能够代开比如cydia这些越狱软件

    //Check cydia URL hook canOpenURL 来绕过
    if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.avl.com"]])
    {
        return YES;
    }

    if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]])
    {
        return YES;
    }
 frida-trace -U -f 包名  -m  "+[NSURL URLWithString:]"

包名 可以用 frida-ps -Ua来查看, 然后更改生成的js路径脚本

 /*
 * Auto-generated by Frida. Please modify to match the signature of +[NSURL URLWithString:].
 * This stub is currently auto-generated from manpages when available.
 *
 * For full API reference, see: https://frida.re/docs/javascript-api/
 */

{
  /**
   * Called synchronously when about to call +[NSURL URLWithString:].
   *
   * @this {object} - Object allowing you to store state for use in onLeave.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {array} args - Function arguments represented as an array of NativePointer objects.
   * For example use args[0].readUtf8String() if the first argument is a pointer to a C string encoded as UTF-8.
   * It is also possible to modify arguments by assigning a NativePointer object to an element of this array.
   * @param {object} state - Object allowing you to keep state across function calls.
   * Only one JavaScript function will execute at a time, so do not worry about race-conditions.
   * However, do not use this to store function arguments across onEnter/onLeave, but instead
   * use "this" which is an object for keeping state local to an invocation.
   */
  onEnter(log, args, state) {
	var URLName = ObjC.Object(args[2]);
	if(URLName.containsString_) {
		if(URLName.containsString_("http://") ||
		   URLName.containsString_("https://") ||
		   URLName.containsString_("file://")
		) {

		} else {
			if(URLName.containsString_("://")) {
				log(`+[NSURL URLWithString:]` + URLName);
				args[2] = ObjC.classes.NSString.stringWithString_("xxxxxx://");
			}
		}
	}

  },

  /**
   * Called synchronously when about to return from +[NSURL URLWithString:].
   *
   * See onEnter for details.
   *
   * @this {object} - Object allowing you to access state stored in onEnter.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {NativePointer} retval - Return value represented as a NativePointer object.
   * @param {object} state - Object allowing you to keep state across function calls.
   */
  onLeave(log, retval, state) {
  }
}

判断是否可以访问一些越狱的文件

越狱后会产生额外的文件,通过判断是否存在这些文件来判断是否越狱了,可以用fopen和FileManager两个不同的方法去获取

BOOL fileExist(NSString* path)
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL isDirectory = NO;
    if([fileManager fileExistsAtPath:path isDirectory:&isDirectory]){
        return YES;
    }
    return NO;
}

BOOL directoryExist(NSString* path)
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL isDirectory = YES;
    if([fileManager fileExistsAtPath:path isDirectory:&isDirectory]){
        return YES;
    }
    return NO;
}

BOOL canOpen(NSString* path)
{
    FILE *file = fopen([path UTF8String], "r");
    if(file==nil){
        return fileExist(path) || directoryExist(path);
    }
    fclose(file);
    return YES;
}

 
 NSArray* checks = [[NSArray alloc] initWithObjects:@"/Application/Cydia.app",
                       @"/Library/MobileSubstrate/MobileSubstrate.dylib",
                       @"/bin/bash",
                       @"/usr/sbin/sshd",
                       @"/etc/apt",
                       @"/usr/bin/ssh",
                       @"/private/var/lib/apt",
                       @"/private/var/lib/cydia",
                       @"/private/var/tmp/cydia.log",
                       @"/Applications/WinterBoard.app",
                       @"/var/lib/cydia",
                       @"/private/etc/dpkg/origins/debian",
                       @"/bin.sh",
                       @"/private/etc/apt",
                       @"/etc/ssh/sshd_config",
                       @"/private/etc/ssh/sshd_config",
                       @"/Applications/SBSetttings.app",
                       @"/private/var/mobileLibrary/SBSettingsThemes/",
                       @"/private/var/stash",
                       @"/usr/libexec/sftp-server",
                       @"/usr/libexec/cydia/",
                       @"/usr/sbin/frida-server",
                       @"/usr/bin/cycript",
                       @"/usr/local/bin/cycript",
                       @"/usr/lib/libcycript.dylib",
                       @"/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist",
                       @"/System/Library/LaunchDaemons/com.ikey.bbot.plist",
                       @"/Applications/FakeCarrier.app",
                       @"/Library/MobileSubstrate/DynamicLibraries/Veency.plist",
                       @"/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist",
                       @"/usr/libexec/ssh-keysign",
                       @"/usr/libexec/sftp-server",
                       @"/Applications/blackra1n.app",
                       @"/Applications/IntelliScreen.app",
                       @"/Applications/Snoop-itConfig.app"
                       @"/var/lib/dpkg/info", nil];
    //Check installed app
    for(NSString* check in checks)
    {
        if(canOpen(check))
        {
            return YES;
        }
    }
 frida-trace -U -f 包名  -m  "-[NSFileManager fileExistsAtPath:]"
/*
 * Auto-generated by Frida. Please modify to match the signature of -[NSFileManager fileExistsAtPath:].
 * This stub is currently auto-generated from manpages when available.
 *
 * For full API reference, see: https://frida.re/docs/javascript-api/
 */

{
  /**
   * Called synchronously when about to call -[NSFileManager fileExistsAtPath:].
   *
   * @this {object} - Object allowing you to store state for use in onLeave.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {array} args - Function arguments represented as an array of NativePointer objects.
   * For example use args[0].readUtf8String() if the first argument is a pointer to a C string encoded as UTF-8.
   * It is also possible to modify arguments by assigning a NativePointer object to an element of this array.
   * @param {object} state - Object allowing you to keep state across function calls.
   * Only one JavaScript function will execute at a time, so do not worry about race-conditions.
   * However, do not use this to store function arguments across onEnter/onLeave, but instead
   * use "this" which is an object for keeping state local to an invocation.
   */
  onEnter(log, args, state) {
	var fileName = ObjC.Object(args[2]);
	if(fileName.containsString_) {
		if(fileName.containsString_("apt") ||
	       fileName.containsString_("MobileSubstrate") ||
	       fileName.containsString_("Cydia") ||
	       fileName.containsString_("bash") ||
	       fileName.containsString_("ssh") ||
		   fileName.containsString_("/bin/sh") ||
	       fileName.containsString_("Applications") ||
		   fileName.containsString_("/bin/su") ||
		   fileName.containsString_("dpkg") 
	    ) {
			console.log('fileExistsAtPath called from:\n' +
				Thread.backtrace(this.context, Backtracer.ACCURATE)
					.map(DebugSymbol.fromAddress).join('\n') + '\n');
		   args[2] = ObjC.classes.NSString.stringWithString_("/xxxxxx");
		   log(`-[NSFileManager fileExistsAtPath: ${fileName}`);
	    }
	}
	//log(`-[NSFileManager fileExistsAtPath: ${fileName}`);
	
  },

  /**
   * Called synchronously when about to return from -[NSFileManager fileExistsAtPath:].
   *
   * See onEnter for details.
   *
   * @this {object} - Object allowing you to access state stored in onEnter.
   * @param {function} log - Call this function with a string to be presented to the user.
   * @param {NativePointer} retval - Return value represented as a NativePointer object.
   * @param {object} state - Object allowing you to keep state across function calls.
   */
  onLeave(log, retval, state) {

  }
}

关键词检测 :JailBroken 及 JailBreak 等;

使用frida脚本简单干掉:

在启动就注入进去, -f是通过spawn,也就是重启apk注入js

frida -U -f 包名 --no-pause -l 过越狱检测.js文章来源地址https://www.toymoban.com/news/detail-507347.html

//越狱检测- 简单先将返回1的Nop掉
var resolver = new ApiResolver('objc');
resolver.enumerateMatches('*[* *Jailb*]', {
    onMatch: function (match) {
        let funcName = match.name;
        let funcAddr = match.address;
        Interceptor.attach(ptr(funcAddr), {
            onEnter: function (args) {

            }, onLeave: function (retval) {
                if (retval.toInt32() === 1) {
                    retval.replace(0);
                }
                console.log(funcName, retval);
            }
        });
    }, onComplete: function () {

    }
});
resolver.enumerateMatches('*[* *JailB*]', {
    onMatch: function (match) {
        let funcName = match.name;
        let funcAddr = match.address;
        Interceptor.attach(ptr(funcAddr), {
            onEnter: function (args) {

            }, onLeave: function (retval) {
                if (retval.toInt32() === 1) {
                    retval.replace(0);
                }
                console.log(funcName, retval);
            }
        });
    }, onComplete: function () {

    }
});
resolver.enumerateMatches('*[* *jailB*]', {
    onMatch: function (match) {
        let funcName = match.name;
        let funcAddr = match.address;
        Interceptor.attach(ptr(funcAddr), {
            onEnter: function (args) {

            }, onLeave: function (retval) {
                if (retval.toInt32() === 1) {
                    retval.replace(0);
                }
                console.log(funcName, retval);
            }
        });
    }, onComplete: function () {

    }
});

到了这里,关于IOS - 越狱检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 利用逻辑回归判断病人肺部是否发生病变

          大家好,我是带我去滑雪!       判断肺部是否发生病变可以及早发现疾病、指导治疗和监测疾病进展,以及预防和促进肺部健康,定期进行肺部评估和检查对于保护肺健康、预防疾病和提高生活质量至关重要。本期将利用相关医学临床数据结合逻辑回归判断病人肺部

    2024年02月11日
    浏览(29)
  • 利用Matlab判断系统是否可控可观测

    自动控制系统中,经常会遇到需要判断系统是否可控可观测的情况,Matlab在这方面处理很方便快捷。 对于一个线性时不变动态方程来讲,系统是否可控可以使用判据 [ B , A B , A 2 B , . . . , A n − 1 B ] [B ,AB ,A^2B,...,A^{n-1}B] [ B , A B , A 2 B , . . . , A n − 1 B ] 进行判断,也就是判断这

    2024年02月03日
    浏览(42)
  • 利用C语言去判断是否为整数

    整型 int: 例如: int a=-3.2;   ----  输出:-3             int b=4.75;  ----- 输出:4 直接取整数部分!!! 故引出判断方法: C语言中可以有强制转换类型的操作!!!  if (  float    ==    int )   return true;   ps:个人经验,心得理解分享! (仅供参考)

    2024年02月08日
    浏览(41)
  • 第四节(1):EXCEL中判断一个WORD文件是否被打开

    《VBA信息获取与处理》教程(10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用

    2024年02月07日
    浏览(46)
  • 利用OpenCV判断图像是否过亮或过暗

    在处理图像自动亮度调节时,需要判断图像是否过亮或者过暗,从而根据图像给出的结果,进行调节。方法如下:

    2024年02月15日
    浏览(37)
  • 利用JavaRestClient实现创建、删除索引库,判断索引库是否存在

    在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。 1)引入es的RestHighLevelClient依赖: 注:导入的依赖的版本要和打开的es的版本对应  2)初始化RestHighLevelClient:    把建库的json封

    2024年02月11日
    浏览(63)
  • Unity利用正则表达式判断字符串是否满足要求

    首先该方法属于C#,是C#提供的,不是unity提供的,但我使用这个是在unity中使用的,故此我将其归入unity笔记。 该方式可用于注册、登录等等需要用户输入的场景,用以判断字符串是否满足正则表达式的要求 首先介绍该API 这里开始介绍,大家可以看看官方的文档Regex.IsMatch 方

    2024年01月16日
    浏览(49)
  • 利用java语言中的stream流操作判断一个数组中是否有重复元素

    判断数组中是否有重复元素可以说是每一个编程语言初学者都会遇到的题目,常见的各种搜索算法本文不做赘述了,我们这次介绍的是利用java语言中特有的stream流操作来判断通用类型数组是否包含重复元素。 首先我们声明一个泛型方法: 表明该方法适用于所有类型的数组。

    2024年02月12日
    浏览(46)
  • 【车道线检测】边缘检测+Hough变换车道线视频自动检测(判断是否偏离)【含Matlab源码 4083期】

    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。 🍎个人主页:海神之光 🏆代码获取方式: 海神之光Matlab王者学习之路—代码获取方式 ⛳️座右铭:行百里者,半于九十。 更多Matlab仿真内容点击👇 Matlab图像处理(进阶版) 路径规划

    2024年04月08日
    浏览(38)
  • Python-opencv实现目标检测定位:判断固定颜色物体是否在规定区域内

    主要实现实时检测视频或者摄像头中出现的固定颜色(本例中使用绿色)是否在规定的区域范围内,并将结果反馈到原视频上。 实现的效果如下图所示: 1、当绿色物体出现在屏幕中的黑框中时,在视频左上角反馈一个“True”的信息。 2、当绿色物体出现在屏幕中但没有完全

    2024年01月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包