Como a Apple sabe que você está usando API privada?

Eu enviei um arquivo binário para a Apple sem qualquer código-fonte.

Além de verificar manualmente o código-fonte, como a Apple sabe o que foi usado e quais APIs você chamou?

Existem 3 maneiras que eu conheço. Estas são apenas algumas especulações, já que eu não trabalho na equipe de revisão da Apple.

1. otool -L

Isso listará todas as bibliotecas às quais o aplicativo está vinculado. Algo que você não deve usar, como o IOKit e o WebKit podem ser detectados por isso.

2. nm -u

Isso listará todos os símbolos vinculados. Isso pode detectar

  • Funções C não documentadas, como _UIImageWithName;
  • Objetivo-C classs como UIProgressHUD
  • Ivars como UITouch._phase (que pode ser a causa da rejeição de aplicativos baseados no Three20 nos últimos meses).

3. Listando Seletores de Objective-C ou strings

Os seletores Objective-C são armazenados em uma região especial do binário e, portanto, a Apple pode extrair o conteúdo de lá e verificar se você usou alguns methods Objective-C não documentados, como -[UIDevice setOrientation:] .

Como os seletores são independentes da class que você está -setOrientation: mensagens, mesmo que sua class personalizada defina -setOrientation: irrelevante para o UIDevice, haverá a possibilidade de ser rejeitado.


Você poderia usar o APIKit de Erica Sadun para detectar rejeição em potencial devido a (alarmes falsos de) APIs privadas.


(Se você realmente realmente quiser trabalhar com essas verificações, você pode usar resources de tempo de execução como

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey: object_getInstanceVariable, object_getIvar, etc.

para obter essas bibliotecas privadas, classs, methods e ivars. )

Você pode listar os seletores em um programa Mach-O usando o seguinte one-liner no Terminal:

 otool -s __TEXT __objc_methname "$1" |expand -8 | cut -c17- | sed -n '3,$p' | perl -n -e 'print join("\n",split(/\x00/,scalar reverse (reverse unpack("(a4)*",pack("(H8)*",split(/\s/,$_))))))' 

Digamos que você queira usar alguma API privada. O objective C permite que você construa qualquer SEL a partir de uma string:

  SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\ @"%@%@%@", "se","tOr","ientation:"]); [UIDevice performSelector:my_sel ...]; 

Como uma varredura de robô ou biblioteca poderia detectar isso? Eles teriam que pegar isso usando alguma ferramenta que monitora os accesss privados em tempo de execução. Mesmo que eles construíssem uma ferramenta de tempo de execução desse tipo, é difícil detectar porque essa chamada pode estar oculta em algum caminho raramente exercido.

Eu imagino que eles olham para todos os símbolos que seu binário está tentando importar (informações sem dúvida facilmente disponíveis para eles na tabela de símbolos) e ding você se algum desses símbolos for encontrado em sua “lista privada de APIs”. Muito fácil de automatizar, na verdade.

Um executável não é exatamente uma checkbox preta. Se você chamar uma biblioteca, é fácil encontrá-la. É por isso que lamento a perda das linguagens assembly nas educações modernas de CS. =] Ferramentas como o ldd lhe dirão o que você ligou, embora eu não me lembre de qual encarnação do ldd chegou ao kit de desenvolvimento do mac iPhone.

 otool -L somebinary 

Mesmo se você estiver vinculando estaticamente, na pior das hipóteses, eles poderiam obter amostras do código das APIs privadas em sua lista e pesquisar seu binário com relação a elas (também é relativamente fácil automatizar).

Conhecendo a Apple, aposto que eles têm um sistema abrangente e automatizado, e qualquer incerteza provavelmente é negada ou revisada manualmente.

Fim do dia, acho que provavelmente não vale a pena tentar enganar a Apple.

Este aplicativo de área de trabalho, o App Scanner , pode digitalizar arquivos .app para uso da API privada, separando o arquivo Binário Mach-O. Se puder, então a Apple também pode!

Além da investigação do símbolo …

apple poderia muito facilmente ter uma versão do sdk que verifica cada uma das pilhas de methods privados quando chamada para ter certeza de que é inserida a partir de um dos methods designados.

Intereting Posts