Проверка того, что приложение macOS когда-либо было не помещено на карантин и запущено полностью - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь проверить, было ли когда-либо полностью загружено приложение, загруженное из inte rnet. Я пытаюсь использовать xattr -p com.apple.quarantine для этого, но возвращаемое значение из этой команды, похоже, не соответствует.

На одном Ма c я получаю в ответ эти два значения показателя Gatekeeper: 0183, если приложение никогда не запускалось полностью, и 01c3, если приложение запущено и пользователь нажал кнопку Открыть в Диалог GateKeeper «Вы действительно хотите открыть это приложение». На другом Ма c я получаю совершенно другие значения: 0003 & 0063.

Я предполагаю, что это 4 ди git шестнадцатеричных числа, которые я могу преобразовать следующим образом:

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 и получив все содержимое из таблицы LSQuarantineEvent в ~ / Library / Preferences / com.apple.LaunchServices.QuarantineEventsV2, а затем используя grep, чтобы найти соответствующую строку, но я не вижу никаких изменений в строке до / после полного запуска приложения.

Есть ли способ определить, может ли приложение запускаться полностью и не помещено в карантин? Я пытаюсь выполнить sh это с помощью 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, кажется, никогда не меняется.

Я прочитал этот пост и этот , но я не вижу способа достичь sh того, что я хочу сделать.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы пропустили один важный момент в статье, которую вы связали. Не относитесь к числам как к магическим c числам. Это флаги, и вы должны проверять отдельные биты для проверки определенного атрибута.

В статье говорится (и ваш собственный ответ несколько подтверждает), что 6-й бит - это флаг «Приложение открыто», а 7-й - «Проверено гейткипером» ”.

Вы можете проверить в приложении« Калькулятор », что эти два бита изменяются в ваших примерах:

calculator

Пример проверки в Swift:

let flags = 0x1e3

let checked =  (flags & 0b01000000) != 0 // true
let launched = (flags & 0b00100000) != 0 // true
0 голосов
/ 30 января 2020

Полагаю, я собираюсь просто go со следующим. После дальнейшего тестирования в macOS 10.11 → 10.15 я вижу эти значения последовательно, поэтому я надеюсь, что они точны:

10.11:
Карантин: 0002 Не помещен на карантин: 0062

10.12 → 10.14:
На карантине: 0183 Не на карантине: 01e3

10.15:
На карантине : 0183 Не помещен на карантин: 01c3

Мое приложение имеет кодовую подпись с идентификатором разработчика и заверено нотариально.

...