Windows平台可执行文件API延迟导入保护方法

文档序号:6399903阅读:214来源:国知局
专利名称:Windows平台可执行文件API延迟导入保护方法
技术领域
本发明涉及一种软件防破解领域,尤其涉及一种Windows平台可执行文件API延迟导入保护方法。
背景技术
软件的盗版问题已经引起了各国政府的高度关注。盗版软件最基本的技术手段是通过逆向工程来理解程序,进而对软件进行非法的篡改,以达到去除软件保护的目的。软件盗版的日益猖獗已经严重扰乱了软件市场的秩序,严重损害了软件厂商的利益。比软件盗版更可怕的是逆向分析。根据经验,一个熟练的逆向分析者一天可以逆向1000行C++代码。也就是说,辛辛苦苦几年时间开发出来的软件,如果不加保护,就会被人以每天1000行的速度逆向全部代码。这个问题在驱动程序方面体现的尤为突出。驱动程序各个短小精悍,汇集着众多的核心技术,但他往往只有几十KB,可能在几天的时间内就被人逆向出全部源码。所以往往在你的软件发布后很短的一段时间内,就会涌现出无数个与你的软件功能相同的软件,你的竞争力也就不复存在了。由此可见软件保护的重要性。不过由于软件加密是一种对抗性技术,所以需要开发者对解密技术有一定的了解。但是软件加密技术的资料相对来讲比较匮乏,这也就使得大多数软件保护程序的开发者不熟悉软件加密与解密,进而导致花费了大量人力物力设计出的加密方案不堪一击。为了让软件开发者从软件保护的措施中脱离出来,专心致力于自己的软件开发,专用加密软件这个事物就应运而生了。本专利申请提出的方案就属于一种用于专用加密软件的软件加密方案。壳技术是最早出现的一种专用的加密技术。现在大家能够接触到的绝大多数软件都经过了加壳的保护,而壳技术也成为了现阶段最流行的软件加密技术。世界知名的加壳加密软件有 ASProtect、Armadillo、EXECryptor 等等。例如,ASProtect是一款非常强大的Win32程序保护工具,具有压缩、加密、反跟踪代码、CRC校检和花指令等众多保护措施。它使用Blowfish、Twofish、TEA等强劲的加密算法,用RSA1024作为注册密钥生成器。他还通过API钩子与加壳的程序进行通信,并且ASProtect提供SDK,支持VC、VB等,实现加密程序内外结合。Armadillo是一款应用面较为广泛的商业保护软件,可以在提供保护的同时为你的软件加上各种限制,包括时间、次数、启动画面等等。他的特点是双进程保护。他在加壳时会扫描程序,将标记过的跳转指令替换成int3指令。程序在运行时,保护进程截获int3指令,将其替换成目标地址返回被保护进程,然后被保护进程继续运行。EXECryptor是一款商业保护软件,可以为目标软件加上注册机制、时间限制、使用次数等功能。他的特点是Ant1-Debug功能很强大。通过加壳保护的软件,在壳与解密后的原始程序之间有一条明显的分界线,破解者可以在这个分割线下断点,等待壳自己解密完成后进行内存倒出,并利用倒出的内存重构exe文件,达到解密的目的。
其他已有的双进程保护软件仅仅针对软件解密过程进行保护,并没有针对软件运行全过程进行保护,也存在解密过程与程序运行的明显分界线,与传统加壳保护存在相同的问题。还存储一种虚拟机保护技术。虚拟机保护与虚拟机这种概念不同,他比较类似于P-C0DE,将一系列的指令解释成字节码,放在一个解释引擎中执行,以对软件进行保护。调试者跟踪进入到虚拟机,是非常难于理解原指令的。想要理解程序流程,就必须深入分析虚拟机引擎,完整地得到P-CODE与原始代码的对应关系,其复杂度可想而知。VMProtect是一款著名的虚拟机保护软件,它以向开发者提供SDK的方式提供保护。以VMPiOtect为代表的而虚拟机保护也就成为了当今最安全的保护方式。随着虚拟机保护技术的日益成熟,许多基于壳技术的加密软件也转向虚拟机加密方式,现在,上述的几种加壳保护软件也都或多或少的包含了虚拟机加密功能。可见,虚拟机加密保护在安全方面做得较好,但是存在过大的性能损耗,影响了这种加密机制的广泛使用。虚拟机保护是以效率换取安全的,一条原始的汇编指令经过VM处理后会膨胀几十倍甚至几百倍,执行效率会大大下降。正因如此,VM保护一般采取提供SDK的方式。不过对于一些对执行效率要求较高的程序,虚拟机保护就不适合了。

