一种基于中间语言的代码保护方法技术

技术编号:30708098 阅读:26 留言:0更新日期:2021-11-10 10:59
本发明专利技术提供一种基于中间语言的代码保护方法,包括:将待保护函数的源代码编译成第一中间语言;将第一中间语言翻译成虚拟化指令代码;将待保护函数的调用方式修改为采用解释器来执行虚拟化指令代码;编写解释器的解释器函数,将解释器函数编译成第二中间语言;合并虚拟化指令代码和第二中间语言,得到第三中间语言;混淆第三中间语言。本发明专利技术提供一种基于中间语言的代码虚拟化方案,以代码虚拟化的强大力度保护软件代码,大幅度增加攻击者的逆向工程工作量;相比于现有的代码虚拟化是直接应用于可执行程序上,本发明专利技术的方案是基于源代码层面,在编译的过程中实施代码虚拟化保护,能够提供更好的程序稳定性和兼容性。提供更好的程序稳定性和兼容性。提供更好的程序稳定性和兼容性。

【技术实现步骤摘要】
一种基于中间语言的代码保护方法


[0001]本专利技术涉及一种软件安全保护领域,特别是涉及一种代码虚拟化保护方法。

技术介绍

[0002]商业软件经常由于加密算法逻辑被攻击者通过逆向工程破解,使得不法分子从中受益,导致开发者的软件知识产权受到侵犯。开发者可以通过软件保护技术加大攻击者的逆向难度,增加攻击者的逆向成本,以保护开发者权益。
[0003]目前常见的同类方案有软件加壳、花指令、控制流平坦化、代码虚拟化等软件保护技术。
[0004]软件加壳分为压缩壳和加密壳,由于软件运行时壳会解压、解密程序的代码及数据,攻击者可以很轻易的将运行时的进程转储,从而得到程序的二进制代码。
[0005]动态解密技术会在运行时动态地解密代码及数据,虽然不会一次性解密全部代码,但攻击者只要分析出解密函数,使用钩子等技术便可破解从而针对软件的二进制代码进行逆向工程。
[0006]花指令技术是在原始的软件代码中插入大量无关的操作,增加攻击者逆向分析的工作量,但攻击者可以通过发现花指令的规律或者是通过污点分析等方式排除无关操作等方式,同样能够较轻易的过滤掉花指令,找到关键的加密算法逻辑。
[0007]控制流平坦化是将程序基本块拆分成诸多小块,通过生成大量的分支,将程序原始的控制流拆散,增加控制流的复杂度,从而隐藏程序真正的处理逻辑。但目前攻击者已经可以通过符号执行等技术,缓解平坦化控制流,还原程序接近原始的控制流。
[0008]代码虚拟化技术则是通过将程序原始的一条或多条指令翻译为一种新的自定义指令和操作,生成相应的虚拟化代码,并在原来代码中嵌入能够执行虚拟化代码的解释器。目前的代码虚拟化技术大多是针对于机器码的虚拟化,例如VMProtect等,直接针对生成的可执行程序进行虚拟化代码保护,允许使用代码虚拟化技术保护的指令集较为单一,主要是针对于x86指令集的代码虚拟化,此外还可能存在兼容性和稳定性的问题。
[0009]因此,现有技术中的软件保护技术均存在采用单一软件保护技术,造成保护力度较低、仅支持少数指令集的问题。

技术实现思路

