基于虚拟函数表替换的软件安全防护方法与流程

文档序号:11865137阅读:465来源:国知局
基于虚拟函数表替换的软件安全防护方法与流程

本发明涉及软件安全技术领域,具体涉及基于虚拟函数表替换的软件安全防护方法。



背景技术:

随着计算机安全领域相关技术的飞速发展,在没有源代码的情况下对于各类软件的分析越来越容易。近年来,动态分析技术以及软件逆向技术等都已得到充分的发展,在帮助科研者更加精确地分析恶意软件的同时,也存在损害正常软件知识产权的可能性。

逆向工程属于正向工程的反转过程,是一个设计恢复的过程。目的是通过分析目标软件或者特定系统,从而认定其主要的架构以及各类构件的属性和构件之间的交互关系,同时通过抽象高层设计来表现构件之间的相互联系。其基本原理是抽取软件系统的核心要素而隐藏技术实现的细节,然后使用抽象的结构在高层上描述软件系统。逆向工程主要遵从数据集采集、知识组织、信息浏览的执行顺序。主要的数据采集很大程度上依赖于知识组织的完成性。同时,信息浏览是整个过程的关键行为,对于原始程序的逻辑设计理解都是在信息浏览中进行的。信息浏览通过遍历目标软件中的多维结构,按计算机领域的划分标准分析以及过滤信息。逆向工程获取的系统结构相比直接的高级语言编写的源代码更符合设计者的实际逻辑和接近实际应用,同时在抽象层上对软件系统的提取表示要更加便于理解。

逆向工程在没有源代码的情况下,通过二进制文件恢复系统的核心设计,是一种高可用的分析恶意软件技术,但是在另一方面,也给正常软件的知识产权保护带来了难题。不法者通过逆向工程技术能够获取到正常软件的各类核心信息,以还原正常的软件,从而破坏了软件的知识产权。逆向工程技术仅仅是软件恢复的一种技术,计算机安全领域还涉及有其他的技术用于软件的抽象,所以为了保护软件的安全性,本发明提出了一种软件核心功能与辅助功能分开加载以及编译的代码编写技术,能够有效地保护软件系统的安全性。

本发明基于高级语言的虚函数机制。某些高级语言为了实现多态的机制,构建了虚函数。虚函数的实现通过一张虚函数表,在虚函数表中,保存着当前类中所有虚函数的地址,当前类实例化后,此表便被分配到实例的内存中。无论对象实例被分配到内存中的何处,虚函数表都会被分配到实例的最前面的四个字节处,所以能够通过获取实例对象的地址间接获取到虚函数表的地址,以此来获取实例对象中所有虚函数的内存地址。

本发明还涉及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)重新加载二进制代码入内存;

运行程序,等待输出。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何属于本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1