JSNeat: Recovering Variable Names for Minified Code with Usage Contexts

  本文提出了一种基于信息检索(IR)的方法JSNEAT来恢复经过混淆的JS代码中的变量名。

  insight: 利用源代码中变量的上下文在开源JS代码库中搜索其名称。

  我们使用三种上下文类型来匹配给定混淆代码中的变量与语料库,包括变量的属性和角色、同一函数出现的其他变量以及变量所属函数名。(图是混淆代码例子)

  (1)变量的属性和角色(Single-variable usage context (SVC));属性: v访问了代码中的method或field,则恢复v的名字应与method和field自然兼容; 角色:如果v作为method call的一个参数,那么v的名字也应与method call名字相关;

举例:混淆代码中的r.types r.getdata r.getdata(),通过这些属性信息构建关系(r, types, fieldAccess), (r, getData, fieldAccess), (r, getData(), methodCall);利用如o.m(..., v, ...), v = o.m(...), or v = o.f角色信息构建v和m,v和f的关系;最后根据构建关系生成关系图:

  (2)同一函数出现的其他变量(Multiple-variable usage context (MVC)): 多个变量(co-occurring variables)在同一函数中使用,它们的名字自然会相互协调;

  计算这种共现关系,引入了多变量得分(MC)。作者介绍了一种基于多变量上下文的算法,用于从单个变量上下文中推断出候选名称。

  (3)变量所属函数名(Task-specific context (TSC)): 变量的名字应该与函数的任务/目的相关;

  使用了模糊集合理论,并根据函数名称和变量名称之间的关联关系进行计算一个变量名称在具有特定名称的函数内部出现的可能性。最终得到的结果是一个介于0到1之间的分数,分数越高表示该变量名称越有可能出现在指定任务的函数中。

 

  最后,整个算法流程如下:

  实验结果:对比JSNeat和JSNice,JSNaughty的accuracy

posted @ 2024-04-17 15:58  向日葵*1  阅读(7)  评论(0编辑  收藏  举报