基于向量化异常处理的软件保护方法技术

技术编号:24353991 阅读:51 留言:0更新日期:2020-06-03 02:10
本发明专利技术提供一种基于向量化异常处理的软件保护方法,包括以下步骤:一、对可执行文件进行加壳;二、装载可执行文件;三、如果出现向量化异常,进行向量化异常处理。本发明专利技术提出一种无需改变原始程序代码和内存位置就能对数据进行分块加解密的方法。通过修改内存保护属性,使得某一页内存不可访问,在程序跳转到该内存页内的地址,或者访问该内存页内的数据时产生异常。该方法使得壳代码既能控制程序执行也能控制数据访问,且不需要改变代码和数据的内存地址。

Software protection method based on Vectorization exception handling

【技术实现步骤摘要】
基于向量化异常处理的软件保护方法
本专利技术涉及一种软件保护方法,具体涉及一种基于向量化异常处理的软件保护方法。
技术介绍
使用一般的加壳方法保护软件时,为了确保原始程序正常运行,总是将所有可执行文件数据作为一个整体处理。要么完全加密,要么完全解密。这是由于程序内部各个功能代码相互调用、访问数据的时机和位置是不确定的。壳代码在把程序控制权交还给原始程序前,必须把原始程序全部解密,这就给脱壳造成一个良好的介入时机。本专利技术通过向量化异常处理机制,控制程序运行的整个过程。异常处理代码在原始程序的每个内存页被执行或者访问数据时得到控制权,适时的加解密相关数据,避免了对原始程序整体解密。这样一来,在任何时刻通过进程内存转储得到的内存数据,绝大部分都是加密的。在各种软件保护方法中有一类保护方法是对可执行文件进行加壳处理。加壳后的可执行文件代码主体被变形、压缩或者加密,并在程序代码的开头增加了一段代码(即壳代码)。当软件运行时首先执行的是壳代码。壳代码经过一段较复杂的解密过程还原代码主体,然后跳转并执行真正的功能代码。这种软件保护方法存在一个缺陷,即对代码的保护只在软件运行的初期。当软件的外壳程序运行完成后,原始代码就完全暴露在内存中。此时通过进程内存转储加上可执行文件映像修复等技术手段即可获得不受保护的软件代码。去除保护的过程即通称的脱壳。绝大多数软件限于编译器和CPU架构的规范约束,程序入口点的代码都具有一定的特征。这种特征可用于判别被加壳的软件是否运行到了原始的代码。一般的加壳方法往往存在对应的脱壳工具,可以自动化的对各种加壳方法保护的软件实现脱壳。这种通用脱壳方法的存在大大降低了加壳对于软件的保护效果。为了防止脱壳工具自动化脱壳,有一种改进的加壳方法是将软件代码的一部分转移到壳代码中。在原有代码的位置插入跳转指令,使得程序执行到此就跳转到壳中运行。当转移的代码执行完毕,再跳转到原始位置的后续代码上继续运行。通过在原程序和壳代码之间反复跳转,使得壳与软件主体结合在一起难以分开,防止了脱壳工具把壳自动去除。代码转移的实现建立在对原始程序代码详细分析的基础上。对软件进行加壳时,首先通过反汇编技术掌握程序中的所有跳转指令和内存访问指令。然后才能做到移动代码的位置但不改变程序的流程和指令的执行结果。即确保移动的那部分代码不会中途跳出自身范围,不会访问外部的内存,其他代码也不会直接跳转到被移动的代码中。如果不可避免存在这样的跳转或者内存访问,则需要修改相关指令,改变跳转的目的地址和内存寻址地址,让最终执行的逻辑保持不变。加壳方法实现代码转移的关键技术点是指令分析。然而很多软件的执行流程是很复杂的,特别是使用寄存器做间接跳转和间接寻址的指令,难以准确预知跳转和寻址的目的地址。即使是知名的反汇编引擎和大型逆向分析工具,在解决这些问题上也不是完全可靠的。因此,代码转移到壳中会产生潜在的兼容性问题。如果转移了不能移动的代码,将导致软件运行出现异常。一般来说只有程序代码能够转移到壳中。软件的数据(资源)要转移到壳中则非常困难。这是因为通过分析指令往往只能得到其访问数据的起始地址,而数据的长度是不确定的和动态变化的。对于数据的保护,通常的做法是在加壳时将所有数据原地加密(不改变内存地址)。在执行程序主体前,壳代码再把数据在内存中完全解密。即数据只能作为一个整体在原地进行保护。这样的保护力度是比较弱的,通过进程内存转储即可获得所有数据。对于那些会在运行过程中修改自身代码的程序,由于无法确定修改后代码的执行逻辑,因此也无法将其转移到壳中。因此,需要对现有技术进行改进。
技术实现思路
本专利技术要解决的技术问题是提供一种高效的基于向量化异常处理的软件保护方法。为解决上述技术问题,本专利技术提供一种基于向量化异常处理的软件保护方法,包括以下步骤:一、对可执行文件进行加壳;二、装载可执行文件;三、如果出现向量化异常,进行向量化异常处理。作为对本专利技术基于向量化异常处理的软件保护方法的改进:步骤一包括以下步骤:1)、分析原始可执行文件,得到需要处理的数据;执行步骤2;2)、根据步骤1得到的需要处理的数据,生成新的可执行文件头部;3)、修改步骤2得到的新的可执行文件头部的第一个节表项,生成用于映射原始可执行文件的节;该节是一个没有内容的空节,加载后它在内存中的映射空间大小等于原始可执行文件所有节的内存映射空间大小的总和;4)、根据原始可执行文件构成加解密函数代码;5)、生成向量化异常处理过程代码;6)、生成可执行文件装载过程代码,7)、生成壳代码节;壳代码节包括三部分代码:可执行文件装载过程代码、向量化异常处理过程代码和加解密函数代码;8)、加密原始可执行文件,得到原始可执行文件加密数据;9)、根据步骤5加密的可执行文件得到密钥表;10)、根据壳代码生成导入函数地址表;11)、根据导入函数地址表、密钥表和原始可执行文件加密数据,生成壳数据节;12)、将步骤2得到的新的可执行文件头部、步骤3得到的用于映射原始可执行文件的节、步骤7得到壳代码节、步骤11得到的壳数据节组合成为新的可执行文件;13)、根据各个节的实际大小和地址修正新的可执行文件头部的内存映像大小值和节表内容。作为对本专利技术基于向量化异常处理的软件保护方法的进一步改进:步骤二包括:2.1)、解密最终的可执行文件中的原始可执行文件加密数据的头部,覆盖当前可执行文件的头部;2.2)、解密最终的可执行文件中的原始可执行文件加密数据的导入函数地址表,保存到映射目标代码节的相应位置;2.3)、遍历导入函数地址表,加载需要的动态链接库,填充函数地址;2.4)、如果原始可执行文件包含异常处理表,则解密该表到相应位置;2.5)、如果原始可执行文件包含线程局部存储(TLS)表,则解密该表到相应位置;2.6)、如果原始可执行文件包含重定位表,则解密该表到相应位置;2.7)、向系统注册向量化异常处理过程;2.8)、将映射原始可执行文件节的内存保护属性设置为不可访问;2.9)、如果步骤2.4解密了异常处理表,则将异常处理表添加到系统的动态函数表中;2.10)、如果步骤2.5步解密了线程局部存储(TLS)表,则调用TLS回调函数;2.11)、程序跳转到原始可执行文件的入口地址。作为对本专利技术基于向量化异常处理的软件保护方法的进一步改进:步骤三包括:3.1)、异常处理过程计算异常地址对应的内存页基地址;3.2)、将该内存基地址加入一个由全局互斥锁保护的地址列表,使得异常处理函数此时独占该页的处理;3.3)、对于多线程程序,此时可能有其他线程在相同的地址触发异常;则由全局互斥锁进行同步,其他线程将等待当前异常处理完成后再处理;3.4)、设置异常内存页保护属性为可读可写,使得异本文档来自技高网
...

