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

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


                                      
                                       1,                                       Sig (A) = Sig (B)
                                                                                  c      c
                                      
                                                                                                      (2)
                          sim c_to_c (A,B) = 
                                      
                                        w 1 sim b_to_b (A,B)+w 2 sim a_to_a (A,B)+w 3 sim m_to_m (A,B), otherwise
                                             
                                              1,                         Sig (A) = Sig (B)
                                                                           b      b
                                             
                                 sim b_to_b (A,B) =          )                                   (3)
                                                (
                                               lcs Sig (A), Sig (B) /Sig (A), otherwise
                                                     b     b        b
                                             
                                              1,                        Sig (A) = Sig (B)
                                                                           a      a
                                             
                                  sim a_to_a (A,B) =    (   )                                    (4)
                                             
                                               lcs Sig (A),Sig (B) /Sig (A), otherwise
                                                     a     a       a
                                             
                                              1,                         Sig (A) = Sig (B)
                                                                           m       m
                                             
                                 sim m_to_m (A,B) =          )                                   (5)
                                                (
                                               lcs Sig (A),Sig (B) /Sig (A), otherwise
                                                     m     m       m
                    每个  TPL  都包含很多类, 每个类对      TPL  功能实现的贡献是不尽相同的, 于是使用权重方式来体现类重要性程
                 度的差异. 类权重计算方法如公式          (6), 与  LibPecker 中采用的类权重度量方法是类似的, 其中函数          NumofMethods()
                                        NumofDepClasses(C,i) 中参数  i 取值为  1  或  2, 分别表示类  C  所在根包中依赖于类  C
                 计算类拥有的方法数, 而函数
                 的类个数和类     C  依赖的其他类个数. 与      LibPecker 中类权重度量方法相比, 差异之处在于类           C  的依赖类数量度量
                                                 arp 中
                 方式, LibPass 不仅考虑了类    C  依赖的其它类个数, 而且考虑了依赖于类            C  的类个数, 并且将依赖关系范围限定于
                 所在的根包.
                                                              ∑  2
                                      weight(C) = NumofMethods(C)+  NumofDepClasses(C,i)              (6)
                                                                 i=1
                    公式  (6) 表明类的方法数越多, 重要性越高; 另一方面, 类依赖的或被依赖的类越多, 则重要性越高. 进一步的,
                 假设类   C  所在的子包有   m 个类, 按照公式    (7) 计算得到归一化的类权重.
                                                               weight(C i )
                                                                                                      (7)
                                                weight(C = C i ) = ∑ m
                                                                 weight(C i )
                                                               i=1
                    与类重要性类似, 根包中的子包也存在重要性程度差异, 同样采用权重机制来体现这一差异. 重点考虑子包中
                 类的个数和类权重来设计子包的权重计算方法, 如公式                  (8) 所示, 其中函数  NumofClasses() 用于度量子包中类的个
                 数,   C i ∈ SP, 1 ⩽ i ⩽ m .
                                                                   ∑
                                                                      m
                                          weight(SP) = NumofClasses(SP)+  weight(C i )                (8)
                                                                      i=1
                    公式  (8) 表明子包拥有的类个数越多, 重要性越高; 子包中类的权重和越大, 则子包重要性越高. 类似地, 对子
                 包的权重进行归一化处理. 假设子包           SP  隶属的根包有    n  个子包, 则归一化后的权重可根据公式          (9) 计算.
                                                                    (   )
                                                   (       )   weight SP j
                                                                                                      (9)
                                              weight SP = SP j = ∑
                                                                n     (   )
                                                                 weight SP j
                                                                j=1
                    下面阐述基于多级签名的细粒度检测方法识别                  APP  中引入的特定版本的       TPL. 正如第   1.2  节分析的那样,
                 TPL  在引入到   APP  中时可能发生较大改变, 例如删除          TPL  中的部分方法、类等使得         APP  中保留的部分与该
                 TPL  原型差异甚大. 因此, 为了对抗上述混淆行为, 提出的基于多级签名的细粒度检测方法以                          APP  中的根包为参
                 照对象以缓解方法、类, 甚至是包缺失带来的影响; 通过成对比较方式以最大相似性原则从本地                               TPL  仓库中查找
                 引入的   TPL, 以避免误匹配和     TPL  版本错误.
                    给定待比较的包对       < arp,lrp > , 假设   n 1  个子包,   lrp 中  n 2  个子包, 以根包  arp 为参照, 根包相似性可以根
                 据公式   (10) 计算, 其中   sim asp_to_lrp (asp ,lrp) 表示根包   lrp 中与子包  asp  最为相似的子包相似性值, 可以根据公式  (11)
                                             i
                                                                     i
                 计算.
                                                      ∑
                                                        n 1                    (   )
                                                          sim asp_to_lrp (asp ,lrp)×weight asp i
                                                                     i
                                     sim arp_to_lrp (arp,lrp) =  i=1                                 (10)
                                                                    n 1
                                                             {                 }
                                                                             n 2
                                         sim asp_to_lrp (asp ,lrp) = max sim asp_to_lsp (asp ,lsp )|  (11)
                                                    i                    i  j  j=1
                    同样以子包     asp  为参照, 将包中类相似性度量值以加权方式获得子包相似性. 假设子包                       asp  中有  m  个类
                                 i                                                            i
   312   313   314   315   316   317   318   319   320   321   322