一种由二进制代码转换源代码的方法,涉及计算机软件逆向分析及网络安全领域,使用大规模二进制代码中间表示训练预训练模型,预训练有助于模型有效的捕捉二进制中间表示程序指令上下文中的结构和语义相关性,然后基于提示学习的思想利用二进制中间表示生成任意高级编程语言编写的源代码。在无需人工干预的情况下,生成二进制文件的任意编程语言编写的源代码,简化了二进制文件分析过程,提高了二进制文件分析效率,也能为软件分析人员提供多语言的源代码支持。的源代码支持。的源代码支持。
【技术实现步骤摘要】
一种由二进制代码转换源代码的方法
[0001]本专利技术涉及计算机软件逆向分析及网络安全领域,具体涉及一种由二进制代码转换源代码的方法。
技术介绍
[0002]随着社会对软件需求的不断增长,必须确保软件能够保护用户的敏感数据并可靠地执行关键功能。在网络安全领域,为了确保软件的安全性,网络安全专家通常使用逆向工程 (Reverse Engineering, RE)来分析二进制软件,以查找软件漏洞并了解恶意软件。但是对于单个程序,此过程可能需要数天、数周或数月,随着软件使用量的增长,这对二进制分析提出了重大挑战。
[0003]二进制分析,是指从可执行的二进制文件出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。软件的逆向分析有多种应用,它对恶意软件分析及软件漏洞分析起到至关重要的作用。但是,这是一项很难学习的技能,需要研究人员花费大量的时间才能掌握一些软件分析的基本技能,即使是经验丰富的专业人士,也往往需要花费很长时间才能获得有意义的结果。
[0004]目前,二进制分析的过程在很大程度上仍然依赖于从事逐行分析的分析师。分析师在进行软件逆向工作时一般经过三个阶段:优先级确定,假设生成和实验。人类逆向工程师需要根据经验猜测软件的执行过程,然后遵循这些过程中的流程,使用过程间模式,最后将所有这些可能的过程组合在一起,以形成对被检查可执行文件的目的和用法的全局理解。虽然对于不同的二进制任务逆向分析过程会有所差异,但研究人员仍无法克服不同逆向任务中的低效率的问题。
[0005]一些专家已经在某些领域内的开展了二进制分析的研究,如安全分析和软件开发。起初,二进制分析中的许多工作是基于认知的,即需要分析师通过经验来推断软件的运行过程,这需要分析人员对二进制代码进行溯因推理(Abductive Reasoning):分析人员需要根据观察产生假设,再根据假设推断代码的功能,然后寻找信息来验证或推翻他们的假设或推导的结论。虽然,这样的方法准确、精度高,但是当源代码使用不同的编译器、或使用优化选项以及选择不同的目标操作系统和 CPU 架构时,生成的二进制代码都可能会发生显著变化。除此以外,代码混淆也使得软件逆向变得更加棘手。源代码程序员和开发人员通常为了保持软件的健壮性可扩展性,他们通常会在源代码中使用有意义的变量或符号来帮助他们理解程序行为,而软件逆向后这些有意义的变量符号则会被优化,分析人员只能分析机器可读的二进制代码,而二进制代码去除了有意义的元素,如变量和函数名称,这也在很大程度上提高了人工分析二进制文件的难度。
[0006]最近,基于机器学习的二进制分析技术也被提出来自动重建二进制的代码表示。虽然传统的人工分析方法在特定任务中显示出很高的准确性,但基于机器学习的方法在快速变化的计算环境中往往更有优势:只要提供训练数据,一个模型就可以在多个平台和架
构上重用,并且可以随着新输入数量的不断增加而不断改进。然而,机器学习中方法通常采用图匹配算法来对二进制代码和源代码进行匹配,这种方法速度慢且不准确,并且现有的利用机器学习的方法仍然专门用于解决某个领域的问题,即为不同类型的二进制分析绘制模型。近年来,基于神经网络的方法取得了很大的进展,基于深度学习的方法大多将二进制代码表示为带有人工选择特征的控制流图(Control Flow Graph, CFG),然后采用图神经网络(Graph Neural Network, GNN)计算图嵌入。虽然这些方法是有效和高效的,但它们不能充分捕获二进制代码的语义信息。
[0007]虽然二进制分析技术已有一定的发展,但是,由于导致现有技术仍存在几点局限:首先,现有许多研究都是基于认知的,即需要根据人工经验来对二进制文件进行分析,而由于二进制文件的特殊性,面对不同的二进制文件往往需要跟换不同的分析过程,并且二进制代码中通常去除了有意义的元素,如变量和函数名,这就导致在分析一个二进制文件时,分析人员往往需要花费大量时间才能获得一个有意义的结果。其次,基于机器学习或者深度学习的方法尽管已经取得了很多成就,但仍有一些重要的事情没有被考虑进去。比如使用人工选择特征的低维嵌入来表示二进制代码,这会导致大量语义信息的丢失。最后,虽然某些二进制分析工具支持二进制代码的自动化分析,但是也仅仅是为了方便分析人员阅读二进制代码,将二进制代码的结构形式转换成某些高级语言的结构形式,虽然这种分析方法考虑到了高级编程语言的可阅读性,尝试将二进制代码转换为高级编程语言,但是这种自动化分析仍局限在代码的结构转换上,未能再深入到代码的语义转换。而代码语义往往包含了二进制文件的某些功能,能更好地为二进制分析提供帮助。
技术实现思路
[0008]本专利技术为了克服以上技术的不足,提供了一种基于双向自编码器和自回归解码器的由二进制文件生成源代码方法。
[0009]本专利技术克服其技术问题所采用的技术方案是:一种由二进制代码转换源代码的方法,包括如下步骤:(a)收集若干不同编程语言的源代码构成数据集,其中为源代码集合,为源代码集合中第个源代码文本表示,为源代码文本总数,为编程语言集合,为第个源代码文本表示所对应的编程语言;(b)使用编译器将第个源代码文本表示编译成其对应的二进制文件,构建二进制文件集合;(c)提取第个二进制文件的中间表示,将其中间表示记为,得到二进制中间表示集合;(d)构建包含源代码、编程语言和中间表示的数据集;
(e)拼接第个源代码文本表示、第个源代码文本表示所对应的编程语言以及第个二进制文件的中间表示,构建序列和序列,其中为插入的固定文本,为分隔标记,为分类标记,为结束标记;(f)构建一个模型;(g)定义预训练任务和预训练任务;(h)预训练任务将序列进行破坏,为序列添加噪声,将破坏后的序列作为模型的输入,模型输出替换的程序指令;(i)预训练任务将序列输入模型中,模型通过第个二进制文件的中间表示和其源代码所对应的编程语言作为提示输出二进制的第个源代码文本表示;(j)计算得到总损失函数;(k)使用梯度下降法最小化预训练任务的总损失函数,通过反向传播更新模型的参数,更新模型的参数直至收敛,得到训练后的模型;(l)将待测试的二进制文件提取出其二进制文件的中间表示,构建模型的输入序列,将序列输入至模型,输出得到二进制文件的对应编程语言编写的源代码。
[0010]进一步的,步骤(a)中表示的编程语言为C++或Java或PHP。
[0011]优选的,步骤(c)使用 LLVM
‑
IR工具提取第个二进制文件的中间表示。
[0012]进一步的,步骤(c)使用Jlang工具或Polyglot工具或RetDec工具提取第个二进制文件的中间表示。
[0013]优选的,步骤(f)中模型为seq2seq Transformer模型。
[0014]进一步的,步骤(f)中模型为长短期记忆网络。
[0015]进一步的,步骤(h)本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种由二进制代码转换源代码的方法,其特征在于,包括如下步骤:(a)收集若干不同编程语言的源代码构成数据集,其中为源代码集合,为源代码集合中第个源代码文本表示,为源代码文本总数,为编程语言集合,为第个源代码文本表示所对应的编程语言;(b)使用编译器将第个源代码文本表示编译成其对应的二进制文件,构建二进制文件集合;(c)提取第个二进制文件的中间表示,将其中间表示记为,得到二进制中间表示集合;(d)构建包含源代码、编程语言和中间表示的数据集;(e)拼接第个源代码文本表示、第个源代码文本表示所对应的编程语言以及第个二进制文件的中间表示,构建序列和序列,其中为插入的固定文本,为分隔标记,为分类标记,为结束标记;(f)构建一个模型;(g)定义预训练任务和预训练任务;(h)预训练任务将序列进行破坏,为序列添加噪声,将破坏后的序列作为模型的输入,模型输出替换的程序指令;(i)预训练任务将序列输入模型中,模型通过第个二进制文件的中间表示和其源代码所对应的编程语言作为提示输出二进制的第个源代码文本表示;(j)计算得到总损失函数;(k)使用梯度下降法最小化预训练任务的总损失函数,通过反向传播更新模型的参数,更新模型的参数直至收敛,得到训练后的模型;(l)将待测试的二进制文件提取出其二进制文件的中间表示,构建模型的输入序列,将序列输入至模型,输出得到二进制文件的对应编程语言编写的源代码。2.根据权利要求1所述的由二进制代码转换源代码的方法,其特征在于:步骤(a)中表示的编程语言为C++或Java或PHP。
3.根据权利要求1所述的由二进制代码转换源代码的方法,其特征在于:步骤(c)使用 LLVM
‑
...
【专利技术属性】
技术研发人员:韩晓晖,徐正源,左文波,
申请(专利权)人:齐鲁工业大学,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。