CN106126981B - 基于虚拟函数表替换的软件安全防护方法 - Google Patents

基于虚拟函数表替换的软件安全防护方法 Download PDF

Info

Publication number
CN106126981B
CN106126981B CN201610767154.2A CN201610767154A CN106126981B CN 106126981 B CN106126981 B CN 106126981B CN 201610767154 A CN201610767154 A CN 201610767154A CN 106126981 B CN106126981 B CN 106126981B
Authority
CN
China
Prior art keywords
function
address
virtual
code
core
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.)
Expired - Fee Related
Application number
CN201610767154.2A
Other languages
English (en)
Other versions
CN106126981A (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.)
University of Electronic Science and Technology of China
Original Assignee
University of Electronic Science and Technology of China
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 University of Electronic Science and Technology of China filed Critical University of Electronic Science and Technology of China
Priority to CN201610767154.2A priority Critical patent/CN106126981B/zh
Publication of CN106126981A publication Critical patent/CN106126981A/zh
Application granted granted Critical
Publication of CN106126981B publication Critical patent/CN106126981B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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
    • 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/107License processing; Key processing
    • 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/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Storage Device Security (AREA)

Abstract

本发明公开一种基于虚拟函数表替换的软件安全防护方法,属于软件安全领域。采用核心功能代码预加载与实际执行相分离的技术,保护程序不被恶意软件攻击。核心代码运用代理类(包含一系列虚函数)进行系统函数调用,然后其预先被加载入内存,获取其机器码,存入相应文件。实际执行时,程序开辟内存区域运行核心功能的机器码,并在当前环境下获取系统函数地址,用于替换代理类中调用的系统函数,确保程序的可移植性。本方法从根本上保护了程序的安全性,完成过程不基于其他安全工具,利用虚函数表机制,巧妙地降低了实现难度。

Description