【技术保护点】
1.基于向量化异常处理的软件保护方法,其特征在于:包括以下步骤:/n一、对可执行文件进行加壳;/n二、装载可执行文件;/n三、如果出现向量化异常,进行向量化异常处理。/n

【技术特征摘要】
1.基于向量化异常处理的软件保护方法,其特征在于:包括以下步骤:
一、对可执行文件进行加壳;
二、装载可执行文件;
三、如果出现向量化异常,进行向量化异常处理。


2.根据权利要求1所述的基于向量化异常处理的软件保护方法,其特征在于:
步骤一包括以下步骤:
1)、分析原始可执行文件,得到需要处理的数据;执行步骤2;
2)、根据步骤1得到的需要处理的数据,生成新的可执行文件头部;
3)、修改步骤2得到的新的可执行文件头部的第一个节表项,生成用于映射原始可执行文件的节;
4)、根据原始可执行文件构成加解密函数代码;
5)、生成向量化异常处理过程代码;
6)、生成可执行文件装载过程代码,
7)、生成壳代码节;壳代码节包括三部分代码:可执行文件装载过程代码、向量化异常处理过程代码和加解密函数代码;
8)、加密原始可执行文件,得到原始可执行文件加密数据;
9)、根据步骤5加密的可执行文件得到密钥表;
10)、根据壳代码生成导入函数地址表;
11)、根据导入函数地址表、密钥表和原始可执行文件加密数据,生成壳数据节;
12)、将步骤2得到的新的可执行文件头部、步骤3得到的用于映射原始可执行文件的节、步骤7得到壳代码节、步骤11得到的壳数据节组合成为新的可执行文件;
13)、根据各个节的实际大小和地址修正新的可执行文件头部的内存映像大小值和节表内容。


3.根据权利要求2所述的基于向量化异常处理的软件保护方法,其特征在于:
步骤二包括:
2.1)、解密最终的可执行文件中的原始可执行文件加密数据的头部,覆盖当前可执行文件的头部;
2.2)、解密最终的可执行文件中的原始可执行文件加密数据的导入函数地址表,保存到映射目标代码节的相应位置;
2.3)、遍历导入函数地址表,加载需要的动态链接库,填充函数地址;
2.4)、如果原始可执行文件包含异常处理表,则解密该表到相应位置;
2.5)、如果原始可执行文件包含线程局部存储(TLS)表,则解密该表到相应位置;
2.6)、如果原始可执行文件包含重定位表,则解密该表到相应位置;
2.7)、向系统注册向量化异常处理过程;
2.8)、将映射原始可执行文件节的内存保护属性设置为不可访问;
2.9)、如果步骤2.4解密了异常处理表,则将异常处理表添加到系统的动态函数表中;
2.10)、如果步骤2.5步解密了线程局部存储(TLS)表,则调用TLS回调函数;
2.11)、程序跳转到原始可执行文件的入口地址。


4.根据权利要求3所述的基于向量化异常处理的软件保护方法,其特征在于:
步骤三包括:
3.1)、异常处理过程计算异常地址对应的内存页基地址;
3.2)、将该内存基地址加入一个由全局互斥锁保护的地址列表,使得异常处理函数此时独...

【专利技术属性】
技术研发人员:赵康范渊
申请(专利权)人:杭州安恒信息技术股份有限公司
类型:发明
国别省市:浙江;33

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

1