gpt4 book ai didi

objective-c - 检查 macOS 应用程序是否已被隔离并完全启动

转载 作者:行者123 更新时间:2023-12-03 16:56:29 25 4
gpt4 key购买 nike

我正在尝试检查从互联网下载的应用程序是否已完全启动。我尝试使用 xattr -p com.apple.quarantine 来执行此操作,但此命令的返回值似乎不一致。

在一台 Mac 上,我在返回中得到这两个 Gatekeeper Score 值:0183(如果应用程序从未完全启动)和 01c3(如果应用程序已启动并且用户在 GateKeeper“您确实要打开此应用程序”对话框中单击“打开”。在另一台 Mac 上,我得到完全不同的值:00030063

我猜这些是 4 位十六进制数字,我可以这样转换:

NSString *gateKeeperScore = [outputItems firstObject];
NSScanner *scanner = [NSScanner scannerWithString:gateKeeperScore];
unsigned int number = 0;
if ([scanner scanHexInt:&number]) {
NSLog(@"Gatekeeper Score is %u", number);
}

但是是否存在阈值,一旦分数超过该阈值,我就可以放心地假设该应用已完全启动并且不再被隔离?

我尝试运行 SQL select 语句并从 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 中的表 LSQuarantineEvent 获取全部内容,然后使用 grep 查找相关内容行,但在应用程序完全启动之前/之后我没有看到该行有任何变化。

有什么方法可以确定应用程序是否可以完全启动并且未被隔离?我正在尝试使用 Objective-C 来实现这一点。没有沙箱。提前致谢!

这是我正在做的一些示例代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSString *output1 = [self runTask: [NSArray arrayWithObjects:@"-c", @"xattr -p com.apple.quarantine '/path/to/app'", nil]];

NSArray *outputItems = [output1 componentsSeparatedByString:@";"];
NSString *UUID = [outputItems lastObject];
UUID = [UUID stringByReplacingOccurrencesOfString:@"[\r\n]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, UUID.length)];

NSString *output2 = [self runTask: [NSArray arrayWithObjects:@"-c", [NSString stringWithFormat:@"sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2 \"SELECT * FROM LSQuarantineEvent WHERE LSQuarantineEventIdentifier == '%@'\"", UUID], nil]];
}

- (NSString *) runTask : (NSArray *) args
{
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/bash"];

[task setArguments:args];

NSPipe * taskOutput = [NSPipe pipe];
[task setStandardOutput:taskOutput];

[task launch];
[task waitUntilExit];

NSFileHandle * read = [taskOutput fileHandleForReading];
NSData * dataRead = [read readDataToEndOfFile];
NSString * taskOutputString = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];

return taskOutputString;
}

output1 的值如下所示:

01c3;5e31c850;Safari;92CB3715-7A0F-4582-9FF3-9B0CBE2A23BB

在应用程序完全启动之前/之后,只有前 4 个字符会发生变化。

output2 的值如下所示:

92CB3715-7A0F-4582-9FF3-9B0CBE2A23BB|602013648.990506|com.apple.Safari|Safari|https://url/of/files/origin|||0|||

SQL DB 中的这个值/行似乎永远不会改变。

我已通读 this postthis one但我没有看到任何方法来完成我想要做的事情。

最佳答案

您错过了所链接文章中的一个关键点。不要将这些数字视为神奇的数字。这些是标志,您应该检查各个位以检查特定属性。

文章指出(您自己的回答在某种程度上证实了)第 6 位是“应用程序已打开”标志,第 7 位是“由 Gatekeeper 验证”。

您可以在计算器应用程序中检查示例中这两位的变化:

calculator

Swift 中的检查示例:

let flags = 0x1e3

let checked = (flags & 0b01000000) != 0 // true
let launched = (flags & 0b00100000) != 0 // true

关于objective-c - 检查 macOS 应用程序是否已被隔离并完全启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59974353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com