[0010]鉴于以上所述现有技术的缺点,本专利技术的目的在于提供一种基于中间语言的代码保护方法,用于解决现有技术中采用单一软件保护技术,存在保护力度较低、仅支持少数指令集的问题。
[0011]本专利技术提供一种基于中间语言的代码保护方法,所述方法包括以下步骤:
[0012]将待保护函数的源代码编译成第一中间语言;将所述第一中间语言翻译成虚拟化指令代码;
[0013]将所述待保护函数的调用方式修改为采用解释器来执行所述虚拟化指令代码;
[0014]编写所述解释器的解释器函数,将所述解释器函数编译成第二中间语言;合并所述虚拟化指令代码和所述第二中间语言,得到第三中间语言;
[0015]混淆所述第三中间语言。
[0016]于本专利技术的一实施例中,所述将待保护函数的源代码编译成第一中间语言之前的步骤还包括:对待保护的函数进行标记。
[0017]于本专利技术的一实施例中,所述标记的方式包括使用特殊化函数名、设置函数属性、预处理指令的一种或多种组合。
[0018]于本专利技术的一实施例中,所述修改所述函数的调用方式包括:删除所述待保护函数。
[0019]于本专利技术的一实施例中,删除所述待保护函数后,所述修改所述函数的调用方式还包括:将所述解释器的全局变量进行初始化。
[0020]于本专利技术的一实施例中,将所述解释器的全局变量进行初始化后,所述修改所述函数的调用方式还包括:将所述待保护函数的传入参数存入虚拟化内存中。
[0021]于本专利技术的一实施例中,所述混淆所述第三中间语言,包括:将所述第三中间语言中的虚拟化指令代码随机化。
[0022]于本专利技术的一实施例中,所述混淆所述第三中间语言,还包括:修改所述第三中间语言中的虚拟化指令代码的类型。
[0023]于本专利技术的一实施例中,所述混淆所述第三中间语言,还包括:使用定义内联函数的方式消除所述第三中间语言中的第二中间语言的代码结构。
[0024]本专利技术还提供一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本专利技术的一种基于中间语言的代码保护方法中任意一项所述的方法步骤。
[0025]如上所述,本专利技术的一种基于中间语言的代码保护方法,提供一种基于中间语言的代码虚拟化方案,以代码虚拟化的强大力度保护软件代码,大幅度增加攻击者的逆向工程工作量;相比于现有的代码虚拟化是直接应用于可执行程序上,本专利技术的方案是基于源代码层面,在编译的过程中实施代码虚拟化保护,能够提供更好的程序稳定性和兼容性。
附图说明
[0026]图1显示为本专利技术第一实施方式中的整体工作流程图。
[0027]图2显示为本专利技术第一实施方式中的修改调用待保护函数的方式的工作流程图。
具体实施方式
[0028]以下通过特定的具体实例说明本专利技术的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本专利技术的其他优点与功效。本专利技术还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本专利技术的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
[0029]需要说明的是,以下实施例中所提供的图示仅以示意方式说明本专利技术的基本构想,遂图式中仅显示与本专利技术中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也
可能更为复杂。
[0030]请参阅图1,本专利技术的第一实施方式涉及一种基于中间语言的代码保护方法,具体如下以下步骤:
[0031]步骤101,将待保护函数的源代码编译成第一中间语言;将第一中间语言翻译成虚拟化指令代码;
[0032]具体的说,将待保护函数的源代码编译成第一中间语言之前,先对待保护的函数进行标记;其中,标记方式包括使用特殊化函数名、设置函数属性(attribute)、预处理指令(#pragma)的一种或多种组合。
[0033]使用clang编译器对标记后的待保护函数的源代码进行编译,生成基于llvm的中间语言,记为第一中间语言。
[0034]进一步说明,根据标记定位到待保护的函数,使用llvm中间语言处理框架加载生成的第一中间语言文件,并使用虚拟化保护的翻译器根据每一条中间语言指令生成对应的虚拟化指令代码。
[0035]步骤102,将待保护函数的调用方式修改为采用解释器来执行虚拟化指令代码;
[0036]请参阅图2,具体的说,修改调用待保护函数的方式包括:
[0037]步骤1021,删除待保护函数的代码实现部分;采用这种方案,在待保护函数被转换为对应的虚拟化指令代码后,删除待保护函数的源代码,可保证最终生成的二进制文件中没有该函数原始的汇编代码,从而避免攻击者用常规的方法反汇编或反编译该待保护本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于中间语言的代码保护方法,其特征在于,所述方法包括以下步骤:将待保护函数的源代码编译成第一中间语言;将所述第一中间语言翻译成虚拟化指令代码;将所述待保护函数的调用方式修改为采用解释器来执行所述虚拟化指令代码;编写所述解释器的解释器函数,将所述解释器函数编译成第二中间语言;合并所述虚拟化指令代码和所述第二中间语言,得到第三中间语言;混淆所述第三中间语言。2.根据权利要求1所述的基于中间语言的代码保护方法,其特征在于,所述将待保护函数的源代码编译成第一中间语言之前的步骤还包括:对待保护的函数进行标记。3.根据权利要求2所述的基于中间语言的代码保护方法,其特征在于,所述标记的方式包括使用特殊化函数名、设置函数属性、预处理指令的一种或多种组合。4.根据权利要求1所述的基于中间语言的代码保护方法,其特征在于,所述修改所述函数的调用方式包括:删除所述待保护函数。5.根据权利要求4所述的基于中间语言的代码保护方法,其特征在于,删除所...

【专利技术属性】
技术研发人员:肖轩淦杨文博束骏亮李卷孺张媛媛周文君
申请(专利权)人:上海蜚语信息科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1