Вопрос

Сообщество разработчиков iPhone все больше склоняется к тому, что Apple недавно начала использовать инструмент статического анализа кода для обнаружения недокументированных вызовов API.

Просто ради аргумента, мне интересно, можно ли было бы обойти этот инструмент, сгенерировав вызов во время выполнения следующим образом:

NSString *const aMethod = @"doStuff:withStuff:";
SEL aSelector = NSSelectorFromString(aMethod);
NSMethodSignature *aSignature = [targetObject methodSignatureForSelector:aSelector];
NSInvokation *anInvokation = [NSInvokation invocationWithMethodSignature:aSignature];
[anInvokation setTarget:targetObject];
[anInvokation setSelector:aSelector];
[anInvokation setArgument:&firstArg atIndex:2];
[anInvokation setArgument:&secondArg atIndex:3];
[anInvokation invoke];

Это кажется слишком простым, поэтому я задаюсь вопросом - что я упускаю?Как Apple может обнаружить это с помощью статического анализа кода в сборке?

Пара моментов:

  1. Я знаю, что имя метода будет сохранено в двоичном файле в виде статической строки.Однако было бы тривиально также генерировать имя метода во время выполнения, используя stringWithFormat:или другой тип незначительной путаницы (достаточной, чтобы запутать статический анализатор).
  2. Я знаю, что этот трюк был бы обнаружен даже при самом тривиальном анализе времени выполнения с использованием gdb - насколько я понимаю, Apple анализирует сам двоичный файл, и, возможно, я совершенно не прав в этом.
Это было полезно?

Решение

Зачем это нужно? Вы не должны использовать закрытый API по уважительной причине: Apple может легко сломать ваше приложение в любое время, расстроив ваших пользователей.

Тем не менее, использование NSInvocation, -performSelector: или любого другого подобного метода, вероятно, достаточно, чтобы избежать обнаружения статическим анализатором.

Другие советы

Есть простой способ узнать это!

Создайте приложение, которое намеренно использует скрытый api с помощью метода, указанного в вашем вопросе, и посмотрите, будет ли оно принято!

Сэм

PS Если вы все-таки узнаете, обязательно сообщите нам;мы все хотели бы знать наверняка, но Apple наверняка нам не скажет!

scroll top