基于虚拟函数表替换的软件安全防护方法
技术领域
本发明涉及软件安全技术领域,具体涉及基于虚拟函数表替换的软件安全防护方法。
背景技术
随着计算机安全领域相关技术的飞速发展,在没有源代码的情况下对于各类软件的分析越来越容易。近年来,动态分析技术以及软件逆向技术等都已得到充分的发展,在帮助科研者更加精确地分析恶意软件的同时,也存在损害正常软件知识产权的可能性。
逆向工程属于正向工程的反转过程,是一个设计恢复的过程。目的是通过分析目标软件或者特定系统,从而认定其主要的架构以及各类构件的属性和构件之间的交互关系,同时通过抽象高层设计来表现构件之间的相互联系。其基本原理是抽取软件系统的核心要素而隐藏技术实现的细节,然后使用抽象的结构在高层上描述软件系统。逆向工程主要遵从数据集采集、知识组织、信息浏览的执行顺序。主要的数据采集很大程度上依赖于知识组织的完成性。同时,信息浏览是整个过程的关键行为,对于原始程序的逻辑设计理解都是在信息浏览中进行的。信息浏览通过遍历目标软件中的多维结构,按计算机领域的划分标准分析以及过滤信息。逆向工程获取的系统结构相比直接的高级语言编写的源代码更符合设计者的实际逻辑和接近实际应用,同时在抽象层上对软件系统的提取表示要更加便于理解。
逆向工程在没有源代码的情况下,通过二进制文件恢复系统的核心设计,是一种高可用的分析恶意软件技术,但是在另一方面,也给正常软件的知识产权保护带来了难题。不法者通过逆向工程技术能够获取到正常软件的各类核心信息,以还原正常的软件,从而破坏了软件的知识产权。逆向工程技术仅仅是软件恢复的一种技术,计算机安全领域还涉及有其他的技术用于软件的抽象,所以为了保护软件的安全性,本发明提出了一种软件核心功能与辅助功能分开加载以及编译的代码编写技术,能够有效地保护软件系统的安全性。
本发明基于高级语言的虚函数机制。某些高级语言为了实现多态的机制,构建了虚函数。虚函数的实现通过一张虚函数表,在虚函数表中,保存着当前类中所有虚函数的地址,当前类实例化后,此表便被分配到实例的内存中。无论对象实例被分配到内存中的何处,虚函数表都会被分配到实例的最前面的四个字节处,所以能够通过获取实例对象的地址间接获取到虚函数表的地址,以此来获取实例对象中所有虚函数的内存地址。
本发明还涉及RC4加密算法和MD5加密算法的运用。RC4为对称加密算法,其不是对明文进行分组加密,而是以字节流的方式对明文的每个字节进行加密,解密的时候对密文中的每个字节进行依次解密。RC4加密算法的特点是算法实现简单,运行速度快,并且密钥长度可变。RC4加密算法分为三个步骤,首先初始化状态向量S和临时向量T,然后初始排列S,最后产生密钥流。MD5加密算法即为信息摘要算法,用于保证信息的一致性和完整性。MD5算法能够将任意长度的数据转换成固定长度的HASH值,其抗修改性和强抗碰撞的特点可以将此HASH值作为其他加密算法的密钥,更大程度地保护加密文件的安全性。
发明内容
针对上述现有技术,本发明目的在于提供基于虚拟函数表替换的软件安全防护方法,解决现有软件防护技术其机器码生成环境与其运行环境相异时,存在系统函数地址获取失败等技术问题。
为达到上述目的,本发明采用的技术方案如下:
基于虚拟函数表替换的软件安全防护方法,包括如下步骤,
步骤1、根据预加载的核心功能函数特征,获取存放有核心二进制代码的加密文件;
步骤2、在当前运行环境,寻找应用程序接口函数地址和动态链接库地址,将寻找到的应用程序接口函数地址和动态链接库地址,按虚函数表中虚函数存放结构保存于各个虚函数自定义的数据结构中;
步骤3、定义代理类类型指针指向存放有应用程序接口函数地址和动态链接库地址的数据结构,获得重构的虚函数表数据结构;
步骤4、获取运行内存,根据重构的虚函数表数据结构和加密文件,通过在运行内存中替换代理类类型指针的地址,加载核心二进制代码至运行内存,从而在加密防护下正常运行程序。
上述方法中,所述的步骤1,包括如下步骤
步骤1.1、加载核心功能函数代码到内存,获取核心功能函数的首地址和体空间大小;
步骤1.2、根据首地址和体空间大小,读取内存中的核心二进制代码,将核心二进制代码存入文件;
步骤1.3、利用MD5加密算法计算文件的哈希值;
步骤1.4、利用文件的哈希值作为密钥,采用RC4加密算法获得加密文件。
上述方法中,所述的步骤2,包括如下步骤
步骤2.1、在当前运行环境,虚函数表类中按照核心功能的系统函数调用顺序,分别依次调用相同的应用程序接口函数和动态链接库,找出应用程序接口函数地址和动态链接库地址;
步骤2.2、将寻找到的应用程序接口函数地址和动态链接库地址,按虚函数表中虚函数存放结构保存于各个虚函数自定义的数据结构中。
上述方法中,所述的步骤4,包括如下步骤,
步骤4.1、获取运行内存,解密并读取加密文件内的核心二进制代码至运行内存;
步骤4.2、调用重构的虚函数表数据结构作为运行参数代入运行内存,替换代理类类型指针的地址;
步骤4.3、重新加载核心二进制代码至运行内存,从而在加密防护下正常运行程序。
每款软件都拥有核心重要的功能实现模块,这些模块往往是软件最具有价值的部分,如果此类设计被不法者获得,将使得软件的知识产权得不到应有的保护。所以本发明的主要目的便是保护此部分的源代码以及设计思想。
将核心代码加载入内存中然后取出放入到特定文件中保存。核心功能代码在编写完成后首先单独加载入内存中。根据PE文件的固定格式,计算文件加载的偏移位置,能够正确地获取函数加载的内存入口,即函数加载的首地址。同时,代码加载入内存后,找寻代码结束的位置(存在特殊符号),以此获取代码加载的大小。高级语言加载入内存之前会编译成二进制代码,即内存中运行的是核心功能的二进制代码,这二进制代码正是本发明需要的部分。通过函数加载的首地址以及大小,能够从内存中提取出完整的核心二进制代码。当二进制代码提取出来后,将其保存在特定的文件中,方便之后程序的运行。
对于存放二进制代码的文件,本发明也考虑到其安全性,所以采用MD5和RC4加密算法对文件进行加密。首先,利用MD5加密算法计算文件的HASH值,因为MD5算法的特性,其生成的HASH值具有唯一性,安全性较高。然后,采用RC4加密算法,将之前生成的HASH值作为密钥,存放二进制代码的文件作为输入,生成加密后的特定文件,从而保护文件的安全性和完整性。
虚表重构模块:
当核心代码的二进制文件生成的平台与辅助核心代码加载的程序运行的平台不一致时,便会出现二进制文件无法正常运行的情况,为了解决此类问题,本发明利用高级语言的虚函数机制保证程序的正常运行。
核心代码在编写的时候,对于每一个系统调用,都构建虚函数来完成,保证系统调用在虚函数中实现,由于每个虚函数的地址都存放在虚函数表中,虚函数表的地址存放在对象的固定位置,所以能够很方便地找寻到系统调用的实际内存位置,便于运行时替换。
加载核心代码的程序运行的平台即为软件运行的平台,所以需要在此平台下获取所需系统调用的地址。在辅助加载的程序中重新自定义一个VirtualTable类,用于替换核心代码中的系统调用。VirtualTable类中按照虚函数表中系统调用的顺序,分别依次调用相同的API和DLL,这样能够帮助各类调用正常地在当前的系统中运行。这个类在核心代码运行的时候将作为参数传入,帮助其在当前平台下正常执行。
核心机器码加载:
核心机器码的运行依赖于辅助的加载程序,加载程序通过解密经RC4加密的文件获取到原始的机器码,再将机器码加载入内存中运行。加载程序利用VirtualTable类获取当前平台下系统API以及DLL的地址,将此类作为参数传入到机器码中,所以当核心机器码运行在当前平台时,其所有的系统调用已经被VirtualTable类替换,保证了程序的正常运行。
与现有技术相比,本发明的有益效果:
利用核心功能函数预加载与实际执行相分离的技术,同时借助虚拟函数表机制完成软件防护功能;机器码生成环境与其运行环境相异时,各类API和DLL依然能够正常地调用和运行。
附图说明
图1整体设计架构;
图2核心代码生成模块的流程图;
图3核心代码运行模块的流程图。
具体实施方式
本说明书中公开的所有特征,或公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。
下面结合附图对本发明做进一步说明:
实施例1
核心代码生成模块
核心代码生成模块主要利用虚函数机制,将系统调用都经过虚函数实现,然后加载入内存,生成二进制代码,具体流程如下所示:
a)构建包含虚函数的类;
b)按照所需系统API的调用顺序,完成每个虚函数的编写;
c)代码利用虚函数完成系统调用;
d)加载核心代码入内存;
e)获取代码加载的首地址;
f)获取代码加载的大小;
g)根据首地址和大小,将二进制代码从内存中取出;
h)保存二进制代码到特定文件;
i)利用MD5加密算法生成特定文件的HASH值;
j)利用RC4加密算法,将HASH值作为密钥加密文件;
k)保存文件。
上述技术方案中虚表重构模块设计如下:
虚表重构模块根据高级语言自带的虚函数机制的特点构建自己的VirtualTable类,辅助核心代码的运行。
VirtualTable类的构建。VirtualTable类的构建属于编码范畴,运用高级语言编写VirtualTable类时,按照核心代码中系统API的调用顺序,分别调用相应的函数。
上述技术方案中核心机器码加载设计如下:
核心机器码在平台运行时,需要辅助的加载程序和机器码共同完成,所以需要协调他们的有效合作。
首先,辅助的加载程序运用RC4算法解密之前加密的特定文件,获取到原始完整的二进制代码。然后将加载程序中按照虚函数表中虚函数的调用顺序构建的VirtualTable类作为参数传入二进制代码中,特换其本身具有的虚函数表中的系统调用,帮助二进制代码在当前平台成功运行。最后将核心机器码加载入内存中运行。具体实现过程如下:
a)解密特定文件,获取原始二进制代码;
b)调用VirtualTable类;
c)将VirtualTable类作为参数传入二进制文件;
d)替换虚函数表;
e)重新加载二进制代码入内存;
运行程序,等待输出。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何属于本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

