Como determinar em tempo de execução se o aplicativo for para desenvolvimento, loja de aplicativos ou distribuição ad hoc?

StackOverflow https://stackoverflow.com/questions/3426467

Pergunta

Existe uma maneira de determinar programaticamente se o aplicativo atualmente em execução foi construído e assinado apenas para desenvolvimento ou se foi construído para distribuição? E pode -se determinar se foi construído para a App Store ou a distribuição ad hoc?

Por exemplo, é possível acessar a assinatura do código e obter as informações a partir daí? Ou existem certos arquivos presentes em uma das variantes que não existem nos outros? Parte das informações do pacote? Ou pode ser derivado do arquivo executável?

Quaisquer dicas são apreciadas.


Parece que o arquivo incorporado.MobileProvision está no formato ASN.1.

Foi útil?

Solução

A maneira mais fácil de verificar é olhar embedded.mobileprovision ([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]):

  • É um pouco difícil analisar, pois é um Plist assinado (PKCS#7 assinado dados, de acordo com openssl asn1parse -inform der), mas um hack ruim é apenas procurar <plist e </plist>.
  • O desenvolvimento contém udids e <key>get-task-allow</key><true/>
  • A distribuição ad hoc contém UDIDs (e get-task-call = false)
  • A distribuição da App Store não contém UDIDs.

A outra coisa que você pode verificar são os direitos incorporados no executável (otool -l lista como LC_CODE_SIGNATURE). Analisando isso é ainda mais tedioso (você precisa analisar os comandos Mach-O Cabeçalho e Carregar e, para os binários "universais" que agora são o padrão, você precisará verificar a arquitetura atualmente carregada ou todas as arquiteturas).

  • As construções de desenvolvimento contêm <key>get-task-allow</key><true/>
  • Ad hoc e as compilações da loja de aplicativos contêm <key>get-task-allow</key><false/>

Não acho que os direitos distinguam entre as compilações ad hoc e a App Store.

Além desses e do certificado com o qual assinou, não há diferença entre os aplicativos de desenvolvimento/ad hoc/aplicativo (há algumas outras coisas no perfil de direitos/provisionamento, mas nada mais confiável que eu consigo pensar).

Considerações de segurança

Nenhum deles é tão difícil de contornar. Para o primeiro método, o aplicativo poderia simplesmente "Swizzle" -[NSBundle pathForResource:ofType:]. O segundo método é um pouco mais difícil, dependendo da API que você usa para ler o arquivo.

Outras dicas

openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54 é a maneira mais fácil de acessar os dados que encontrei.

EDITAR:

security cms -D -i *Mobile_Provision_File* é realmente mais fácil. O comando OpenSSL deixa um pouco de lixo na saída.

Extraí um arquivo incorporado. http://www.geocities.co.jp/siliconvalley-sanjose/3377/asn1js.html), e é isso que tenho:

SEQUENCE {
   OBJECTIDENTIFIER 1.2.840.113549.1.7.2 (signedData)
   [0] {
      SEQUENCE {
         INTEGER 1
         SET {
            SEQUENCE {
               OBJECTIDENTIFIER 1.3.14.3.2.26
               NULL 
            }
         }
         SEQUENCE {
            OBJECTIDENTIFIER 1.2.840.113549.1.7.1 (data)
            [0] {
               OCTETSTRING 3c3f786d6c20766 ... 6c6973743e0a
            }
         }
         [0] {
            SEQUENCE {
               SEQUENCE {
                  [0] {
                     INTEGER 2
                  }
 ... [much more]

Com isso e algum conhecimento do ASN.1, sua explicação faz todo o sentido.

A parte interessante é a sequência de octeto que inicia 3C3F786D6C. Essa é a parte XML no formato da lista de propriedades da Apple que contém todas as respostas sobre o tipo de distribuição (desenvolvedor, ad-hoc, loja de aplicativos).

#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif

É assim que eu distingo o modo de depuração e liberação,

Mas não tenho idéia do ADHOC ou produção, a menos que use o nome do perfil de provisão

Eu crio uma essência para detectar a construção ad hoc
Ver : https://gist.github.com/ishawnwang/d904934efded271d83b36288562df410

Detectar o ADHOC com as seguintes 2 condições:

1.embedded.mobileprovision contém campo ProvisionedDevices (Debug e Ad Hoc Build contém esse campo, libere não)

2. Não é uma construção de depuração, podemos usar #ifdef DEBUG para decidir

NS_INLINE BOOL isAdHoc(){
    BOOL isAdHoc = NO;
    BOOL isDebug;

#ifdef DEBUG
    isDebug=YES;
#else
    isDebug=NO;
#endif

    NSData *data=[NSData dataWithContentsOfURL:[[NSBundle mainBundle]URLForResource:@"embedded" withExtension:@"mobileprovision"]];
    NSString *str=[[NSString alloc]initWithData:data encoding:NSISOLatin1StringEncoding];
    NSRange rangeOfDevicesUDIDs = [str rangeOfString:@"ProvisionedDevices"];

    isAdHoc = rangeOfDevicesUDIDs.location!=NSNotFound && !isDebug;
    return isAdHoc;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top