检测具有高精度和回忆的Android应用中的第三方库。
Yuan Zhang,Jiarun Dai,Xiaohan Zhang,Sirong Huang,Zhemin Yang,Min Yang,Hao Chen。
在2018年3月20日至23日,意大利坎巴巴索的IEEE国际软件分析,进化与重新设计国际会议论文集。[PDF]
第三方库被广泛用于Android应用中,以简化开发和增强功能。但是,合并的库还为主机应用程序带来了新的安全和隐私问题,并模糊了应用程序代码和库代码之间的会计。在这种情况下,非常需要精确且可靠的图书馆检测器。实际上,开发人员可以在集成过程中自定义库代码,并且在申请构建过程中,代码obfuscators可以消除库库代码。但是,现有关于图书馆检测的研究并未优雅地处理这些问题,因此在实践中面临严重的局限性。
在本文中,我们建议使用Android应用的混淆,高度精确且可靠的库检测器Libpecker。 Libpecker采用签名匹配,以在给定库和应用程序之间给出相似的分数。通过充分利用库中的内部类依赖关系,Libpecker为每个类生成一个严格的签名。为了尽可能容忍库代码自定义和消除,Libpecker在计算库相似性时引入了自适应类相似性阈值和加权类相似性得分。为了定量评估Libpecker的精确度和回忆,我们使用大量库和应用程序(据我们所知)进行了第一个这样的实验(据我们所知)。结果表明,Libpecker在召回和精确度中的表现明显优于最先进的工具(分别为91%和98.1%)。
我们在更现实的情况下考虑了库检测的问题,以使应用程序开发人员合并第三方库,即代码自定义,并且可以在集体级和集体会员级别上进行代码消除。在应用程序中,应用程序代码和库代码之间没有明确的边界,这使得库检测非常具有挑战性。我们的方法利用类级相似性匹配来测试应用程序中库的主要功能是否仍然存在。它将给定库和应用程序的精确副本作为输入,并计算库和应用程序之间的相似性分数(范围从0到1)。如果相似性分数超过阈值,则Libpecker报告了该库中存在的应用程序中存在。
如下图所示,我们的方法包括两个主要部分:a)所有图书馆类和应用程序类别的签名生成; b)库匹配过程,以根据类签名在给定库和给定应用程序之间提供相似性分数。更多细节可以在我们的论文中找到。

Libpecker接受两个输入:Android应用程序(.APK文件)和一个库(.dex文件)。 libpecker返回与描述在应用程序中可以找到多少库代码的相似之处。
java -jar LibPecker.jar <apk_path> <lib_path>
要转换库文件(例如.jar/.aar文件),您可以在bin目录中使用dx命令。
##### Linux
./bin/dx --dex --output=<lib_dex> <lib_jar_path>
#####视窗
./bin/dx.sh --dex --output=<lib_dex> <lib_jar_path>
我们还在测试目录中提供了一些测试用例。要测试这些情况,您可以运行此命令。
java -cp LibPecker.jar -Xmx4G cn.fudan.libpecker.main.TestDriver
预期输出就像以下内容。
=== 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
要设置开发环境,您可以在Intellij Idea中直接打开libpecker.iml 。请注意,需要JDK 1.7。如果您还有其他疑问,请联系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},
}