Claims (4)

1.基于虚拟函数表替换的软件安全防护方法,其特征在于,包括如下步骤,
步骤1、根据预加载的核心功能函数特征,获取存放有核心二进制代码的加密文件;
步骤2、在当前运行环境,寻找应用程序接口函数地址和动态链接库地址,将寻找到的应用程序接口函数地址和动态链接库地址,按虚函数表中虚函数存放结构保存于各个虚函数自定义的数据结构中;
步骤3、定义代理类类型指针指向存放有应用程序接口函数地址和动态链接库地址的数据结构,获得重构的虚函数表数据结构;
步骤4、获取运行内存,根据重构的虚函数表数据结构和加密文件,通过在运行内存中替换代理类类型指针的地址,加载核心二进制代码至运行内存,从而在加密防护下正常运行程序。
2.根据权利要求1所述的基于虚拟函数表替换的软件安全防护方法,其特征在于,所述的步骤1,包括如下步骤
步骤1.1、加载核心功能函数代码到内存,获取核心功能函数的首地址和体空间大小;
步骤1.2、根据首地址和体空间大小,读取内存中的核心二进制代码,将核心二进制代码存入文件;
步骤1.3、利用MD5加密算法计算文件的哈希值;
步骤1.4、利用文件的哈希值作为密钥,采用RC4加密算法获得加密文件。
3.根据权利要求1所述的基于虚拟函数表替换的软件安全防护方法,其特征在于,所述的步骤2,包括如下步骤
步骤2.1、在当前运行环境,虚函数表类中按照核心功能的系统函数调用顺序,分别依次调用相同的应用程序接口函数和动态链接库,找出应用程序接口函数地址和动态链接库地址;
步骤2.2、将寻找到的应用程序接口函数地址和动态链接库地址,按虚函数表中虚函数存放结构保存于各个虚函数自定义的数据结构中。
4.根据权利要求1所述的基于虚拟函数表替换的软件安全防护方法,其特征在于,所述的步骤4,包括如下步骤,
步骤4.1、获取运行内存,解密并读取加密文件内的核心二进制代码至运行内存;
步骤4.2、调用重构的虚函数表数据结构作为运行参数代入运行内存,替换代理类类型指针的地址;
步骤4.3、重新加载核心二进制代码至运行内存,从而在加密防护下正常运行程序。
CN201610767154.2A 2016-08-30 2016-08-30 基于虚拟函数表替换的软件安全防护方法 Expired - Fee Related CN106126981B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610767154.2A CN106126981B (zh) 2016-08-30 2016-08-30 基于虚拟函数表替换的软件安全防护方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610767154.2A CN106126981B (zh) 2016-08-30 2016-08-30 基于虚拟函数表替换的软件安全防护方法

