Detectando bibliotecas de terceiros em aplicativos Android com alta precisão e recall.
Yuan Zhang, Jiarun Dai, Xiaohan Zhang, Sirong Huang, Zhemin Yang, Min Yang, Hao Chen.
Em Proceedings of IEEE International Conference sobre análise de software, evolução e reengenharia, Saner'18, Campobasso, Itália, de 20 a 23 de março de 2018. [PDF]
As bibliotecas de terceiros são amplamente utilizadas em aplicativos Android para aliviar o desenvolvimento e aprimorar as funcionalidades. No entanto, as bibliotecas incorporadas também trazem novos problemas de segurança e privacidade para o aplicativo host e obscurecem a contabilidade entre o código do aplicativo e o código da biblioteca. Sob essa situação, um detector de biblioteca preciso e confiável é altamente desejável. De fato, o código da biblioteca pode ser personalizado pelos desenvolvedores durante a integração e o código da biblioteca morta pode ser eliminado pelos ofuscadores de código durante o processo de construção de aplicativos. No entanto, a pesquisa existente sobre a detecção de bibliotecas não lidou com esses problemas graciosamente, enfrentando severas limitações na prática.
Neste artigo, propomos LibPecker, um detector de biblioteca resiliente à ofuscação, altamente preciso e confiável para aplicações para Android. O LibPecker adota correspondência de assinatura para fornecer uma pontuação de similaridade entre uma determinada biblioteca e um aplicativo. Ao utilizar totalmente as dependências de classe interna dentro de uma biblioteca, o LibPecker gera uma assinatura estrita para cada classe. Para tolerar a personalização e a eliminação do código da biblioteca o máximo possível, o LibPecker apresenta o limiar de similaridade de classe adaptável e a pontuação de similaridade de classe ponderada ao calcular a similaridade da biblioteca. Para avaliar quantitativamente a precisão e o recall do LibPecker, realizamos o primeiro experimento desse tipo (até onde sabemos) com um grande número de bibliotecas e aplicações. Os resultados mostram que o LibPecker supera significativamente as ferramentas de última geração na recall e na precisão (91% e 98,1%, respectivamente).
Consideramos o problema da detecção da biblioteca em um cenário mais realista para os desenvolvedores de aplicativos incorporarem bibliotecas de terceiros, ou seja, a personalização e a eliminação do código podem ocorrer no nível de classe e no nível da classe. Em um aplicativo, não há limite claro entre o código do aplicativo e o código da biblioteca, tornando a detecção da biblioteca bastante desafiadora. Nossa abordagem utiliza a correspondência de similaridade no nível da classe para testar se as principais funcionalidades de uma biblioteca ainda estiverem presentes em um aplicativo. Ele pega uma cópia exata de uma determinada biblioteca e um aplicativo como entrada e calcula uma pontuação de similaridade (variando de 0 a 1) entre a biblioteca e o aplicativo. Se a pontuação de similaridade exceder um limite, o LibPecker relata que a biblioteca estará presente no aplicativo.
Conforme descrito na figura a seguir, nossa abordagem consiste em duas partes principais: a) geração de assinatura para todas as classes de biblioteca e aulas de aplicativos; b) Processo de correspondência da biblioteca para fornecer uma pontuação de similaridade entre uma determinada biblioteca e um determinado aplicativo com base nas assinaturas de classe. Mais detalhes podem ser encontrados em nosso artigo.