发明内容
本发明所要解决的技术问题之一是需要提供一种能够较好地防破解的Windows平台可执行文件API (Application Programming Interface,应用程序编程接口)延迟导入保护方法。为了解决上述技术问题,本发明提供了一种Windows平台可执行文件API延迟导入保护方法。该方法包括:启动调试器;由所述调试器以调试方式启动用户目标程序,以生成目标进程;所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP。其中,所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP的步骤,包括:所述调试器利用WaitForDebugEvent函数等待所述目标进程产生的调试事件;所述调试器在检测到所述目标进程触发的调试事件时,判断该调试事件是否为断点异常事件;在判断为是断点异常事件时,所述调试器进行API导入及修改所述目标进程的EIP。其中,在所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改所述目标进程的EIP之前,所述目标进程注册筛选器异常处理函数,所注册的筛选器异常处理函数用于:若检测到所述目标进程所触发的断点异常被丢弃且所述目标进程被恢复运行,则所述目标进程进入死循环或退出。进一步,该方法还包括:所述目标进程注册筛选器异常处理函数之后,产生第一指定异常事件;所述调试器在检测到所述目标进程触发的所述第一指定异常事件时,对所述用户目标程序进行解密操作。
其中,所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP的步骤,包括:所述目标进程在要调用API时产生第二指定异常事件;所述调试器在检测到所述目标进程触发的所述第二指定异常事件时,加载相应的DLL,计算出所述目标进程要调用的函数地址,并将该函数地址返回给所述目标进程。其中,所述目标进程注册在要调用API时产生第二指定异常事件的步骤,包括:在所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改所述目标进程的EIP之前,所述目标进程构造一个采用int3指令的机器码cc填充的int3表,然后修改其导入地址表(IAT),将其导入地址表中每一项按顺序指向该int3表。其中,所述调试器在检测到所述目标进程触发的所述第二指定异常事件时、加载相应的DLL、计算出所述目标进程要调用的函数地址并将该函数地址返回给所述目标进程的步骤,包括:计算发生异常的虚拟地址与int3表表头的偏移地址,得出调用API函数的序号;若在所述导入地址表中查找到该序号对应的导入地址,则利用所述导入地址修正目标线程的上下文以使得所述目标线程调用该API函数。其中,所述调试器在检测到所述目标进程触发的所述第二指定异常事件时、加载相应的DLL、计算出所述目标进程要调用的函数地址并将该函数地址返回给所述目标进程的步骤,包括:计算发生异常的虚拟地址与int3表表头的偏移地址,得出调用API函数的序号;若在所述导入地址表中未查找到该序号对应的导入地址,依据该序号确定相应的DLL名和API函数名,将确定的DLL名和API函数名写入到目标进程中预留的地址并修改目标线程上下文,以使得所述目标进程进行DLL装载并向所述调试器返回API入口地址;所述调试器将从所述目标进程返回API入口地址保存到导入地址表中,修改所述目标线程上下文以使得所述目标线程调用该API函数。其中,所述启动调试器的步骤包括:用户运行用户目标程序;目标程序的进程判断其是否正被调试,若判断为否,则目标程序触发调试器后退出,反之则进入目标程序执行后续的程序代码以完成用户所要实现的各种功能。此外,所述调试器的进程以远程注入的方式注入到操作系统的进程中。与现有技术相比,本发明的一个或多个实施例可以具有如下优点:本发明通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP,可以较好地防止第三方通过调试器来跟踪破解。本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。


