一种Windows平台可执行文件双进程保护方法

文档序号:6399902阅读:505来源:国知局
专利名称:一种Windows平台可执行文件双进程保护方法
技术领域
本发明涉及一种软件防破解领域,尤其涉及一种Windows平台可执行文件双进程保护方法。
背景技术
软件的盗版问题已经引起了各国政府的高度关注。盗版软件最基本的技术手段是通过逆向工程来理解程序,进而对软件进行非法的篡改,以达到去除软件保护的目的。软件盗版的日益猖獗已经严重扰乱了软件市场的秩序,严重损害了软件厂商的利益。比软件盗版更可怕的是逆向分析。根据经验,一个熟练的逆向分析者一天可以逆向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平台可执行文件双进程保护方法。为了解决上述技术问题,本发明提供了一种Windows平台可执行文件双进程保护方法,包括:根据用户操作启动用户目标程序,生成目标进程;所述目标进程判断其自身是否正被调试;若判断为否,则通过所述目标进程触发调试器,由所述调试器以调试方式重新启动所述目标进程。其中,通过所述目标进程触发调试器进程,所述调试器以调试方式重新启动所述目标进程的步骤,包括:所述目标进程判断其运行参数是否符合设定条件;若判断为不符合,则所述目标进程重新启动用户目标程序以生成新的所述目标进程然后退出,然后目标进程生成所述调试器后退出,所述调试器以调试方式重新启动所述用户目标程序以生成处于调试状态的目标进程。其中,所述目标进程重新启动用户目标程序以生成新的所述目标进程然后退出的步骤,进一步包括:所述目标进程调用SHl异常处理函数,以通过自修改代码技术修改筛选器处理函数代码,使得筛选器处理函数能够修改SHl异常处理函数,再由SHl异常处理函数调用修改后的筛选器处理函数;修改后的筛选器处理函数通过自修改代码技术修改SHl异常处理函数代码,然后由修改后的筛选器处理函数调用修改后的S E: H异常处理函数,修改后的SHl异常处理函数重新启动用户目标程序以生成新的所述目标进程。其中,所述目标进程重新启动用户目标程序以生成新的所述目标进程的处理,包括:所述目标进程通过在WinExec命令行参数末尾加上魔数和当前系统时间来重新启动用户目标程序生成新的所述目标进程。其中,通过所述目标进程触发调试器进程,所述调试器以调试方式重新启动所述目标进程的步骤,包括:所述目标进程判断其运行参数是否符合设定条件;若判断为符合,则所述目标进程生成所述调试器后退出,所述调试器以调试方式重新启动所述用户目标程序以生成处于调试状态的目标进程。其中,所述目标进程判断其运行参数是否符合设定条件的步骤,包括:所述目标进程利用SEH异常处理函数判断其运行参数是否符合设定条件。进一步,所述设定条件为所述目标进程的运行参数包括魔数和所述目标进程的启动时间,且所述启动时间距离上次启动所述目标进程的时间间隔小于预设时长。其中,所述目标进程生成所述调试器后退出的步骤,包括:所述目标进程通过远程线程注入的方式生成所述调试器后退出。其中,所述目标进程通过远程线程注入的方式生成所述调试器后退出的步骤,进一步包括:所述目标进程采用远程注入的代码覆盖筛选器异常处理函数的代码;由SHl异常处理函数将异常向下传递直到调用所述筛选器异常处理函数;由所述筛选器异常处理函数通过远程线程注入的方式生成所述调试器。其中,由所述调试器以调试方式重新启动所述目标进程的步骤,包括:所述调试器通过CreateProcess函数启动所述目标进程,并指定DEBUG_PR0CESS标志。与现有技术相比,本发明的一个或多个实施例可以具有如下优点:通过由用户目标程序的进程所触发的调试器来重新启动用户目标程序的进程,能够较好地防止用户目标程序被破解。本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。


