CN115934090B - 一种由二进制代码转换源代码的方法 - Google Patents

一种由二进制代码转换源代码的方法 Download PDF

Info

Publication number
CN115934090B
CN115934090B CN202310010274.8A CN202310010274A CN115934090B CN 115934090 B CN115934090 B CN 115934090B CN 202310010274 A CN202310010274 A CN 202310010274A CN 115934090 B CN115934090 B CN 115934090B
Authority
CN
China
Prior art keywords
binary
source code
model
representation
intermediate representation
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202310010274.8A
Other languages
English (en)
Other versions
CN115934090A (zh
Inventor
韩晓晖
徐正源
左文波
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Qilu University of Technology
Shandong Computer Science Center National Super Computing Center in Jinan
Original Assignee
Qilu University of Technology
Shandong Computer Science Center National Super Computing Center in Jinan
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Qilu University of Technology, Shandong Computer Science Center National Super Computing Center in Jinan filed Critical Qilu University of Technology
Priority to CN202310010274.8A priority Critical patent/CN115934090B/zh
Publication of CN115934090A publication Critical patent/CN115934090A/zh
Application granted granted Critical
Publication of CN115934090B publication Critical patent/CN115934090B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

一种由二进制代码转换源代码的方法,涉及计算机软件逆向分析及网络安全领域,使用大规模二进制代码中间表示训练预训练模型,预训练有助于模型有效的捕捉二进制中间表示程序指令上下文中的结构和语义相关性,然后基于提示学习的思想利用二进制中间表示生成任意高级编程语言编写的源代码。在无需人工干预的情况下,生成二进制文件的任意编程语言编写的源代码,简化了二进制文件分析过程,提高了二进制文件分析效率,也能为软件分析人员提供多语言的源代码支持。

Description

一种由二进制代码转换源代码的方法
技术领域
本发明涉及计算机软件逆向分析及网络安全领域,具体涉及一种由二进制代码转换源代码的方法。
背景技术
随着社会对软件需求的不断增长,必须确保软件能够保护用户的敏感数据并可靠地执行关键功能。在网络安全领域,为了确保软件的安全性,网络安全专家通常使用逆向工程 (Reverse Engineering, RE)来分析二进制软件,以查找软件漏洞并了解恶意软件。但是对于单个程序,此过程可能需要数天、数周或数月,随着软件使用量的增长,这对二进制分析提出了重大挑战。
二进制分析,是指从可执行的二进制文件出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。软件的逆向分析有多种应用,它对恶意软件分析及软件漏洞分析起到至关重要的作用。但是,这是一项很难学习的技能,需要研究人员花费大量的时间才能掌握一些软件分析的基本技能,即使是经验丰富的专业人士,也往往需要花费很长时间才能获得有意义的结果。
目前,二进制分析的过程在很大程度上仍然依赖于从事逐行分析的分析师。分析师在进行软件逆向工作时一般经过三个阶段:优先级确定,假设生成和实验。人类逆向工程师需要根据经验猜测软件的执行过程,然后遵循这些过程中的流程,使用过程间模式,最后将所有这些可能的过程组合在一起,以形成对被检查可执行文件的目的和用法的全局理解。虽然对于不同的二进制任务逆向分析过程会有所差异,但研究人员仍无法克服不同逆向任务中的低效率的问题。
一些专家已经在某些领域内的开展了二进制分析的研究,如安全分析和软件开发。起初,二进制分析中的许多工作是基于认知的,即需要分析师通过经验来推断软件的运行过程,这需要分析人员对二进制代码进行溯因推理(Abductive Reasoning):分析人员需要根据观察产生假设,再根据假设推断代码的功能,然后寻找信息来验证或推翻他们的假设或推导的结论。虽然,这样的方法准确、精度高,但是当源代码使用不同的编译器、或使用优化选项以及选择不同的目标操作系统和 CPU 架构时,生成的二进制代码都可能会发生显著变化。除此以外,代码混淆也使得软件逆向变得更加棘手。源代码程序员和开发人员通常为了保持软件的健壮性可扩展性,他们通常会在源代码中使用有意义的变量或符号来帮助他们理解程序行为,而软件逆向后这些有意义的变量符号则会被优化,分析人员只能分析机器可读的二进制代码,而二进制代码去除了有意义的元素,如变量和函数名称,这也在很大程度上提高了人工分析二进制文件的难度。
最近,基于机器学习的二进制分析技术也被提出来自动重建二进制的代码表示。虽然传统的人工分析方法在特定任务中显示出很高的准确性,但基于机器学习的方法在快速变化的计算环境中往往更有优势:只要提供训练数据,一个模型就可以在多个平台和架构上重用,并且可以随着新输入数量的不断增加而不断改进。然而,机器学习中方法通常采用图匹配算法来对二进制代码和源代码进行匹配,这种方法速度慢且不准确,并且现有的利用机器学习的方法仍然专门用于解决某个领域的问题,即为不同类型的二进制分析绘制模型。近年来,基于神经网络的方法取得了很大的进展,基于深度学习的方法大多将二进制代码表示为带有人工选择特征的控制流图(Control Flow Graph, CFG),然后采用图神经网络(Graph Neural Network, GNN)计算图嵌入。虽然这些方法是有效和高效的,但它们不能充分捕获二进制代码的语义信息。
虽然二进制分析技术已有一定的发展,但是,由于导致现有技术仍存在几点局限:首先,现有许多研究都是基于认知的,即需要根据人工经验来对二进制文件进行分析,而由于二进制文件的特殊性,面对不同的二进制文件往往需要跟换不同的分析过程,并且二进制代码中通常去除了有意义的元素,如变量和函数名,这就导致在分析一个二进制文件时,分析人员往往需要花费大量时间才能获得一个有意义的结果。其次,基于机器学习或者深度学习的方法尽管已经取得了很多成就,但仍有一些重要的事情没有被考虑进去。比如使用人工选择特征的低维嵌入来表示二进制代码,这会导致大量语义信息的丢失。最后,虽然某些二进制分析工具支持二进制代码的自动化分析,但是也仅仅是为了方便分析人员阅读二进制代码,将二进制代码的结构形式转换成某些高级语言的结构形式,虽然这种分析方法考虑到了高级编程语言的可阅读性,尝试将二进制代码转换为高级编程语言,但是这种自动化分析仍局限在代码的结构转换上,未能再深入到代码的语义转换。而代码语义往往包含了二进制文件的某些功能,能更好地为二进制分析提供帮助。
发明内容
本发明为了克服以上技术的不足,提供了一种基于双向自编码器和自回归解码器的由二进制文件生成源代码方法。
本发明克服其技术问题所采用的技术方案是:
一种由二进制代码转换源代码的方法,包括如下步骤:
(a)收集若干不同编程语言的源代码构成数据集
Figure 986961DEST_PATH_IMAGE001
,其中
Figure 924961DEST_PATH_IMAGE002
为源代码集合,
Figure 2639DEST_PATH_IMAGE003
为源代码集合
Figure 346770DEST_PATH_IMAGE004
中第
Figure 701659DEST_PATH_IMAGE005
个源代码文本表示,
Figure 309096DEST_PATH_IMAGE006
为源代码文本总数,
Figure 874070DEST_PATH_IMAGE007
为编程语言集合,
Figure 664302DEST_PATH_IMAGE008
为第
Figure 231287DEST_PATH_IMAGE005
个源代码文本表示
Figure 42249DEST_PATH_IMAGE003
所对应的编程语言;
(b)使用编译器将第
Figure 563360DEST_PATH_IMAGE005
个源代码文本表示
Figure 750759DEST_PATH_IMAGE003
编译成其对应的二进制文件
Figure 703409DEST_PATH_IMAGE009
,构建二进制文件集合
Figure 622954DEST_PATH_IMAGE010
(c)提取第
Figure 365783DEST_PATH_IMAGE005
个二进制文件
Figure 120987DEST_PATH_IMAGE009
的中间表示,将其中间表示记为
Figure 898450DEST_PATH_IMAGE011
,得到二进制中间表示集合
Figure 847951DEST_PATH_IMAGE012
(d)构建包含源代码、编程语言和中间表示的数据集
Figure 78075DEST_PATH_IMAGE013
(e)拼接第
Figure 371391DEST_PATH_IMAGE014
个源代码文本表示
Figure 409886DEST_PATH_IMAGE003
、第
Figure 327026DEST_PATH_IMAGE005
个源代码文本表示
Figure 310026DEST_PATH_IMAGE003
所对应的编程语言
Figure 344715DEST_PATH_IMAGE008
以及第
Figure 831191DEST_PATH_IMAGE005
个二进制文件的中间表示
Figure 591337DEST_PATH_IMAGE015
,构建序列
Figure 318026DEST_PATH_IMAGE016
和序列
Figure 861134DEST_PATH_IMAGE017
,其中
Figure 202117DEST_PATH_IMAGE018
为插入的固定文本,
Figure 897278DEST_PATH_IMAGE019
为分隔标记,
Figure 120449DEST_PATH_IMAGE020
为分类标记,
Figure 60723DEST_PATH_IMAGE021
为结束标记;
(f)构建一个模型
Figure 256212DEST_PATH_IMAGE022
(g)定义预训练任务
Figure 263220DEST_PATH_IMAGE023
和预训练任务
Figure 442529DEST_PATH_IMAGE024
(h)预训练任务
Figure 717652DEST_PATH_IMAGE023
将序列
Figure 266183DEST_PATH_IMAGE025
进行破坏,为序列
Figure 7874DEST_PATH_IMAGE025
添加噪声,将破坏后的序列
Figure 143320DEST_PATH_IMAGE025
作为模型
Figure 330457DEST_PATH_IMAGE022
的输入,模型
Figure 766118DEST_PATH_IMAGE022
输出替换的程序指令;
(i)预训练任务
Figure 209868DEST_PATH_IMAGE026
将序列
Figure 393463DEST_PATH_IMAGE027
输入模型
Figure 885755DEST_PATH_IMAGE022
中,模型
Figure 441501DEST_PATH_IMAGE022
通过第
Figure 757951DEST_PATH_IMAGE005
个二进制文件的中间表示
Figure 867989DEST_PATH_IMAGE015
和其源代码所对应的编程语言
Figure 491869DEST_PATH_IMAGE008
作为提示输出二进制的第
Figure 135077DEST_PATH_IMAGE005
个源代码文本表示
Figure 858314DEST_PATH_IMAGE003
(j)计算得到总损失函数
Figure 455648DEST_PATH_IMAGE028
(k)使用梯度下降法最小化预训练任务的总损失函数
Figure 912912DEST_PATH_IMAGE028
,通过反向传播更新模型
Figure 177672DEST_PATH_IMAGE022
的参数,更新模型
Figure 134126DEST_PATH_IMAGE022
的参数直至收敛,得到训练后的模型
Figure 218757DEST_PATH_IMAGE029
(l)将待测试的二进制文件
Figure 89499DEST_PATH_IMAGE030
提取出其二进制文件的中间表示
Figure 739923DEST_PATH_IMAGE031
,构建模型
Figure 132858DEST_PATH_IMAGE029
的输入序列
Figure 672162DEST_PATH_IMAGE032
,将序列
Figure 910376DEST_PATH_IMAGE032
输入至模型
Figure 54787DEST_PATH_IMAGE033
,输出得到二进制文件
Figure 149782DEST_PATH_IMAGE030
的对应编程语言
Figure 943426DEST_PATH_IMAGE008
编写的源代码。
进一步的,步骤(a)中
Figure 952708DEST_PATH_IMAGE008
表示的编程语言为C++或Java或PHP。
优选的,步骤(c)使用 LLVM-IR工具提取第
Figure 453091DEST_PATH_IMAGE005
个二进制文件
Figure 922249DEST_PATH_IMAGE009
的中间表示。
进一步的,步骤(c)使用Jlang工具或Polyglot工具或RetDec工具提取第
Figure 967303DEST_PATH_IMAGE005
个二进制文件
Figure 344058DEST_PATH_IMAGE009
的中间表示。
优选的,步骤(f)中模型
Figure 558002DEST_PATH_IMAGE022
为seq2seq Transformer模型。
进一步的,步骤(f)中模型
Figure 198062DEST_PATH_IMAGE022
为长短期记忆网络。
进一步的,步骤(h)包括如下步骤:
(h-1)将序列
Figure 730412DEST_PATH_IMAGE025
中的第
Figure 51803DEST_PATH_IMAGE005
个源代码文本表示
Figure 120253DEST_PATH_IMAGE003
以及第
Figure 429749DEST_PATH_IMAGE005
个二进制文件的中间表示
Figure 216440DEST_PATH_IMAGE015
随机抽样程序指令并替换为
Figure 669418DEST_PATH_IMAGE034
特殊符;
(h-2)随机将序列
Figure 592375DEST_PATH_IMAGE025
中的第
Figure 565051DEST_PATH_IMAGE005
个源代码文本表示
Figure 307879DEST_PATH_IMAGE003
或第
Figure 298969DEST_PATH_IMAGE005
个二进制文件的中间表示
Figure 981492DEST_PATH_IMAGE015
的程序指令片段用一个
Figure 727731DEST_PATH_IMAGE034
特殊符替换;
(h-3)将破坏后的序列
Figure 895538DEST_PATH_IMAGE025
作为模型
Figure 923275DEST_PATH_IMAGE022
的输入,模型
Figure 86403DEST_PATH_IMAGE022
输出被
Figure 82172DEST_PATH_IMAGE034
替换的程序指令。
进一步的,步骤(j)包括如下步骤:
(j-1)通过公式
Figure 298127DEST_PATH_IMAGE035
计算得到预训练任务
Figure 427758DEST_PATH_IMAGE023
的目标函数
Figure 914234DEST_PATH_IMAGE036
,式中
Figure 674379DEST_PATH_IMAGE037
为所有源代码和中间表示的程序指令集合,
Figure 580893DEST_PATH_IMAGE038
为预训练任务
Figure 451897DEST_PATH_IMAGE023
中模型输出的程序指令,
Figure 963519DEST_PATH_IMAGE039
Figure 160145DEST_PATH_IMAGE038
为原始程序指令的概率,
Figure 586578DEST_PATH_IMAGE040
为在中间表示中被
Figure 58011DEST_PATH_IMAGE041
特殊符替换的程序指令,
Figure 17614DEST_PATH_IMAGE042
为在源代码文本中被
Figure 526087DEST_PATH_IMAGE034
特殊符替换的程序指令;
(j-2)通过公式
Figure 502133DEST_PATH_IMAGE043
计算得到预训练任务
Figure 213475DEST_PATH_IMAGE044
的目标函数
Figure 935575DEST_PATH_IMAGE045
,式中
Figure 739583DEST_PATH_IMAGE046
为预训练任务
Figure 170302DEST_PATH_IMAGE044
中模型
Figure 452379DEST_PATH_IMAGE022
输出的源代码程序指令,
Figure 763405DEST_PATH_IMAGE047
Figure 768008DEST_PATH_IMAGE046
为源代码原始程序指令的概率;
(j-3)通过公式
Figure 390750DEST_PATH_IMAGE048
计算得到总损失函数
Figure 883043DEST_PATH_IMAGE049
本发明的有益效果是:(1)提供了一种端到端的二进制文件到源代码转换的方法,通过利用二进制文件的中间表示,效地缓解了不同平台下二进制文件的差异;(2)设计预训练任务使得模型能够学习到二进制文件的中间表示和源代码的上下文语义联系;(3)引入提示学习的思想,在无需人工干预的情况下,生成二进制文件的任意编程语言编写的源代码,并且无需再对预训练模型的下游任务进行微调,优化了模型参数,同时也简化了二进制文件分析过程,提高了二进制文件分析效率,也能为软件分析人员提供多语言的源代码支持。
附图说明
图1为本发明的方法流程示意图;
图2为本发明的预训练任务
Figure 937324DEST_PATH_IMAGE050
进行模型预训练的流程示意图;
图3为本发明的预训练任务
Figure 817556DEST_PATH_IMAGE044
进行模型预训练的流程示意图。
具体实施方式
下面结合附图1、附图2、附图3对本发明做进一步说明。
本发明提供一种基于双向自编码器和自回归解码器的由二进制文件生成源代码方法。首先使用大规模二进制代码中间表示训练预训练模型,预训练有助于模型有效的捕捉二进制中间表示程序指令上下文中的结构和语义相关性,然后基于提示学习的思想利用二进制中间表示生成任意高级编程语言编写的源代码。具体的,包括如下步骤:
(a)收集若干不同编程语言的源代码构成数据集
Figure 193173DEST_PATH_IMAGE001
,其中
Figure 987692DEST_PATH_IMAGE002
为源代码集合,
Figure 663524DEST_PATH_IMAGE003
为源代码集合
Figure 855602DEST_PATH_IMAGE004
中第
Figure 13788DEST_PATH_IMAGE005
个源代码文本表示,
Figure 175779DEST_PATH_IMAGE006
为源代码文本总数,
Figure 174959DEST_PATH_IMAGE007
为编程语言集合,
Figure 131414DEST_PATH_IMAGE008
为第
Figure 980159DEST_PATH_IMAGE005
个源代码文本表示
Figure 352366DEST_PATH_IMAGE003
所对应的编程语言。
(b)使用编译器将第
Figure 268369DEST_PATH_IMAGE005
个源代码文本表示
Figure 159840DEST_PATH_IMAGE003
编译成其对应的二进制文件
Figure 731766DEST_PATH_IMAGE009
,构建二进制文件集合
Figure 969981DEST_PATH_IMAGE010
(c)提取第
Figure 114392DEST_PATH_IMAGE005
个二进制文件
Figure 943808DEST_PATH_IMAGE009
的中间表示(Intermediate Representation,IR),将其中间表示记为
Figure 3031DEST_PATH_IMAGE011
,得到二进制中间表示集合
Figure 44936DEST_PATH_IMAGE012
(d)构建包含源代码、编程语言和中间表示的数据集
Figure 473267DEST_PATH_IMAGE013
(e)拼接第
Figure 4742DEST_PATH_IMAGE014
个源代码文本表示
Figure 285682DEST_PATH_IMAGE003
、第
Figure 396857DEST_PATH_IMAGE005
个源代码文本表示
Figure 250282DEST_PATH_IMAGE003
所对应的编程语言
Figure 155921DEST_PATH_IMAGE008
以及第
Figure 517632DEST_PATH_IMAGE005
个二进制文件的中间表示
Figure 868716DEST_PATH_IMAGE015
,构建序列
Figure 671587DEST_PATH_IMAGE016
和序列
Figure 154652DEST_PATH_IMAGE017
,其中
Figure 174299DEST_PATH_IMAGE018
为插入的固定文本,两端文本段之间由一个特殊分隔标记
Figure 361698DEST_PATH_IMAGE051
连接,每个序列的第一个和最后一个程序指令总是分别用一个特殊的分类标记
Figure 19075DEST_PATH_IMAGE052
和一个结束标记
Figure 797675DEST_PATH_IMAGE053
填充。
(f)构建一个模型
Figure 304618DEST_PATH_IMAGE022
。模型包含一个双向的编码器和一个自回归的解码器。模型的编码器部分为一个双向特征表示的自编码模型,包含N层Transformer block;而解码器部分为一个单向特征表示的自回归模型,也包含N层Transformer block。Transformer的编码器可以对二进制中间表示和源代码进行嵌入,而Transformer的解码器可以用于生成二进制中间表示所对应的源代码。Transformer基于自注意机制,已成为一种流行的源代码嵌入模型。
(g)定义预训练任务
Figure 967811DEST_PATH_IMAGE023
和预训练任务
Figure 479695DEST_PATH_IMAGE054
(h)预训练任务
Figure 396573DEST_PATH_IMAGE023
将序列
Figure 892277DEST_PATH_IMAGE025
进行破坏,为序列
Figure 952637DEST_PATH_IMAGE025
添加噪声,将破坏后的序列
Figure 850186DEST_PATH_IMAGE025
作为模型
Figure 937965DEST_PATH_IMAGE022
的输入,模型
Figure 61910DEST_PATH_IMAGE022
输出替换的程序指令。目的是使模型
Figure 191540DEST_PATH_IMAGE022
学习程序指令在上下文中的语义关系。
(i)如附图3所示,预训练任务
Figure 176551DEST_PATH_IMAGE026
将序列
Figure 936697DEST_PATH_IMAGE027
输入模型
Figure 813517DEST_PATH_IMAGE022
中,模型
Figure 979794DEST_PATH_IMAGE022
通过第
Figure 789618DEST_PATH_IMAGE005
个二进制文件的中间表示
Figure 517403DEST_PATH_IMAGE015
和其源代码所对应的编程语言
Figure 114475DEST_PATH_IMAGE008
作为提示输出二进制的第
Figure 789170DEST_PATH_IMAGE005
个源代码文本表示
Figure 984659DEST_PATH_IMAGE003
。预训练任务
Figure 148924DEST_PATH_IMAGE024
的目标是通过二进制中间表示生成某种高级编程语言编写的源代码,目的是使模型
Figure 967713DEST_PATH_IMAGE022
学习二进制中间表示和其对应源代码的相关性。
(j)计算得到总损失函数
Figure 977258DEST_PATH_IMAGE028
(k)使用梯度下降法最小化预训练任务的总损失函数
Figure 463472DEST_PATH_IMAGE028
,通过反向传播更新模型
Figure 64217DEST_PATH_IMAGE022
的参数,更新模型
Figure 137347DEST_PATH_IMAGE022
的参数直至收敛,得到训练后的模型
Figure 153844DEST_PATH_IMAGE029
(l)将待测试的二进制文件
Figure 822461DEST_PATH_IMAGE030
提取出其二进制文件的中间表示
Figure 531791DEST_PATH_IMAGE031
,构建模型
Figure 154533DEST_PATH_IMAGE029
的输入序列
Figure 145360DEST_PATH_IMAGE032
,将序列
Figure 169948DEST_PATH_IMAGE032
输入至模型
Figure 581338DEST_PATH_IMAGE033
,输出得到二进制文件
Figure 721070DEST_PATH_IMAGE030
的对应编程语言
Figure 485895DEST_PATH_IMAGE008
编写的源代码。
在本发明的一个实施例中,步骤(a)中
Figure 630568DEST_PATH_IMAGE008
表示的编程语言为C++或Java或PHP。
在本发明的一个实施例中,步骤(c)使用 LLVM-IR工具提取第
Figure 976974DEST_PATH_IMAGE005
个二进制文件
Figure 246412DEST_PATH_IMAGE009
的中间表示。
除此之外,所用的提取工具可用其他具有相似功能的二进制提取工具代替,如使用Jlang工具或Polyglot工具或RetDec工具提取第
Figure 736300DEST_PATH_IMAGE005
个二进制文件
Figure 663977DEST_PATH_IMAGE009
的中间表示。
在本发明的一个实施例中,模型
Figure 886011DEST_PATH_IMAGE022
为seq2seq Transformer模型,步骤(f)中模型
Figure 767379DEST_PATH_IMAGE022
除了使用的Transformer 模型外也可用其他循环神经网络替代,长短期记忆网络(LongShort-Term Memory)等。
如附图2所示,预训练任务
Figure 903700DEST_PATH_IMAGE055
使用两种方法模块原始序列
Figure 22966DEST_PATH_IMAGE025
,为序列
Figure 884743DEST_PATH_IMAGE025
添加噪声,具体的,步骤(h)包括如下步骤:
(h-1)第一种方法为:将序列
Figure 518986DEST_PATH_IMAGE025
中的第
Figure 662261DEST_PATH_IMAGE005
个源代码文本表示
Figure 167191DEST_PATH_IMAGE003
以及第
Figure 199869DEST_PATH_IMAGE005
个二进制文件的中间表示
Figure 554365DEST_PATH_IMAGE015
随机抽样程序指令并替换为
Figure 533953DEST_PATH_IMAGE034
特殊符。例如在一个具体的实现中,将
Figure 96653DEST_PATH_IMAGE015
中"load"指令替换为
Figure 126664DEST_PATH_IMAGE034
Figure 673183DEST_PATH_IMAGE003
中"for"指令替换为
Figure 518779DEST_PATH_IMAGE034
特殊符。
(h-2)第二种方法为:随机将序列
Figure 467143DEST_PATH_IMAGE025
中的第
Figure 543421DEST_PATH_IMAGE005
个源代码文本表示
Figure 577236DEST_PATH_IMAGE003
或第
Figure 960944DEST_PATH_IMAGE005
个二进制文件的中间表示
Figure 793509DEST_PATH_IMAGE015
的程序指令片段用一个
Figure 870049DEST_PATH_IMAGE034
特殊符替换。例如在一个具体的实现中,假设被替换的程序指令长度服从泊松分布(
Figure 797685DEST_PATH_IMAGE056
)的随机抽样,从
Figure 483619DEST_PATH_IMAGE003
选取长度为3的程序指令"i+= 1",用
Figure 203314DEST_PATH_IMAGE034
特殊符替换程序指令"i += 1"。如果此时被替换的程序指令长度为0,则相当于直接往原始序列
Figure 185176DEST_PATH_IMAGE025
中插入一个
Figure 193583DEST_PATH_IMAGE034
特殊符。
(h-3)将破坏后的序列
Figure 355312DEST_PATH_IMAGE025
作为模型
Figure 132775DEST_PATH_IMAGE022
的输入,模型
Figure 285539DEST_PATH_IMAGE022
输出被
Figure 810936DEST_PATH_IMAGE034
替换的程序指令。
在本发明的一个实施例中,步骤(j)包括如下步骤:
(j-1)通过公式
Figure 605717DEST_PATH_IMAGE035
计算得到预训练任务
Figure 972107DEST_PATH_IMAGE023
的目标函数
Figure 263149DEST_PATH_IMAGE036
,式中
Figure 980569DEST_PATH_IMAGE037
为所有源代码和中间表示的程序指令集合,
Figure 313462DEST_PATH_IMAGE038
为预训练任务
Figure 970577DEST_PATH_IMAGE023
中模型输出的程序指令,
Figure 527460DEST_PATH_IMAGE039
Figure 732176DEST_PATH_IMAGE038
为原始程序指令的概率,
Figure 603180DEST_PATH_IMAGE040
为在中间表示中被
Figure 114802DEST_PATH_IMAGE041
特殊符替换的程序指令,
Figure 311428DEST_PATH_IMAGE042
为在源代码文本中被
Figure 269020DEST_PATH_IMAGE034
特殊符替换的程序指令。
(j-2)通过公式
Figure 114354DEST_PATH_IMAGE043
计算得到预训练任务
Figure 309843DEST_PATH_IMAGE044
的目标函数
Figure 677370DEST_PATH_IMAGE045
,式中
Figure 89635DEST_PATH_IMAGE046
为预训练任务
Figure 99179DEST_PATH_IMAGE044
中模型
Figure 680333DEST_PATH_IMAGE022
输出的源代码程序指令,
Figure 858243DEST_PATH_IMAGE047
Figure 321585DEST_PATH_IMAGE046
为源代码原始程序指令的概率。
(j-3)通过公式
Figure 541345DEST_PATH_IMAGE048
计算得到总损失函数
Figure 508164DEST_PATH_IMAGE049
最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (6)

1.一种由二进制代码转换源代码的方法,其特征在于,包括如下步骤:
(a)收集若干不同编程语言的源代码构成数据集
Figure QLYQS_3
,其中
Figure QLYQS_4
为源代码集合,
Figure QLYQS_7
为源代码集合
Figure QLYQS_2
中第
Figure QLYQS_5
个源代码文本表示,
Figure QLYQS_8
为源代码文本总数,
Figure QLYQS_10
为编程语言集合,
Figure QLYQS_1
为第
Figure QLYQS_6
个源代码文本表示
Figure QLYQS_9
所对应的编程语言;
(b)使用编译器将第
Figure QLYQS_11
个源代码文本表示
Figure QLYQS_12
编译成其对应的二进制文件
Figure QLYQS_13
,构建二进制文件集合
Figure QLYQS_14
(c)提取第
Figure QLYQS_15
个二进制文件
Figure QLYQS_16
的中间表示,将其中间表示记为
Figure QLYQS_17
,得到二进制中间表示集合
Figure QLYQS_18
(d)构建包含源代码、编程语言和中间表示的数据集
Figure QLYQS_19
(e)拼接第
Figure QLYQS_22
个源代码文本表示
Figure QLYQS_25
、第
Figure QLYQS_27
个源代码文本表示
Figure QLYQS_21
所对应的编程语言
Figure QLYQS_28
以及第
Figure QLYQS_31
个二进制文件的中间表示
Figure QLYQS_32
,构建序列
Figure QLYQS_20
和序列
Figure QLYQS_24
,其中
Figure QLYQS_29
为插入的固定文本,
Figure QLYQS_30
为分隔标记,
Figure QLYQS_23
为分类标记,
Figure QLYQS_26
为结束标记;
(f)构建一个模型
Figure QLYQS_33
(g)定义预训练任务
Figure QLYQS_34
和预训练任务
Figure QLYQS_35
(h)预训练任务
Figure QLYQS_36
将序列
Figure QLYQS_37
进行破坏,为序列
Figure QLYQS_38
添加噪声,将破坏后的序列
Figure QLYQS_39
作为模型
Figure QLYQS_40
的输入,模型
Figure QLYQS_41
输出替换的程序指令;
(i)预训练任务
Figure QLYQS_44
将序列
Figure QLYQS_47
输入模型
Figure QLYQS_49
中,模型
Figure QLYQS_43
通过第
Figure QLYQS_45
个二进制文件的中间表示
Figure QLYQS_48
和其源代码所对应的编程语言
Figure QLYQS_50
作为提示输出二进制的第
Figure QLYQS_42
个源代码文本表示
Figure QLYQS_46
(j)计算得到总损失函数
Figure QLYQS_51
(k)使用梯度下降法最小化预训练任务的总损失函数
Figure QLYQS_52
,通过反向传播更新模型
Figure QLYQS_53
的参数,更新模型
Figure QLYQS_54
的参数直至收敛,得到训练后的模型
Figure QLYQS_55
(l)将待测试的二进制文件
Figure QLYQS_57
提取出其二进制文件的中间表示
Figure QLYQS_60
,构建模型
Figure QLYQS_61
的输入序列
Figure QLYQS_58
,将序列
Figure QLYQS_59
输入至模型
Figure QLYQS_62
,输出得到二进制文件
Figure QLYQS_63
的对应编程语言
Figure QLYQS_56
编写的源代码;
步骤(h)包括如下步骤:
(h-1)将序列
Figure QLYQS_64
中的第
Figure QLYQS_65
个源代码文本表示
Figure QLYQS_66
以及第
Figure QLYQS_67
个二进制文件的中间表示
Figure QLYQS_68
随机抽样程序指令并替换为
Figure QLYQS_69
特殊符;
(h-2)随机将序列
Figure QLYQS_70
中的第
Figure QLYQS_71
个源代码文本表示
Figure QLYQS_72
或第
Figure QLYQS_73
个二进制文件的中间表示
Figure QLYQS_74
的程序指令片段用一个
Figure QLYQS_75
特殊符替换;
(h-3)将破坏后的序列
Figure QLYQS_76
作为模型
Figure QLYQS_77
的输入,模型
Figure QLYQS_78
输出被
Figure QLYQS_79
替换的程序指令;
步骤(j)包括如下步骤:
(j-1)通过公式
Figure QLYQS_81
计算得到预训练任务
Figure QLYQS_86
的目标函数
Figure QLYQS_88
,式中
Figure QLYQS_82
为所有源代码和中间表示的程序指令集合,
Figure QLYQS_85
为预训练任务
Figure QLYQS_89
中模型输出的程序指令,
Figure QLYQS_91
Figure QLYQS_80
为原始程序指令的概率,
Figure QLYQS_84
为在中间表示中被
Figure QLYQS_87
特殊符替换的程序指令,
Figure QLYQS_90
为在源代码文本中被
Figure QLYQS_83
特殊符替换的程序指令;
(j-2)通过公式
Figure QLYQS_93
计算得到预训练任务
Figure QLYQS_95
的目标函数
Figure QLYQS_97
,式中
Figure QLYQS_94
为预训练任务
Figure QLYQS_96
中模型
Figure QLYQS_98
输出的源代码程序指令,
Figure QLYQS_99
Figure QLYQS_92
为源代码原始程序指令的概率;
(j-3)通过公式
Figure QLYQS_100
计算得到总损失函数
Figure QLYQS_101
2.根据权利要求1所述的由二进制代码转换源代码的方法,其特征在于:步骤(a)中
Figure QLYQS_102
表示的编程语言为C++或Java或PHP。
3.根据权利要求1所述的由二进制代码转换源代码的方法,其特征在于:步骤(c)使用LLVM-IR工具提取第
Figure QLYQS_103
个二进制文件
Figure QLYQS_104
的中间表示。
4.根据权利要求1所述的由二进制代码转换源代码的方法,其特征在于:步骤(c)使用Jlang工具或Polyglot工具或RetDec工具提取第
Figure QLYQS_105
个二进制文件
Figure QLYQS_106
的中间表示。
5.根据权利要求1所述的由二进制代码转换源代码的方法,其特征在于:步骤(f)中模型
Figure QLYQS_107
为seq2seq Transformer模型。
6.根据权利要求1所述的由二进制代码转换源代码的方法,其特征在于:步骤(f)中模型
Figure QLYQS_108
为长短期记忆网络。
CN202310010274.8A 2023-01-05 2023-01-05 一种由二进制代码转换源代码的方法 Active CN115934090B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310010274.8A CN115934090B (zh) 2023-01-05 2023-01-05 一种由二进制代码转换源代码的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310010274.8A CN115934090B (zh) 2023-01-05 2023-01-05 一种由二进制代码转换源代码的方法

Publications (2)

Publication Number Publication Date
CN115934090A CN115934090A (zh) 2023-04-07
CN115934090B true CN115934090B (zh) 2023-05-23

Family

ID=85828702

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310010274.8A Active CN115934090B (zh) 2023-01-05 2023-01-05 一种由二进制代码转换源代码的方法

Country Status (1)

Country Link
CN (1) CN115934090B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112733137A (zh) * 2020-12-24 2021-04-30 哈尔滨工业大学 一种面向漏洞检测的二进制代码相似性分析方法
CN113722218A (zh) * 2021-08-23 2021-11-30 南京审计大学 一种基于编译器中间表示的软件缺陷预测模型构建方法
CN115168856A (zh) * 2022-07-29 2022-10-11 山东省计算中心(国家超级计算济南中心) 二进制代码相似性检测方法及物联网固件漏洞检测方法
CN115563627A (zh) * 2022-12-06 2023-01-03 中国电子科技集团公司第三十研究所 一种基于人机协同的二进制程序漏洞静态分析方法

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8832672B2 (en) * 2011-01-28 2014-09-09 International Business Machines Corporation Ensuring register availability for dynamic binary optimization
US10761841B2 (en) * 2018-10-17 2020-09-01 Denso International America, Inc. Systems and methods for identifying source code from binaries using machine learning
US10656940B1 (en) * 2019-02-04 2020-05-19 Architecture Technology Corporation Systems, devices, and methods for source code generation from binary files
CN111475820B (zh) * 2020-04-28 2023-08-01 张皓天 基于可执行程序的二进制漏洞检测方法、系统及存储介质
US11900086B2 (en) * 2020-10-20 2024-02-13 Battelle Energy Alliance, Llc Systems and methods for architecture-independent binary code analysis
CN115455382A (zh) * 2022-08-11 2022-12-09 武汉大学 一种二进制函数代码的语义比对方法及装置

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112733137A (zh) * 2020-12-24 2021-04-30 哈尔滨工业大学 一种面向漏洞检测的二进制代码相似性分析方法
CN113722218A (zh) * 2021-08-23 2021-11-30 南京审计大学 一种基于编译器中间表示的软件缺陷预测模型构建方法
CN115168856A (zh) * 2022-07-29 2022-10-11 山东省计算中心(国家超级计算济南中心) 二进制代码相似性检测方法及物联网固件漏洞检测方法
CN115563627A (zh) * 2022-12-06 2023-01-03 中国电子科技集团公司第三十研究所 一种基于人机协同的二进制程序漏洞静态分析方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于神经机器翻译的二进制函数相似性检测方法;陈斌;《信息工程大学学报》;第22卷(第6期);675-682 *

Also Published As

Publication number Publication date
CN115934090A (zh) 2023-04-07

Similar Documents

Publication Publication Date Title
Liu et al. Deepfuzz: Automatic generation of syntax valid c programs for fuzz testing
Watson et al. On learning meaningful assert statements for unit test cases
CN112733137B (zh) 一种面向漏洞检测的二进制代码相似性分析方法
Jeon et al. AutoVAS: An automated vulnerability analysis system with a deep learning approach
Zhang et al. Unifying the perspectives of nlp and software engineering: A survey on language models for code
Si et al. Learning a meta-solver for syntax-guided program synthesis
CN108027748A (zh) 指令集模拟器及其模拟器生成方法
Xu et al. Dsmith: Compiler fuzzing through generative deep learning model with attention
Zheng et al. CodeAttention: translating source code to comments by exploiting the code constructs
Chen et al. Supersonic: Learning to generate source code optimizations in C/C++
Wen et al. Babeltower: Learning to auto-parallelized program translation
Balbiani et al. A dynamic logic for termgraph rewriting
CN115934090B (zh) 一种由二进制代码转换源代码的方法
Xu et al. Tree2tree structural language modeling for compiler fuzzing
Chen et al. Learning to improve code efficiency
Khodadadi et al. Hymo: Vulnerability detection in smart contracts using a novel multi-modal hybrid model
CN116841869A (zh) 基于代码结构化信息及审查知识的Java代码审查评论生成方法及装置
Zhou et al. Survey of intelligent program synthesis techniques
Duy et al. VulnSense: Efficient Vulnerability Detection in Ethereum Smart Contracts by Multimodal Learning with Graph Neural Network and Language Model
Hanifi et al. Software Vulnerability Prediction Knowledge Transferring Between Programming Languages
Yan et al. LSTM-based with deterministic negative sampling for API suggestion
Meng et al. Binary code multi-author identification in multi-toolchain scenarios
Liang et al. Semantics-recovering decompilation through neural machine translation
Shao et al. A survey of available information recovery of binary programs based on machine learning
Escalada et al. An adaptable infrastructure to generate training datasets for decompilation issues

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CP01 Change in the name or title of a patent holder
CP01 Change in the name or title of a patent holder

Address after: Shandong computing center, No.19 Keyuan Road, Lixia District, Jinan City, Shandong Province 250014

Patentee after: SHANDONG COMPUTER SCIENCE CENTER(NATIONAL SUPERCOMPUTER CENTER IN JINAN)

Patentee after: Qilu University of Technology (Shandong Academy of Sciences)

Address before: Shandong computing center, No.19 Keyuan Road, Lixia District, Jinan City, Shandong Province 250014

Patentee before: SHANDONG COMPUTER SCIENCE CENTER(NATIONAL SUPERCOMPUTER CENTER IN JINAN)

Patentee before: Qilu University of Technology