Publications (2)

Publication Number Publication Date
CN106126981A CN106126981A (zh) 2016-11-16
CN106126981B true CN106126981B (zh) 2019-04-02

Family

ID=57272322

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610767154.2A Expired - Fee Related CN106126981B (zh) 2016-08-30 2016-08-30 基于虚拟函数表替换的软件安全防护方法

Country Status (1)

Country Link
CN (1) CN106126981B (zh)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108234436A (zh) * 2016-12-22 2018-06-29 航天信息股份有限公司 一种基于OpenStack 对象存储的加密方法和系统
EP3416086A1 (en) * 2017-06-15 2018-12-19 Gemalto Sa Method for managing an instance of a class
DE102017214591A1 (de) * 2017-08-22 2019-02-28 Robert Bosch Gmbh Verfahren und Vorrichtung zum Schützen eines Gerätes
CN108021792B (zh) * 2017-12-04 2021-05-28 北京元心科技有限公司 镜像软件的生成方法、装置及相应终端
CN108133147B (zh) * 2017-12-20 2023-12-22 中兴通讯股份有限公司 可执行代码的保护方法、设备及可读存储介质
CN108446149B (zh) * 2018-02-28 2021-07-20 北京凌宇智控科技有限公司 一种第三方动态库接口拦截方法及系统
CN108804937B (zh) * 2018-06-12 2021-03-02 广州华多网络科技有限公司 系统函数调用方法及相关装置
CN109086183B (zh) * 2018-07-12 2022-08-16 武汉斗鱼网络科技有限公司 一种应用程序的监控方法、装置、电子设备及存储介质
CN112889045B (zh) * 2018-10-23 2024-05-03 华为技术有限公司 虚拟函数指针验证设备及方法
CN112084490A (zh) * 2020-09-09 2020-12-15 南京烽火星空通信发展有限公司 一种基于Linux内核调用实现软件源代码的保护方法及系统
CN112241519A (zh) * 2020-11-05 2021-01-19 王志平 一种软件版权保护的实现方法
CN113836531B (zh) * 2021-09-25 2024-10-11 上海蛮犀科技有限公司 一种移动应用代码内存动态还原的检测方法
CN115525879B (zh) * 2022-11-25 2023-04-07 易方信息科技股份有限公司 一种针对iOS的SDK内部敏感数据的保护方法
CN117113423B (zh) * 2023-10-24 2024-04-12 中电科网络安全科技股份有限公司 一种数据库透明加密方法、装置、设备及存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103136458A (zh) * 2013-01-21 2013-06-05 中标软件有限公司 一种Linux操作系统的代码保护方法及其模块
CN103324481A (zh) * 2013-06-26 2013-09-25 网宿科技股份有限公司 通过汇编实现代码混淆的编译方法和系统
CN104091100A (zh) * 2014-07-15 2014-10-08 电子科技大学 一种基于编译中间结果的软件保护方法
CN104392169A (zh) * 2014-12-15 2015-03-04 福建天晴数码有限公司 一种Native API函数重构方法和装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105184169A (zh) * 2015-09-14 2015-12-23 电子科技大学 Windows操作环境下基于插桩工具的漏洞检测方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103136458A (zh) * 2013-01-21 2013-06-05 中标软件有限公司 一种Linux操作系统的代码保护方法及其模块
CN103324481A (zh) * 2013-06-26 2013-09-25 网宿科技股份有限公司 通过汇编实现代码混淆的编译方法和系统
CN104091100A (zh) * 2014-07-15 2014-10-08 电子科技大学 一种基于编译中间结果的软件保护方法
CN104392169A (zh) * 2014-12-15 2015-03-04 福建天晴数码有限公司 一种Native API函数重构方法和装置

