檢測具有高精度和回憶的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},
}