附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例共同用于解释本发明,并不构成对本发明的限制。在附图中:图1示出了根据本发明实施例一的Windows平台可执行文件API延迟导入保护方法的流程示意图;图2示出根据本发明实施例用户通过运行用户目标程序来触发启动调试器的流程不意图。
具体实施例方式以下将结合附图及实施例来详细说明本发明的实施方式,借此对本发明如何应用技术手段来解决技术问题,并达成技术效果的实现过程能充分理解并据以实施。需要说明的是,只要不构成冲突,本发明中的各个实施例以及各实施例中的各个特征可以相互结合,所形成的技术方案均在本发明的保护范围之内。另外,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。传统的思路是通过加壳或加密代码来使得调试器无法解读正确的代码。然而,如前面所述加壳和加密均都有其局限性。windows 分 4 层保护结构 ringO、ringl、ring2 和 ring3,最核心的 ringO,最外面的是ring3。调试器可以是一个运行在Ring3的简化版调试器,可以以调试状态启动一个目标程序,接收该程序产生的调试事件,并做出相应的处理。本发明的发明人注意到,Windows环境中的Ring3调试器与被调试程序之间的关系是一一对应的,也就是说一个程序只能有一个调试器,而要破解一个程序的基本手段就是动态分析,也就是调试,因而创造性地提出了这样一种技术路线:如果预先主动附加一个调试器在用户目标进程上,也就阻止了其他调试器的附加,这也就起到反调试的作用。调试器还可以分担部分或全部的代码解压、变换等功能,也可以对目标进程进行实时的监视与控制,这使得根据本发明的可执行文件防破解方法更加灵活,也大大增加了对可执行文件的破解难度。此处所说的破解,主要指对软件(可执行程序)版权的破解和对软件的代码破译。本发明中将安装有Windows操作系统的系统称作Windows平台。本发明主要适应于Windows 平台。实施例一下面参考图1说明本发明的实施例一。图1示出了根据本发明实施例一的Windows平台可执行文件API延迟导入保护方法的流程示意图。步骤S110,启动调试器。步骤S120,由调试器以调试方式启动用户目标程序,以生成目标进程。步骤S130,目标进程注册筛选器异常处理函数,所注册的筛选器异常处理函数用于:若检测到所述目标进程所触发的断点异常被丢弃且所述目标进程被恢复运行,则所述目标进程进入死循环或退出。筛选器异常处理是全局的,可以使用SetUnhandledExceptionFilter函数设置自己的异常处理回调函数,这个回调函数相当于在Windows默认的异常处理函数之前进行一些预处理,与一个过滤器的作用类似,且每一个进程只能设置一个筛选器异常处理回调函数。当异常发生时,Windows会调用我们设置的异常处理函数,并传入如下参数:_Handler proc _lpExceptionInfo_lpExceptionInfo 是一个指针,指向一个 EXCEPT 10Ν_Ρ01NTERS 结构,EXCEPT10N_POINTERS结构定义如下:
权利要求
1.一种Windows平台可执行文件API延迟导入保护方法,其特征在于,包括: 启动调试器; 由所述调试器以调试方式启动用户目标程序,以生成目标进程; 所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP。
2.根据权利要求1所述的方法,其特征在于,所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP的步骤,包括: 所述调试器利用WaitForDebugEvent函数等待所述目标进程产生的调试事件; 所述调试器在检测到所述目标进程触发的调试事件时,判断该调试事件是否为断点异常事件; 在判断为是断点异常事件时,所述调试器进行API导入及修改所述目标进程的EIP。
3.根据权利要求1所述的方法,其特征在于,在所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改所述目标进程的EIP之前,所述目标进程注册筛选器异常处理函数,所注册的筛选器异常处理函数用于:若检测到所述目标进程所触发的断点异常被丢弃且所述目标进程被恢复运行,则所述目标进程进入死循环或退出。
4.根据权利要求3所述的方法,其特征在于,还包括: 所述目标进程注册筛选器异常处理函数之后,产生第一指定异常事件; 所述调试器在检测到所述目标进程触发的所述第一指定异常事件时,对所述用户目标程序进行解密操作。
5.根据权利要求1所述的方法,其特征在于,所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP的步骤,包括: 所述目标进程在要调用API时产生第二指定异常事件; 所述调试器在检测到所述目标进程触发的所述第二指定异常事件时,加载相应的DLL,计算出所述目标进程要调用的函数地址,并将该函数地址返回给所述目标进程。
6.根据权利要求5所述的方法,其特征在于,所述目标进程注册在要调用API时产生第二指定异常事件的步骤,包括: 在所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改所述目标进程的EIP之前,所述目标进程构造一个采用int3指令的机器码cc填充的int3表,然后修改其导入地址表(IAT),将其导入地址表中每一项按顺序指向该int3表。
7.根据权利要求6所述的方法,其特征在于,所述调试器在检测到所述目标进程触发的所述第二指定异常事件时、加载相应的DLL、计算出所述目标进程要调用的函数地址并将该函数地址返回给所述目标进程的步骤,包括: 计算发生异常的虚拟地址与int3表表头的偏移地址,得出调用API函数的序号; 若在所述导入地址表中查找到该序号对应的导入地址,则利用所述导入地址修正目标线程的上下文以使得所述目标线程调用该API函数。
8.根据权利要求6或7所述的方法,其特征在于,所述调试器在检测到所述目标进程触发的所述第二指定异常事件时、加载相应的DLL、计算出所述目标进程要调用的函数地址并将该函数地址返回给所述目标进程的步骤,包括: 计算发生异常的虚拟地址与int3表表头的偏移地址, 得出调用API函数的序号;若在所述导入地址表中未查找到该序号对应的导入地址,依据该序号确定相应的DLL名和API函数名,将确定的DLL名和API函数名写入到目标进程中预留的地址并修改目标线程上下文,以使得所述目标进程进行DLL装载并向所述调试器返回API入口地址; 所述调试器将从所述目标进程返回API入口地址保存到导入地址表中,修改所述目标线程上下文以使得所述目标线程调用该API函数。
9.根据权利要求1至7所述的方法,其特征在于,所述启动调试器的步骤包括: 用户运行用户目标程序; 目标程序的进程判断其是否正被调试,若判断为否,则目标程序触发调试器后退出,反之则进入目标程序执行后续的程序代码以完成用户所要实现的各种功能。
10.根据权利要求1至7所述的方法,其特征在于,所述调试器的进程以远程注入的方式注入到操作系统的进程中。
全文摘要
本发明公开了一种Windows平台可执行文件API延迟导入保护方法。该方法包括启动调试器;由所述调试器以调试方式启动用户目标程序,以生成目标进程;所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP。本发明通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP,可以较好地防止第三方通过调试器来跟踪破解。
文档编号G06F21/12GK103116715SQ201310066958
公开日2013年5月22日 申请日期2013年3月1日 优先权日2013年3月1日
发明者郑子琛 申请人:中标软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1