Page 319 - 《软件学报》2024年第6期
P. 319

徐建 等: LibPass: 基于包结构和签名的第三方库检测方法                                                2895


                    通过上述    3  种不同策略构建的基准数据集对于第三方库检测能力评价提供了不同的支撑, 差异之处可以概括
                 如表  4  所示.

                                       表 4    不同基准数据集在第三方检测能力评价上的差异

                                                     检测能力
                   基准数据集            规模                               抗混淆能力        检测效率        主模块分析
                                                 precision  recall
                     GTB-1        10 000 APKs      √         √          ×            ×           ×
                     GTB-2        1 000 APKs       ×         √          ×            √           √
                     GTB-3       [200, 282] APKs   √         √          √            ×           ×

                  3.2   TPL  本地库
                    TPL  本地库的完整性也是影响基于相似性比较的                  TPL  检测方法准确性和效率的一个重要因素. 然而,
                 Android  社区并没有统一的    TPL  发布平台和规范. 开发者使用的         TPL  主要来源于   GitHub  或者  Maven  等代码托管
                 仓库, 因此存在版本不完整、新          TPL  或新版本上线后不能及时更新等问题, 进而导致              TPL  检测方法精度下降, 检
                 测过程中因发起实时        TPL  搜索、获取和分析而导致检测时间成本显著增加. 为了有效应对上述问题, 本文采用面
                 向代码仓库搜索和       APK  反向分离相结合的方法构建较大规模的             TPL  库, 并借助于   LibPass 中的主模块识别、组
                 件签名等完成对      TPL  的预处理, 以提升检测精度和效率.
                    首先, 面向   Maven  自动搜索  TPL. Maven  代码托管仓库中不仅存有面向          Android  平台的大量第三方库, 而且
                 还有大量面向其他平台或开发语言的             TPL. 因此, 在自动获取面向      Android  平台的  TPL  之前, 首先需要预先给出一
                 个待收集的    TPL  清单, 以过滤掉其他不相关的        TPL. 为了定制  TPL  清单, 分析了  Android 应用开源社区“F-Droid”中
                 所有的项目, 提取每一个项目的         gradle 文件中所包含的    TPL  清单加以合并去重, 并且采用三元组         GAV=<Groupname,
                 Artifactld, Versionpairs>唯一地标识每一个  TPL. 一旦确定了待收集的     TPL  清单, 即可利用爬虫程序根据清单中的
                 每一个   GAV  爬取相关的第三方库       jar/aar 文件. 值得注意的是, APK  以汇编索引代码      (二进制形式代码) 形式存在,
                 因此需要借助于转换工具, 如         dextojar 工具等, 将下载的 TPL                                       TPL
                                                                                           文件后存入
                                                             jar/aar 文件中所有的类打包编译为
                                                                                        dex
                 本地库.
                    其次, 通过   APK  反向分离发现     TPL. 尽管原型库构建可以通过          Maven/Gradle  从网上爬取  TPL  原型, 但是
                 Maven  上并不能收集到所有的       TPL, 包括一些过期的     TPL  版本. 而每个  Android  应用中都有多个    TPL, 因此, 可以
                 通过分析大量     Android  应用从中抽取其    TPL  原型使原型库更完备. smali 提供反汇编功能的同时, 也提供了打包反
                 汇编代码重新生成 dex 的功能. 基于这一特点, 在抽取             TPL  的过程中, 先将大量    APK  文件反编译成     smali 分析, 随
                 后对其进行模块解析操作, 将         APK  拆分成多个模块, 再把每个非混淆模块重打包生成               DEX  文件存入   TPL  原型库
                 中, 可得到大量的     TPL  原型, Maven  存储库中缺少的     TPL  原型都可以从    APK  中找到. 本文分析了      10 000  个从
                 Google play  中下载下来的  Android  应用, 把其中所有未被混淆过的、且本地原型库中缺少的                TPL  其  smali 文件提
                 取出来打包成     DEX  文件, 存入本地原型库中.
                    综上两种    TPL  抽取方式创建了包含       140 000  个  的本地库, 其中包括从       maven  中爬取的   12 648  个  TPL,
                 以及从   10 000  个  APK  中分离出的  127 352  个  TPL.

                  3.3   实验设置
                    为了验证提出的第三方库检测方法的性能和效率, 并且与其他领域知名的检测方法进行对比分析, 开展了一
                 组实验并进行深入分析. 实验采用的服务器配置为                Windows 10 专业版  64  位操作系统, Intel(R) Xeon(R) CPU E5-
                 2678 v3 处理器, 主频 @ 2.50 GHz , 内存  64 GB. 在实验中采用了前文构建的       3  种不同能力的基准数据集作为实验
                                                                         [9]
                 对象, 选取了本领域先进的、公开源码的方法, 如              LibScout [14] 、LibRadar 、LibD [10] 、LibPecker [15] 、LibID-S [16] 和
                 LibID-A [16] 作为对比方法. LibPass 主模块识别模块中使用的依赖强度阈值           δ d  设置为  0.01, 确保任意两个子包存在
                 依赖关系即可. 实验中使用召回率           (recall), 精确率  (precision), 假阳率  (false positive ratio, FPR) 以及假阴率  (false
   314   315   316   317   318   319   320   321   322   323   324