O LibPecker aceita duas entradas: um aplicativo Android (arquivo .apk) e uma biblioteca (arquivo .dex). O LibPecker retorna uma semelhança para descrever quanto código da biblioteca pode ser encontrado no aplicativo.
java -jar LibPecker.jar <apk_path> <lib_path>
Para transformar arquivos de biblioteca (como o arquivo .jar/.aar), você pode usar o comando dx no diretório bin .
##### Linux
./bin/dx --dex --output=<lib_dex> <lib_jar_path>
#####Windows
./bin/dx.sh --dex --output=<lib_dex> <lib_jar_path>
Também fornecemos alguns casos de teste no diretório de teste . Para testar esses casos, você pode executar este comando.
java -cp LibPecker.jar -Xmx4G cn.fudan.libpecker.main.TestDriver
A saída esperada é como a seguinte.
=== pass test: test/apk/3f217d600168e62b062b4c424ef4224d.apk test/lib/7f799553d1957873a92a2cf96b85ef2625195788ebbf6d7ae83ff3263c114c53.dex
similarity: 0.5920433145009416
=== pass test: test/apk/3f217d600168e62b062b4c424ef4224d.apk test/lib/9798a656af89d4f6e6c0d7ad60e4863347d89503a795381e51f6e463dc32fd6d.dex
similarity: 0.14186450492182975
=== pass test: test/apk/3f217d600168e62b062b4c424ef4224d.apk test/lib/a4564e66bacf765a2cd403d274c49380dc067c4ca2449e68fa6201da2ea783d9.dex
similarity: 0.35957322333349556
=== pass test: test/apk/3f217d600168e62b062b4c424ef4224d.apk test/lib/5277a56f0c4f8a18a35a2d7e020b0546436eb81c4b5c4e492dc3cfa36436e0b4.dex
similarity: 0.5954615408654523
=== pass test: test/apk/482c5db677fbf14040c93ddeb3714526.apk test/lib/163f8315a054e25db69d7b2b8aa6097804d1d4d30003dda4ff07be21678b9587.dex
similarity: 0.33905778602924114
=== pass test: test/apk/482c5db677fbf14040c93ddeb3714526.apk test/lib/af5b684ea74defaea3a8cdc5e67bebd9ed527673c6d00b691365e7c23319da67.dex
similarity: 0.0626696274364668
=== pass test: test/apk/482c5db677fbf14040c93ddeb3714526.apk test/lib/a873ffc1d69a6d38fff2bc9b17250963f09ee934aa8f86d2abb0ba80a4d4a38f.dex
similarity: 0.5981256669903423
=== pass test: test/apk/d11006c50e299a18539c6411285660a4.apk test/lib/e466ea56ddb39d05c43912dbafcd42ae5e178e80f5ebd1e7c0c3682e040ef4a6.dex
similarity: 0.9995280792826807
=== pass test: test/apk/d11006c50e299a18539c6411285660a4.apk test/lib/1ddc4f3804cdf219ae7feaf4647a5e1d79bfc1863208fac98cba54bf4b282994.dex
similarity: 1.0
=== pass test: test/apk/bb1ae8661d82b36fa26f9fe9801943c7.apk test/lib/bdabe04fa6179d13e590f6173acbc94d9ffdbc4b4a9310a989e30820c27b94e8.dex
similarity: 1.0
=== pass test: test/apk/bb1ae8661d82b36fa26f9fe9801943c7.apk test/lib/b46bf10c7a9e4dfa24c88f87d34a9dfb5248f7718f392e1518099f8d9f69cca5.dex
similarity: 0.9490735206216379
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/b42266a9b224e604911716c43bf2516cce03ad551d7db213747297efd866182c.dex
similarity: 1.0
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/967af7be58c4efde245efea26e544d4dabb351f09f396f41b40c78d32c2723a0.dex
similarity: 0.9999999999999998
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/cf0d095b6db6ecedd56654228db442f152c1445d07d9cca14c6a147b2c730f5a.dex
similarity: 0.9672300793377027
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/bc626e62b8783e095b3fd857423ef7713de12b2a9e89fa3280e45f5a9fdd7de7.dex
similarity: 0.9708244371118012
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/e466ea56ddb39d05c43912dbafcd42ae5e178e80f5ebd1e7c0c3682e040ef4a6.dex
similarity: 1.0
=== pass test: test/apk/6f35b5e01899df4cc91a31f2773b7217.apk test/lib/cf819dbfef851e6f21def64d3f4b4cc5d7425104b4830ec765dc5157c4453831.dex
similarity: 1.0
=== pass test: test/apk/6f35b5e01899df4cc91a31f2773b7217.apk test/lib/7cc2314e50de4dc66de7c108ab9c429f3122c6056855fac016fe2a00a9e4ee08.dex
similarity: 0.9999999999999993
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/44555093604035841f936e76428e8bc2087737d58387d2718c3878481332220b.dex
similarity: 1.0
=== pass test: test/apk/b75eef27fd4b3f5c65a8a1c7eb677d05.apk test/lib/798f6bed0fca807e9b47e2f3a0a2f99e4a0618e6cf0639b3444eb72f8a4933cf.dex
similarity: 0.9999999999999997
Para configurar o ambiente de desenvolvimento, você pode abrir diretamente o LibPecker.iml na idéia Intellij . Observe que o JDK 1.7 é necessário. Se você tiver mais perguntas, entre em contato com Yuanxzhang [at] fudan.edu.cn .
@inproceedings{libpecker-saner-2018,
author={Y. Zhang and J. Dai and X. Zhang and S. Huang and Z. Yang and M. Yang and H. Chen},
booktitle={2018 IEEE 25th International Conference on Software Analysis, Evolution and Reengineering (SANER)},
title={Detecting third-party libraries in Android applications with high precision and recall},
year={2018},
volume={},
number={},
pages={141-152},
keywords={Library Detection, Code Similarity, Obfuscation Resilienc},
doi={10.1109/SANER.2018.8330204},
ISSN={},
month={March},
}