Pergunta

Um consenso em desenvolvimento entre a comunidade de desenvolvedores do iPhone é que a Apple recentemente começou a utilizar uma ferramenta de análise estática de código para detectar o uso de chamadas de API sem documentos.

Apenas por uma questão de argumento, gostaria de saber se seria possível contornar esta ferramenta, gerando a invocação em tempo de execução como este:

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];

Isto quase parece muito fácil, então eu pergunto - o que eu estou ausente? Como pode a Apple possivelmente detectar isso usando análise estática de código no conjunto?

Um par de pontos:

  1. Estou ciente de que o nome do método será ser armazenados no binário como uma estática corda. No entanto, seria trivial para gerar o nome do método em tempo de execução bem como usando stringWithFormat: ou outro tipo de ligeiro obscurecimento (a suficiente confundir o analisador de estático).
  2. Eu sei que este truque seria revelado pelo mesmo a análise de tempo de execução trivial mais usando gdb - meu entendimento foi de que a Apple analisa o binário em si, e talvez eu estou completamente errado sobre isso
  3. .
Foi útil?

Solução

cuidado Por quê? Você não deveria usar API privada por uma boa razão:. Apple poderia facilmente quebrar o seu pedido a qualquer momento, perturbando seus usuários

Dito isso, o uso de NSInvocation, -performSelector: ou qualquer outra técnica semelhante é provavelmente o suficiente para detecção de evitar por um analisador estático

.

Outras dicas

Eu suponho que você já leu este artigo . Também interessante é este . Minha interpretação é que analisador estático da Apple gera falsos positivos só porque algumas pessoas usam métodos que têm o mesmo nome de métodos privados. Isto não teria acontecido se o analisador tinha feito tanto uma análise de tempo de execução ou verificação completa dos quais selector classes foi chamado. Assim, parece que eles são principalmente à procura de cordas ou selectores de correspondência em seu binário. Eu acho que o uso de NSInvocation combinado com alguma ofuscação corda vai te passar. Eu ainda recomendo para não depender de APIs privadas, no entanto.

Não há uma maneira fácil de descobrir!

Faça um aplicativo que usa deliberadamente uma api escondida através do método na sua pergunta e vê-lo se for aceito!

Sam

PS Se você encontrar para fora, certifique-se de nos dizer; Todos nós gostaríamos de saber com certeza e Apple certamente não vai nos dizer!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top