Para o mesmo aplicativo, eu tenho:
- um APK de uma loja de aplicativos,
- o que é reivindicado ser o código fonte da mesma versão. Com um script e estrutura bastante comuns, o Gradle constrói.
Quero verificar se o APK foi realmente criado a partir desse código-fonte ou não.
Como verificar isso?
Notas:
- O APK não está ofuscado.
- Não tenho motivos para confiar na assinatura de ninguém. Eu confio apenas no código fonte.
- Eu já construí o aplicativo para mim, mas agora quero saber se o APK está bom ou não.
- De preferência com ferramentas de linha de comando do Linux, mas qualquer ferramenta está OK.
.apk
arquivos e execute uma comparação nos diretórios resultantes. A única diferença então deve ser a assinatura (que não pode corresponder por razões óbvias). Pensando nisso: simplesmente descompactar os.apk
arquivos e fazer uma comparação binária deve fazer o mesmo. Ambos seria, evidentemente exigem ter usado as mesmas versões de bibliotecas etc. durante a compilação, em primeiro lugar :)diff
método parece legal ... mas e se os caras da loja de aplicativos ofuscarem o APK durante a compilação?Respostas:
Você só pode fazer isso com construções reproduzíveis:
Portanto, o desenvolvedor do aplicativo ou a loja de aplicativos precisa estar a bordo para que ele funcione.
Caso contrário, sua única opção é construir você mesmo.
Um exemplo de desenvolvedor que atualmente faz isso é o Open Whisper Systems: https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds
fonte
Uma grande coisa sobre java e APKs é que você pode descompilar completamente o APK para o código-fonte java.
No entanto, não é garantido que o código fonte resultante seja idêntico.
Uma boa maneira de tentar combinar o código-fonte resultante com uma revisão conhecida é verificar quais modificações foram feitas diretamente antes e depois da confirmação conhecida no repositório e ver se essas modificações também estão presentes na fonte descompilada.
Para descompilar, use dex2jar e JD-Gui .
edit Acabei de notar que você queria ferramentas linux. Minha única experiência é com o Windows, mas tenho certeza que existem ferramentas semelhantes para o Linux.
fonte