Also Published As

Publication number Publication date
CN106126981A (zh) 2016-11-16

Similar Documents

Publication Publication Date Title
CN106126981B (zh) 基于虚拟函数表替换的软件安全防护方法
CN108595989B (zh) 一种iOS下移动APP安全防护系统及方法
CN106599628B (zh) 一种基于模块钩子的Python字节码文件保护方法
CN106203006A (zh) 基于dex与so文件动态执行的Android应用加固方法
CN108491235B (zh) 结合动态加载和函数Native化的DEX保护方法
CN110210190A (zh) 一种基于二次汇编的代码混淆方法
US20160203087A1 (en) Method for providing security for common intermediate language-based program
CN105683990B (zh) 用于保护动态库的方法和装置
CN103413073B (zh) 一种保护java可执行程序的方法及设备
CN103413075B (zh) 一种通过虚拟机保护java可执行程序的方法及设备
US8874932B2 (en) Method for order invariant correlated encrypting of data and SQL queries for maintaining data privacy and securely resolving customer defects
US20160239671A1 (en) Method and device for protecting an application and method and device for executing a protected application thus protected
US9607160B2 (en) Method and apparatus for providing string encryption and decryption in program files
CN109598107B (zh) 一种基于应用安装包文件的代码转换方法及装置
CN107273723B (zh) 一种基于so文件加壳的Android平台应用软件保护方法
CN107291485B (zh) 动态链接库的加固方法、运行方法、加固装置和安全系统
CN106548046B (zh) 一种保护代码的装置和方法
CN112052433B (zh) 一种Jar文件的虚拟化保护方法、终端及存储介质
CN108133147B (zh) 可执行代码的保护方法、设备及可读存储介质
CN109241707A (zh) 应用程序的混淆方法、装置和服务器
TWI695287B (zh) 用於保護碼的方法、電腦程式產品和系統
CN117093964A (zh) 一种源代码的加密方法、装置、存储介质及电子设备
US11061998B2 (en) Apparatus and method for providing security and apparatus and method for executing security to protect code of shared object
CN108021790B (zh) 文件保护方法、装置、计算设备及计算机存储介质
CN105893860A (zh) 关键代码保护方法以及代码生成装置和代码运行装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20190402

CF01 Termination of patent right due to non-payment of annual fee