检查macOS App是否曾经被隔离并完全启动

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

在一台Mac上,我得到以下两个Gatekeeper得分值: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,但看不到有什么方法可以完成我想要做的事情。

wwjj789456 回答:检查macOS App是否曾经被隔离并完全启动

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

文章指出(并且您自己的回答有些确认),第6位是“应用已打开”标志,第7位是“由网闸验证”。

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

calculator

在Swift中检查示例:

let flags = 0x1e3

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

我想我将继续下面的内容。经过进一步的测试,在macOS 10.11→10.15上,我始终看到这些值,因此我希望它们是准确的:

10.11:
已隔离:0002未隔离:0062

10.12→10.14:
已隔离:0183未隔离:01e3

10.15:
已隔离:0183未隔离:01c3

我的应用都使用开发者ID进行了代码签名,并且经过公证。

本文链接:https://www.f2er.com/2688982.html

大家都在问