CN113626773A - 一种基于中间语言的代码保护方法 - Google Patents

一种基于中间语言的代码保护方法 Download PDF

Info

Publication number
CN113626773A
CN113626773A CN202010374179.2A CN202010374179A CN113626773A CN 113626773 A CN113626773 A CN 113626773A CN 202010374179 A CN202010374179 A CN 202010374179A CN 113626773 A CN113626773 A CN 113626773A
Authority
CN
China
Prior art keywords
intermediate language
function
code
interpreter
protected
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.)
Granted
Application number
CN202010374179.2A
Other languages
English (en)
Other versions
CN113626773B (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.)
Shanghai Feiyu Information Technology Co ltd
Original Assignee
Shanghai Feiyu Information Technology Co ltd
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 Shanghai Feiyu Information Technology Co ltd filed Critical Shanghai Feiyu Information Technology Co ltd
Priority to CN202010374179.2A priority Critical patent/CN113626773B/zh
Publication of CN113626773A publication Critical patent/CN113626773A/zh
Application granted granted Critical
Publication of CN113626773B publication Critical patent/CN113626773B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • G06F8/434Pointers; Aliasing

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

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

Description

一种基于中间语言的代码保护方法
技术领域
本发明涉及一种软件安全保护领域,特别是涉及一种代码虚拟化保护方法。
背景技术
商业软件经常由于加密算法逻辑被攻击者通过逆向工程破解,使得不法分子从中受益,导致开发者的软件知识产权受到侵犯。开发者可以通过软件保护技术加大攻击者的逆向难度,增加攻击者的逆向成本,以保护开发者权益。
目前常见的同类方案有软件加壳、花指令、控制流平坦化、代码虚拟化等软件保护技术。
软件加壳分为压缩壳和加密壳,由于软件运行时壳会解压、解密程序的代码及数据,攻击者可以很轻易的将运行时的进程转储,从而得到程序的二进制代码。
动态解密技术会在运行时动态地解密代码及数据,虽然不会一次性解密全部代码,但攻击者只要分析出解密函数,使用钩子等技术便可破解从而针对软件的二进制代码进行逆向工程。
花指令技术是在原始的软件代码中插入大量无关的操作,增加攻击者逆向分析的工作量,但攻击者可以通过发现花指令的规律或者是通过污点分析等方式排除无关操作等方式,同样能够较轻易的过滤掉花指令,找到关键的加密算法逻辑。
控制流平坦化是将程序基本块拆分成诸多小块,通过生成大量的分支,将程序原始的控制流拆散,增加控制流的复杂度,从而隐藏程序真正的处理逻辑。但目前攻击者已经可以通过符号执行等技术,缓解平坦化控制流,还原程序接近原始的控制流。
代码虚拟化技术则是通过将程序原始的一条或多条指令翻译为一种新的自定义指令和操作,生成相应的虚拟化代码,并在原来代码中嵌入能够执行虚拟化代码的解释器。目前的代码虚拟化技术大多是针对于机器码的虚拟化,例如VMProtect等,直接针对生成的可执行程序进行虚拟化代码保护,允许使用代码虚拟化技术保护的指令集较为单一,主要是针对于x86指令集的代码虚拟化,此外还可能存在兼容性和稳定性的问题。
因此,现有技术中的软件保护技术均存在采用单一软件保护技术,造成保护力度较低、仅支持少数指令集的问题。
发明内容
鉴于以上所述现有技术的缺点,本发明的目的在于提供一种基于中间语言的代码保护方法,用于解决现有技术中采用单一软件保护技术,存在保护力度较低、仅支持少数指令集的问题。
本发明提供一种基于中间语言的代码保护方法,所述方法包括以下步骤:
将待保护函数的源代码编译成第一中间语言;将所述第一中间语言翻译成虚拟化指令代码;
将所述待保护函数的调用方式修改为采用解释器来执行所述虚拟化指令代码;
编写所述解释器的解释器函数,将所述解释器函数编译成第二中间语言;合并所述虚拟化指令代码和所述第二中间语言,得到第三中间语言;
混淆所述第三中间语言。
于本发明的一实施例中,所述将待保护函数的源代码编译成第一中间语言之前的步骤还包括:对待保护的函数进行标记。
于本发明的一实施例中,所述标记的方式包括使用特殊化函数名、设置函数属性、预处理指令的一种或多种组合。
于本发明的一实施例中,所述修改所述函数的调用方式包括:删除所述待保护函数。
于本发明的一实施例中,删除所述待保护函数后,所述修改所述函数的调用方式还包括:将所述解释器的全局变量进行初始化。
于本发明的一实施例中,将所述解释器的全局变量进行初始化后,所述修改所述函数的调用方式还包括:将所述待保护函数的传入参数存入虚拟化内存中。
于本发明的一实施例中,所述混淆所述第三中间语言,包括:将所述第三中间语言中的虚拟化指令代码随机化。
于本发明的一实施例中,所述混淆所述第三中间语言,还包括:修改所述第三中间语言中的虚拟化指令代码的类型。
于本发明的一实施例中,所述混淆所述第三中间语言,还包括:使用定义内联函数的方式消除所述第三中间语言中的第二中间语言的代码结构。
本发明还提供一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明的一种基于中间语言的代码保护方法中任意一项所述的方法步骤。
如上所述,本发明的一种基于中间语言的代码保护方法,提供一种基于中间语言的代码虚拟化方案,以代码虚拟化的强大力度保护软件代码,大幅度增加攻击者的逆向工程工作量;相比于现有的代码虚拟化是直接应用于可执行程序上,本发明的方案是基于源代码层面,在编译的过程中实施代码虚拟化保护,能够提供更好的程序稳定性和兼容性。
附图说明
图1显示为本发明第一实施方式中的整体工作流程图。
图2显示为本发明第一实施方式中的修改调用待保护函数的方式的工作流程图。
具体实施方式
以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
请参阅图1,本发明的第一实施方式涉及一种基于中间语言的代码保护方法,具体如下以下步骤:
步骤101,将待保护函数的源代码编译成第一中间语言;将第一中间语言翻译成虚拟化指令代码;
具体的说,将待保护函数的源代码编译成第一中间语言之前,先对待保护的函数进行标记;其中,标记方式包括使用特殊化函数名、设置函数属性(attribute)、预处理指令(#pragma)的一种或多种组合。
使用clang编译器对标记后的待保护函数的源代码进行编译,生成基于llvm的中间语言,记为第一中间语言。
进一步说明,根据标记定位到待保护的函数,使用llvm中间语言处理框架加载生成的第一中间语言文件,并使用虚拟化保护的翻译器根据每一条中间语言指令生成对应的虚拟化指令代码。
步骤102,将待保护函数的调用方式修改为采用解释器来执行虚拟化指令代码;
请参阅图2,具体的说,修改调用待保护函数的方式包括:
步骤1021,删除待保护函数的代码实现部分;采用这种方案,在待保护函数被转换为对应的虚拟化指令代码后,删除待保护函数的源代码,可保证最终生成的二进制文件中没有该函数原始的汇编代码,从而避免攻击者用常规的方法反汇编或反编译该待保护函数。
步骤1022,对解释器相关的全局变量进行初始化;即将部分指针指向相关的全局变量,同时将部分全局变量初始化为0。
步骤1023,将待保护函数的传入参数存入虚拟化内存当中;需要说明的是,待保护函数的传入参数是在调用受保护函数的那个函数中实例化的参数,也就是调用者中的变量,不会随着待保护函数的删除而删除。此外,待保护函数由第一中间语言转换为虚拟化指令代码后,若原待保护函数中需要对传入参数进行处理,则在虚拟化指令代码解释执行时也需要对传入参数进行处理,因此保存传入参数的目的是为了解释执行虚拟化指令代码时能够更方便的对这些参数进行处理。
修改完成后调用解释器。
步骤103,编写解释器的解释器函数,将解释器函数编译成第二中间语言;合并虚拟化指令代码和第二中间语言,得到第三中间语言;
具体的说,使用高级语言(C/C++)编写该解释器函数,使得该解释器能够执行虚拟化指令代码,并能够保持第一中间语言的语义不变;
使用clang编译器对解释器函数进行编译,生成解释器函数的中间语言,记为第二中间语言;将前序步骤生成的虚拟化指令代码与第二中间语言合并,得到完整的虚拟化后的中间语言表示,记为第三中间语言。
将预先准备好的中间语言形式的解释器导入到此模块中,并将全局变量、函数等与解释器关联。
步骤104,混淆第三中间语言。
具体的说,混淆生成的第三中间语言,对解释器函数及虚拟化代码进行保护,具体包括:
使用定义内联函数的方式消除第三中间语言中的第二中间语言的代码结构,使解释器的控制流图更为复杂
使用随机数发生器方式将虚拟化指令代码的操作码随机化,使虚拟化指令代码的值分布更为随机,并对应修改解释器部分;
改变各种虚拟化指令代码的类型,使虚拟化指令代码的多样性得到充分的提升。
本发明的第一实施方式涉及一种基于中间语言的代码保护方法,还包括以下步骤:
将经过虚拟化保护的第三中间语言文件,使用llvm编译器后端进行由中间语言到二进制代码的代码生成,可以得到支持多种架构的二进制可执行文件。
需要说明的是,不同架构下的第一中间语言存在部分差异,因此生成第三中间语言也存在差异;无论目标是何种架构,源代码中间语言形式都是类似的,通过设置编译参数,clang编译器后端能够将中间语言转换成不同架构下的机器语言。
本发明的第二实施方式涉及一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述第一实施方式中任一所述方法的步骤。
综上所述,本发明的一种基于中间语言的代码保护方法,提供一种基于中间语言的代码虚拟化方案,以代码虚拟化的强大力度保护软件代码,大幅度增加攻击者的逆向工程工作量;相比于现有的代码虚拟化是直接应用于可执行程序上,本发明的方案是基于源代码层面,在编译的过程中实施代码虚拟化保护,能够提供更好的程序稳定性和兼容性。此外,本发明基于中间语言的特性,借助于编译器后端能够支持多种架构指令集,方便用户使用。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。

Claims (10)

1.一种基于中间语言的代码保护方法,其特征在于,所述方法包括以下步骤:
将待保护函数的源代码编译成第一中间语言;将所述第一中间语言翻译成虚拟化指令代码;
将所述待保护函数的调用方式修改为采用解释器来执行所述虚拟化指令代码;
编写所述解释器的解释器函数,将所述解释器函数编译成第二中间语言;合并所述虚拟化指令代码和所述第二中间语言,得到第三中间语言;
混淆所述第三中间语言。
2.根据权利要求1所述的基于中间语言的代码保护方法,其特征在于,所述将待保护函数的源代码编译成第一中间语言之前的步骤还包括:对待保护的函数进行标记。
3.根据权利要求2所述的基于中间语言的代码保护方法,其特征在于,所述标记的方式包括使用特殊化函数名、设置函数属性、预处理指令的一种或多种组合。
4.根据权利要求1所述的基于中间语言的代码保护方法,其特征在于,所述修改所述函数的调用方式包括:删除所述待保护函数。
5.根据权利要求4所述的基于中间语言的代码保护方法,其特征在于,删除所述待保护函数后,所述修改所述函数的调用方式还包括:将所述解释器的全局变量进行初始化。
6.根据权利要求5所述的基于中间语言的代码保护方法,其特征在于,将所述解释器的全局变量进行初始化后,所述修改所述函数的调用方式还包括:将所述待保护函数的传入参数存入虚拟化内存中。
7.根据权利要求1所述的基于中间语言的代码保护方法,其特征在于:所述混淆所述第三中间语言,包括:将所述第三中间语言中的虚拟化指令代码随机化。
8.根据权利要求7所述的基于中间语言的代码保护方法,其特征在于:所述混淆所述第三中间语言,还包括:修改所述第三中间语言中的虚拟化指令代码的类型。
9.根据权利要求8所述的基于中间语言的代码保护方法,其特征在于,所述混淆所述第三中间语言,还包括:使用定义内联函数的方式消除所述第三中间语言中的第二中间语言的代码结构。
10.一种存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1-9中任意一项所述的方法。
CN202010374179.2A 2020-05-06 2020-05-06 一种基于中间语言的代码保护方法 Active CN113626773B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010374179.2A CN113626773B (zh) 2020-05-06 2020-05-06 一种基于中间语言的代码保护方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010374179.2A CN113626773B (zh) 2020-05-06 2020-05-06 一种基于中间语言的代码保护方法

Publications (2)

Publication Number Publication Date
CN113626773A true CN113626773A (zh) 2021-11-09
CN113626773B CN113626773B (zh) 2024-04-02

Family

ID=78376621

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010374179.2A Active CN113626773B (zh) 2020-05-06 2020-05-06 一种基于中间语言的代码保护方法

Country Status (1)

Country Link
CN (1) CN113626773B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114707124A (zh) * 2022-03-22 2022-07-05 广东技术师范大学 基于代码虚拟化的.net平台代码保护方法和系统
FR3134905A1 (fr) * 2022-04-26 2023-10-27 Quarkslab Procédé de protection d’un code source d’un programme informatique

Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120290848A1 (en) * 2011-05-12 2012-11-15 Microsoft Corporation Emulating Mixed-Code Programs Using a Virtual Machine Instance
CN103443765A (zh) * 2011-02-01 2013-12-11 耶德托公司 自适应混淆的虚拟机
CN105046117A (zh) * 2015-06-30 2015-11-11 西北大学 一种具有指令集随机化的代码虚拟化软件保护系统
CN106599627A (zh) * 2016-11-22 2017-04-26 江苏通付盾科技有限公司 基于虚拟机保护应用安全的方法及装置
CN108369499A (zh) * 2015-12-04 2018-08-03 华为技术有限公司 编译器自动代码虚拟化
CN108614960A (zh) * 2018-05-11 2018-10-02 西北大学 一种基于前端字节码技术的JavaScript虚拟化保护方法
CN108681457A (zh) * 2018-05-11 2018-10-19 西北大学 基于代码下沉与残码解释的Android应用程序保护方法
CN108932406A (zh) * 2017-05-18 2018-12-04 北京梆梆安全科技有限公司 虚拟化软件保护方法和装置
CN109684794A (zh) * 2018-12-07 2019-04-26 成都盈海益讯科技有限公司 一种代码保护虚拟机kvm系统实现方法、装置、计算机设备及存储介质
CN109948308A (zh) * 2019-03-13 2019-06-28 智者四海(北京)技术有限公司 代码安全保护方法、装置、电子设备和计算机可读存储介质
CN110245467A (zh) * 2019-05-13 2019-09-17 西北大学 基于Dex2C与LLVM的Android应用程序保护方法
CN110673929A (zh) * 2019-09-29 2020-01-10 北京智游网安科技有限公司 一种保护异常机制的方法、智能终端及存储介质
CN110929234A (zh) * 2019-11-28 2020-03-27 施羊梦燊 一种基于代码虚拟化的Python程序加密保护系统与方法

Patent Citations (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103443765A (zh) * 2011-02-01 2013-12-11 耶德托公司 自适应混淆的虚拟机
US20120290848A1 (en) * 2011-05-12 2012-11-15 Microsoft Corporation Emulating Mixed-Code Programs Using a Virtual Machine Instance
CN105046117A (zh) * 2015-06-30 2015-11-11 西北大学 一种具有指令集随机化的代码虚拟化软件保护系统
CN108369499A (zh) * 2015-12-04 2018-08-03 华为技术有限公司 编译器自动代码虚拟化
CN106599627A (zh) * 2016-11-22 2017-04-26 江苏通付盾科技有限公司 基于虚拟机保护应用安全的方法及装置
CN108932406A (zh) * 2017-05-18 2018-12-04 北京梆梆安全科技有限公司 虚拟化软件保护方法和装置
CN108681457A (zh) * 2018-05-11 2018-10-19 西北大学 基于代码下沉与残码解释的Android应用程序保护方法
CN108614960A (zh) * 2018-05-11 2018-10-02 西北大学 一种基于前端字节码技术的JavaScript虚拟化保护方法
CN109684794A (zh) * 2018-12-07 2019-04-26 成都盈海益讯科技有限公司 一种代码保护虚拟机kvm系统实现方法、装置、计算机设备及存储介质
CN109948308A (zh) * 2019-03-13 2019-06-28 智者四海(北京)技术有限公司 代码安全保护方法、装置、电子设备和计算机可读存储介质
CN110245467A (zh) * 2019-05-13 2019-09-17 西北大学 基于Dex2C与LLVM的Android应用程序保护方法
CN110673929A (zh) * 2019-09-29 2020-01-10 北京智游网安科技有限公司 一种保护异常机制的方法、智能终端及存储介质
CN110929234A (zh) * 2019-11-28 2020-03-27 施羊梦燊 一种基于代码虚拟化的Python程序加密保护系统与方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
杜春来 等: "一种基于指令虚拟化的代码保护模型", 信息网络安全, no. 02, 10 February 2017 (2017-02-10), pages 22 - 28 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114707124A (zh) * 2022-03-22 2022-07-05 广东技术师范大学 基于代码虚拟化的.net平台代码保护方法和系统
FR3134905A1 (fr) * 2022-04-26 2023-10-27 Quarkslab Procédé de protection d’un code source d’un programme informatique
WO2023209305A1 (fr) * 2022-04-26 2023-11-02 Quarkslab Procédé de protection d'un code source d'un programme informatique

Also Published As

Publication number Publication date
CN113626773B (zh) 2024-04-02

Similar Documents

Publication Publication Date Title
CN108733988B (zh) 安卓平台上可执行程序的保护方法
CN108932406B (zh) 虚拟化软件保护方法和装置
US7111285B2 (en) Method and system for protecting software applications against static and dynamic software piracy techniques
US10339837B1 (en) Distribution of scrambled binary output using a randomized compiler
CN106462677B (zh) 一种保护软件项目的方法和装置
EP2897073B1 (en) Device for obfuscating application code and method for same
Balakrishnan et al. Code obfuscation literature survey
EP2962193B1 (en) Compiler based obfuscation
Madou et al. Software protection through dynamic code mutation
RU2439669C2 (ru) Способ предотвращения обратного инжиниринга программного обеспечения, неавторизованной модификации и перехвата данных во время выполнения
CN104239757B (zh) 应用程序防止逆向的方法及装置、运行方法及终端
US20160203087A1 (en) Method for providing security for common intermediate language-based program
CN108491235B (zh) 结合动态加载和函数Native化的DEX保护方法
WO2016078130A1 (zh) 一种防逆向apk文件的动态加载方法
JP2004038966A (ja) セキュアな変数データ保護を提供するセキュアで不明瞭なタイプライブラリ
KR101861341B1 (ko) 애플리케이션 코드의 역난독화 장치 및 이를 이용한 애플리케이션 코드의 역난독화 방법
CN104463002A (zh) 一种加固apk的方法和装置以及apk加固客户端和服务器
CN107273723B (zh) 一种基于so文件加壳的Android平台应用软件保护方法
CN109598107B (zh) 一种基于应用安装包文件的代码转换方法及装置
WO2015035827A1 (en) Method and apparatus for providing string encryption and decryption in program files
US10867017B2 (en) Apparatus and method of providing security and apparatus and method of executing security for common intermediate language
CN109614772B (zh) 基于应用安装包文件的代码转换方法及装置
CN113626773B (zh) 一种基于中间语言的代码保护方法
CN112052433B (zh) 一种Jar文件的虚拟化保护方法、终端及存储介质
Pizzolotto et al. OBLIVE: seamless code obfuscation for Java programs and Android apps

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