AI根据代码内容自动给函数命名,你再也不怕名字不规范的同事了。有些人可以把代码写成推理小说。当需要一个临时变量时,称为temp,如果需要多个临时变量,则称为var1、var2。甚至用拼音缩写作为函数名,比如查询订单的cxdd。要想看懂这样的代码,就得反复推敲上下文,还原每一部分的真实功能。这个过程称为去混淆(Deobfuscation)。麻烦,真的麻烦。有没有办法省事?让AI来!最近,Facebook发布了这样一个语言模型DOBF,专门用于代码混淆。如下图,所有不影响运行的变量名、函数名、类名都被替换成无意义的符号,AI可以进行猜测并尝试还原。我们来看看与正确答案的对比。虽然不完全一样,但是AI修改也大大提高了代码的可读性。和FUNC_0一样,源码是“重新设置参数”,AI改成“初始化权重”,很有道理。除了Python之外,DOBF模型目前还支持C++和Java。毕竟编码不规范的人只是少数。这种模式更广泛的用途是还原有意混淆的代码,以保护知识产权,比如这样:代码写好后,将不影响编译运行的部分,批量替换成难以理解的部分人类来区分。符号,使破译更加困难。在此之前,还有一种用于恢复屏蔽文本的屏蔽语言模型(MaskedLanguageModel)。使用哈工大&微软开发的CodeBERT和Facebook开发的TransCoder来恢复代码,但效果不如最新的DOBF。DOBF超越它们的不是模型架构的创新,也不是数据集的完善,而是一种全新的预训练任务。合理的任务引导AI学习之前的mask语言模型。大部分要遮盖的部分是随机选择的,括号和逗号经常被选中,这对AI来说并不难。DOBF的做法是指定masked变量名、函数名、类名,让AI还原。这项任务难度更大,可以迫使AI学习更深层次的规律。另外,用同一个符号代替多次出现的同一个名字,可以防止AI发现有些名字可以复制粘贴后偷懒走捷径。像上图中的变量V3,AI从第3行的定义可以看出这个变量是List类型,再看第5行对pop(0)的调用,这不是先进先出吗,AI将被命名为队列(queue)而不是栈(stack)。更厉害的还在后头。DOBF甚至可以通过代码内容判断对应函数生成斐波那契数列和向量点积。其实DOBF在架构上并没有什么特别的设计。它只是训练了两个与CodeBERT和TransCoder具有相同层数的模型以进行公平比较。成功的关键是合理的训练任务。在微调完成更多任务并验证此方法有效后,Facebook将此训练任务提取出来并称之为DOBF任务,也可以用来训练其他语言模型。例如,DOBF在TransCoder模型上作为预训练任务,然后在CodeXGLUE基准测试中与下游任务进行微调。结果在代码抄袭检测、摘要代码生成文档、自然语言搜索代码片段三个任务中,使用DOBF或MLM+DOBF预训练取得了较好的效果。Facebook下一步将以DOBF为指导,看看能否为自然语言设计出更好的预训练目标。但是代码的事情还没有结束,人类在混淆代码方面无所不能。期待国际C语言混沌代码大赛AI连变态代码都能看懂的那一天。Github地址:https://github.com/facebookresearch/CodeGen/blob/master/docs/dobf.md论文地址:https://arxiv.org/abs/2102.07492国际C语言混淆代码大赛:http://www.ioccc.org/
