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

2894                                                       软件学报  2024  年第  35  卷第  6  期


                 {C i1 ,...,C ik ,...,C im }  , 子包相似性可以根据公式  (12) 计算, 其中  sim c_to_c ()  由公式  (2) 计算,   C  表示  lrp  中与子包
                                                                                         ′
                                            ′                       ′         lsp  中, 如公式
                 asp  中类  C im  相似性最大的类,   I (C )  是一个指示函数用于表明类    C  是否在子包      j        (13) 所示.
                    i
                                                      ∑ m
                                                            ′
                                                          I (C )× sim c_to_c (C im ,C )×weight(C im )
                                                                         ′
                                    sim asp_to_lsp (asp ,lsp ) =  i=1                                (12)
                                               i
                                                  j
                                                                    m
                                                          {
                                                            1, C ∈ lsp
                                                               ′
                                                    I (C ) =       j                                 (13)
                                                       ′
                                                            0, C < lsp
                                                               ′
                                                                   j
                  3   实 验
                  3.1   实验数据集
                    在第三方库检测领域, 评价检测方法性能的基准数据集通常以一对多的映射关系存在, 形如                              < apk ,{lrp ,...,
                                                                                                 i   1
                 lrp ,...,lrp } > , 表示应用  apk  中使用的第三方库, 且每个  lrp  记录了第三方库的名称以及版本, 不仅可用于第三
                   j     n              i                       j
                 方库检测, 而且还可用于版本识别. 遗憾的是, 目前尚没有一个得到广泛认可的基准数据集, 主要有以下几个原因:
                 1) 构建基准数据集的方法存在缺陷, 导致评价能力有限, 比如基准中不包含混淆的                        TPL; 2) 数据集的规模比较小,
                 比如  LibD  中使用的基准数据集规模为         1 000  个应用, 包含  2 613  个  TPL, 而  LibID  仅使用  69  个不同  TPL, 包含
                 1 444  个版本.
                    为了提升第三方库检测的评价能力, 更好地验证方法有效性, 本文提出了                       3  种不同的策略以构建基准数据集,
                 从而满足不同验证场景的需求.
                    • 人工构造策略, 即以纯净的        Android  应用为基应用, 通过将一定数量的         TPL  注入到基应用中产生一个新应
                 用, 从而精准地获取该新应用对应的第三方库清单. 具体地, 先选取                   10 000  个  Android  应用, 对它们进行反编译生
                 成一组   smali 文件, 通过删除目录中的     smali 文件构造一个基应用, 确保基应用中原有的第三方库被清空. 其次, 为
                 每个应用随机分配一个第三方库注入清单, 包含随机的                  8  个到  10  个第三方库. 为了使构建的数据集更贴近真实情
                 况, 在注入前对第三方库进行不同程度的修改. 最后, 根据注入清单将第三方库原型反编译成                             smali 文件, 注入到
                 相应的基应用中, 并将      smali 重新打包成一个  Type-3)、扁平化
                                                        文件. 采用上述人工构造策略建立了一个包含
                                                                                                 个应用的
                                                    APK
                                                                                            10 000
                 基准数据集, 共计     95 434  个  < apk,lrp > 基准对, 将其命名为  GTB-1.
                    • 开源项目策略, 即从开源的        Android  应用项目发布平台获取项目文件, 进而从项目文件中提取该应用的第三
                 方库清单和主模块. 具体地, 依托开源平台            F-Droid  获取  Android  应用对应的项目文件, 分析第三方库依赖文件获
                 取应用引入的第三方库清单和主模块信息. 基于上述策略分析了                    1 000 个开源项目, 共计得到     14 233 个  < apk,lrp >
                 基准对, 将其命名为      GTB-2.
                    • 变异策略, 即采用多种主流混淆器提供的混淆功能对注入的第三方库进行变异, 获取混淆后的应用及其第三
                 方库清单. 具体地, 从开源平台        F-Droid  获取  Android  应用项目文件, 为每个应用分别配置      3  种不同的混淆器, 分别
                 为  ProGuard、Allatori 和  DashO; 同时考虑  4  种不同的混淆能力或处理方法, 分别为符号混淆          (包、类、方法等标
                 识符名称转化为无意义字符串, 记为           Type-1)、优化  (使用控制流分析、数据流分析等技术优化程序, 记为                Type-2)、
                 压缩  (把未使用的类、方法等移除, 记为                         (把混淆后的类移动到指定的包中, 进行类重组, 记为
                 Type-4). 设计不同混淆器和混淆功能的组合构成混淆配置应用于每个                   Android  应用项目产生对应的混淆版本. 基
                 于上述策略分析了       1 000  个开源项目, 仅部分项目顺利完成混淆操作, 得到的结果如表               3  所示, 将其命名为    GTB-3.

                                             表 3    应用不同混淆配置后得到的数据集

                                                                                     Obfuscation types
                   Obfuscator  Number of APPs  Number of RPs  Number of APP-TPL pairs
                                                                                1      2      3      4
                   ProGuard       200           1 889             914           √      √      √     √
                    Allatori      241           1 493            1 309          √      √      √     ×
                    DashO         215           1 041            1 001          √      √      √     ×
   313   314   315   316   317   318   319   320   321   322   323