附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例共同用于解释本发明,并不构成对本发明的限制。在附图中:图1示出根据本发明实施例一的Windows平台可执行文件双进程保护方法的流程示意图;图2示出图1中的步骤S130中各子步骤的流程示意图。
具体实施例方式以下将结合附图及实施例来详细说明本发明的实施方式,借此对本发明如何应用技术手段来解决技术问题,并达成技术效果的实现过程能充分理解并据以实施。需要说明的是,只要不构成冲突,本发明中的各个实施例以及各实施例中的各个特征可以相互结合,所形成的技术方案均在本发明的保护范围之内。另外,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
传统的思路是通过加壳或加密代码来使得调试器无法解读正确的代码。然而,如前面所述加壳和加密均都有其局限性。windows 分 4 层保护结构 ringO、ringl、ring2 和 ring3,最核心的 ringO,最外面的是ring3。上述调试器可以是一个运行在Ring3的简化版调试器,可以以调试状态启动一个目标程序,接收该程序产生的调试事件,并做出相应的处理。本发明的发明人注意到,Windows环境中的Ring3调试器与被调试程序之间的关系是一一对应的,也就是说一个程序只能有一个调试器,而要破解一个程序的基本手段就是动态分析,也就是调试,因而创造性地提出了这样一种技术路线:如果预先主动附加一个调试器在用户目标进程上,也就阻止了其他调试器的附加,这也就起到反调试的作用。本发明预先主动附加的Ring3级调试器。加之,调试器还可以分担部分或全部的代码解压、变换等功能,也可以对目标进程进行实时的监视与控制,这使得根据本发明的可执行文件防破解方法更加灵活,也大大增加了对可执行文件的破解难度。此处所说的破解,主要指对软件(可执行程序)版权的破解和对软件的代码破译。实施例一下面参考图1说明本发明的实施例一。图1示出了根据本发明实施例一的Windows平台可执行文件双进程保护方法的流程示意图。步骤S110,根据用户操作启动用户目标程序,生成目标进程;步骤S120,所述目标进程判断其自身是否正被调试;步骤S130,若判断为否,则通过所述目标进程触发调试器,由所述调试器以调试方式重新启动所述目标进程。调试器可通过CreateProcess函数重新启动所述目标进程,并指定DEBUG_PR0CESS标志。若判断为是,则进入步骤S140,以执行后续程序代码。步骤S140,目标程序执行后续的程序代码,以完成用户所要实现的各种功能。这样,可阻止第三方启动调试器来调试目标进程,从而起到防破解的目的。步骤SllO中,用户可双击运行用户目标程序,触发Windows操作系统(本发明中也将安装有Windows操作系统的系统称作Windows平台)启动该用户目标程序的进程,即目标进程。步骤S130中,通过目标进程触发调试器进程,所触发的调试器以调试方式重新启动该目标进程的处理进一步包括(参考图2):步骤S131,该目标进程判断其运行参数是否符合设定条件;若判断为不符合,则进入子步骤S132 ;反之,进入子步骤S133。子步骤S132,该目标进程重新启动用户目标程序以生成新的目标进程然后退出然后进入子步骤S133 ;子步骤S133,目标进程生成该调试器后退出,进入子步骤S134 ;子步骤S134,该调试器以调试方式重新启动该用户目标程序以生成处于调试状态的目标进程。优选地,该设定条件可为:目标进程的运行参数包括魔数和目标进程的启动时间,且该启动时间距离上次启动该目标进程的时间间隔小于预设时长。通过由不符合预设条件的目标进行自身重新启动用户目标程序以生成新的目标进程然后退出,可进一步为破解该用户目标程序设置障碍。相应地,目标进程重新启动用户目标程序以生成新的所述目标进程的处理可包括:目标进程通过在WinExec命令行参数末尾加上魔数和当前系统时间来重新启动用户目标程序生成新的所述目标进程。此外,该设定条件还可以为其它各种各样的条件,例如,还可将设定条件仅设为:包含魔数和目标进程前一次的总运行时长等,只要能够一定程度为破解该用户目标程序设置障碍即可。进一步,目标进程利用SEH异常处理函数判断其运行参数是否符合设定条件。SEH (Structured Exception Handling),是 windows 操作系统的一种异常处理机制。SHl是基于线程的,每一个线程都可以设置多个SHl异常处理例程。SHl因为与硬件平台有关,所以windows并未公开SE:H的技术细节,但SE:H却在各种语言中被广泛使用。
Windows为每一个线程定义了一个线程环境块(TIB----Thread Information Block),在其
中保存了一些线程的属性数据,其结构定义如下:NT_TIB STRUCTExceptionList DWORD StackBase DWORD SubSystemTib DWORD FiberData DWORD ArbitraryUserPointer DWORD Self DWORD `NT_TIB ENDS其中,Exc^ptionList字段指向一个 EXCEPT10N_REGISTERAT10N 结构,定义如下:EXCEPT10N_REGISTRATION STRUCTprev DWORD handler DWORD EXCEPT10N_REGISTRATION ENDS当异常发生时,系统从TIB (线程信息±夹,Thread Info Block)中取出ExceptionList字段,然后取出其指向的handler字段,根据其中的地址去调用异常处理函数。如果用户需要构建一个自己的异常处理函数,只需要构建一个新的EXCEPT10N_REGISTERAT10N结构,修改这个结构的prev字段指向当前的EXCEPT10N_REGISTERAT10N结构,然后修改TIB中的Exc印tionList指针。TIB由fs段寄存器指出,可以通过fs: [O]访问TIB结构。可以通过如下代码设置新的SHl异常处理函数。push offset_ProcCalIbackpush fs:
moV fs:
, esp可以通过如下代码卸载一个SHl异常处理函数:pop fs:[O]pop eax当异常发生时,windows会调用的异常处理函数,并传入如下几个参数:_ProcCallback proc C_lpExceptionRecord, \_lpSEH, \
_lpContext, \_lpDispatcherContext_lpExc印tionRecord 指向一个 EXCEPT10N_REC0RD 结构,_lpSEH 指向注册回调函数时使用的 EXCEPT10N_REGISTRAT10N 结构,_lpContext 指向一个 CONTEXT 结构。在处理完异常后,函数可以返回4种值。返回ExceptionContinueExecution时,系统把CONTEXT结构设置回去,然后继续执行;当回调函数返回ExceptionContinueSearch时,系统会根据EXCEPT10N_REGISTRAT10N结构里的prev字段得到前一个SHl回调函数的地址,然后调用它;当回调函数返回ExceptionNestedException时,表示在异常处理回调函数里有发生了新的异常;ExceptionCollidedUnwind表示发生了展开操作。由于SHl异常处理函数一般情况下仅用于处理一些程序异常,而本发明创造性地将判断其运行参数是否符合设定条件的防破解代码处理放在异常处理函数中,这进一步提高了程序的防破解强度。此外,若存在第三方的调试器在试图破解目标进程,当目标进程发生异常时,第三方调试器无法执行与本实施例中的异常处理函数中的功能,因此无法启动目标进程的后续操作,从而实现了阻碍第三方调试器的破解操作。更进一步,目标进程重新启动用户目标程序以生成新的目标进程然后退出的处理可进一步包括:目标进程调用SHl异常处理函数,以通过自修改代码技术修改筛选器处理函数代码,使得筛选器处理函数能够修改SHl异常处理函数,再由SHl异常处理函数调用修改后的筛选器处理函数;修改后的筛选器处理函数通过自修改代码技术修改SHl异常处理函数代码,然后由修改后的筛选器处理函数调用修改后的SE:H异常处理函数,修改后的SEH异常处理函数重新启动用户目标程序以生成新的目标进程。这样,可更进一步地提高程序的防破解强度。此外,新的目标进程生成该调试器后退出的处理中,目标进程可通过远程线程注入的方式生成所述调试器。换而言之,为了将调试器的进程也保护起来,本发明进一步将作为调试器的进程以远程线程的方式注入到Windows Explorer等系统进程中,以达到隐藏调试器进程与阻碍调试器附加的作用。要实现这个功能需要用到如下几个AP1:VirtualAllocEx、WriteProcessMemory和CreateRemoteThreacL首先,调用VirtualAllocEx在目标进程的地址空间内申请一块内存,内存的大小必须要能容纳线程使用的代码和数据,内存的属性应为PAGE_EXECUTE_READffRITE0然后调用WriteProcessMemory函数将调试器的代码和数据拷贝到刚刚申请的内存块中再调用CreateRemoteThread函数创建远程线程并开始执行。用这种方法注入到另一个进程中的程序是属于目标进程的一个线程,整个过程中不会产生新的进程,这也就达到了隐藏调试器进程的目的。远程线程在具体实现的过程中还有一些技术问题,主要的就是代码重定位问题和API导入问题。代码重定位问题可以由下面的代码片段来说明:dwVar dd ......
mo V eax, dwVar......
本段代码经过编译后在反汇编就会变成如下的样子:......
A100204000mov eax, dword ptr
由于编译成的机器指令中包含绝对地址,所以如果全局变量dwVar在目标进程地址空间中不是位于固定的地址就无法进行正确的存取。而因为用于远程注入的代码是使用VirtualAllocEx动态分配的,所以就不能保证对于任何目标进程的任何一次注入,dwVar的地址都是固定不变的,也就是说无法使用存取全局变量的方式对该变量进行存取。类似地,只要是编译完成的机器指令中涉及到对一个绝对内存地址的操作,那么这一整块程序就无法自由地注入另一个进程。为解决该问题,可把所有的绝对地址变成动态计算出的地址,下面这段代码是解决自定位问题最常用的方法:dwVar dd ......
call labellabel:pop ebxsub ebx, offset label......
moveax, dword ptr[ebx+offset dwVar]只需要保证在程序的运行过程中不将ebx用于其它用途,则程序中所有的绝对地址都可以通过ebx进行 正确的修正,这也就解决了重定位问题。进一步,目标进程通过远程线程注入的方式生成调试器的处理还可进一步包括:目标进程采用远程注入的代码覆盖筛选器异常处理函数的代码;由SHl异常处理函数将异常向下传递直到调用筛选器异常处理函数;由筛选器异常处理函数通过远程线程注入的方式生成调试器。与前面所述原因类似地,由于SHl异常处理函数一般情况下仅用于处理一些程序异常,因此能够进一步提供了程序的防破解强度。虽然本发明所揭露的实施方式如上,但所述的内容只是为了便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所属技术领域内的技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式上及细节上作任何的修改与变化,但本发明的专利保护范围,仍须以所附的权利要求书所界定的范围为准。
权利要求
1.一种Windows平台可执行文件双进程保护方法,其特征在于,包括: 根据用户操作启动用户目标程序,生成目标进程; 所述目标进程判断其自身是否正被调试; 若判断为否,则通过所述目标进程触发调试器,由所述调试器以调试方式重新启动所述目标进程。
2.根据权利要求1所述的方法,其特征在于,通过所述目标进程触发调试器进程,所述调试器以调试方式重新启动所述目标进程的步骤,包括: 所述目标进程判断其运行参数是否符合设定条件; 若判断为不符合,则所述目标进程重新启动用户目标程序以生成新的所述目标进程然后退出,然后目标进程生成所述调试器后退出,所述调试器以调试方式重新启动所述用户目标程序以生成处于调试状态的目标进程。
3.根据权利要求2所述的方法,其特征在于,所述目标进程重新启动用户目标程序以生成新的所述目标进程然后退出的步骤,进一步包括: 所述目标进程调用SHl异常处理函数,以通过自修改代码技术修改筛选器处理函数代码,使得筛选器处理函数能够修改SEH异常处理函数,再由SHl异常处理函数调用修改后的筛选器处理函数; 修改后的筛选器处理函数通过自修改代码技术修改SHl异常处理函数代码,然后由修改后的筛选器处理函数调用 修改后的SE:H异常处理函数,修改后的SE:H异常处理函数重新启动用户目标程序以生成新的所述目标进程。
4.根据权利要求2所述的方法,其特征在于,所述目标进程重新启动用户目标程序以生成新的所述目标进程的处理,包括: 所述目标进程通过在WinExec命令行参数末尾加上魔数和当前系统时间来重新启动用户目标程序生成新的所述目标进程。
5.根据权利要求4所述的方法,其特征在于,通过所述目标进程触发调试器进程,所述调试器以调试方式重新启动所述目标进程的步骤,包括: 所述目标进程判断其运行参数是否符合设定条件; 若判断为符合,则所述目标进程生成所述调试器后退出,所述调试器以调试方式重新启动所述用户目标程序以生成处于调试状态的目标进程。
6.根据权利要求2至5中任一项所述的方法,其特征在于,所述目标进程判断其运行参数是否符合设定条件的步骤,包括:所述目标进程利用SHl异常处理函数判断其运行参数是否符合设定条件。
7.根据权利要求2至5中任一项所述的方法,其特征在于,所述设定条件为所述目标进程的运行参数包括魔数和所述目标进程的启动时间,且所述启动时间距离上次启动所述目标进程的时间间隔小于预设时长。
8.根据权利要求2至5中任一项所述的方法,其特征在于,所述目标进程生成所述调试器后退出的步骤,包括:所述目标进程通过远程线程注入的方式生成所述调试器后退出。
9.根据权利要求8所述的方法,其特征在于,所述目标进程通过远程线程注入的方式生成所述调试器后退出的步骤,进一步包括: 所述目标进程采用远程注入的代码覆盖筛选器异常处理函数的代码;由SHl异常处理函数将异常向下传递直到调用所述筛选器异常处理函数; 由所述筛选器异常处理函数通过远程线程注入的方式生成所述调试器。
10.根据权利要求1所述的方法,其特征在于,由所述调试器以调试方式重新启动所述目标进程的步骤,包括: 所述调试器通过CreateProcess函数启动所述目标进程,并指定DEBUG_PROCESS标志。
全文摘要
本发明公开了一种Windows平台可执行文件双进程保护方法。该方法包括根据用户操作启动用户目标程序,生成目标进程;所述目标进程判断其自身是否正被调试;若判断为否,则通过所述目标进程触发调试器,由所述调试器以调试方式重新启动所述目标进程。通过由用户目标程序的进程所触发的调试器来重新启动用户目标程序的进程,能够较好地防止用户目标程序被破解。
文档编号G06F21/12GK103116714SQ20131006694
公开日2013年5月22日 申请日期2013年3月1日 优先权日2013年3月1日
发明者郑子琛 申请人:中标软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1