CN103116715B - Windows平台可执行文件API延迟导入保护方法 - Google Patents
Windows平台可执行文件API延迟导入保护方法 Download PDFInfo
- Publication number
- CN103116715B CN103116715B CN201310066958.6A CN201310066958A CN103116715B CN 103116715 B CN103116715 B CN 103116715B CN 201310066958 A CN201310066958 A CN 201310066958A CN 103116715 B CN103116715 B CN 103116715B
- Authority
- CN
- China
- Prior art keywords
- target process
- described target
- address
- api
- debugger
- 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.)
- Active
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种Windows平台可执行文件API延迟导入保护方法。该方法包括:启动调试器;由所述调试器以调试方式启动用户目标程序,以生成目标进程;所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP。本发明通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP,可以较好地防止第三方通过调试器来跟踪破解。
Description
技术领域
本发明涉及一种软件防破解领域,尤其涉及一种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是一款商业保护软件,可以为目标软件加上注册机制、时间限制、使用次数等功能。他的特点是Anti-Debug功能很强大。
通过加壳保护的软件,在壳与解密后的原始程序之间有一条明显的分界线,破解者可以在这个分割线下断点,等待壳自己解密完成后进行内存倒出,并利用倒出的内存重构exe文件,达到解密的目的。
其他已有的双进程保护软件仅仅针对软件解密过程进行保护,并没有针对软件运行全过程进行保护,也存在解密过程与程序运行的明显分界线,与传统加壳保护存在相同的问题。
还存储一种虚拟机保护技术。虚拟机保护与虚拟机这种概念不同,他比较类似于P-CODE,将一系列的指令解释成字节码,放在一个解释引擎中执行,以对软件进行保护。调试者跟踪进入到虚拟机,是非常难于理解原指令的。想要理解程序流程,就必须深入分析虚拟机引擎,完整地得到P-CODE与原始代码的对应关系,其复杂度可想而知。VMProtect是一款著名的虚拟机保护软件,它以向开发者提供SDK的方式提供保护。以VMProtect为代表的而虚拟机保护也就成为了当今最安全的保护方式。随着虚拟机保护技术的日益成熟,许多基于壳技术的加密软件也转向虚拟机加密方式,现在,上述的几种加壳保护软件也都或多或少的包含了虚拟机加密功能。
可见,虚拟机加密保护在安全方面做得较好,但是存在过大的性能损耗,影响了这种加密机制的广泛使用。虚拟机保护是以效率换取安全的,一条原始的汇编指令经过VM处理后会膨胀几十倍甚至几百倍,执行效率会大大下降。正因如此,VM保护一般采取提供SDK的方式。不过对于一些对执行效率要求较高的程序,虚拟机保护就不适合了。
发明内容
本发明所要解决的技术问题之一是需要提供一种能够较好地防破解的Windows平台可执行文件API(ApplicationProgrammingInterface,应用程序编程接口)延迟导入保护方法。
为了解决上述技术问题,本发明提供了一种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层保护结构ring0、ring1、ring2和ring3,最核心的ring0,最外面的是ring3。调试器可以是一个运行在Ring3的简化版调试器,可以以调试状态启动一个目标程序,接收该程序产生的调试事件,并做出相应的处理。
本发明的发明人注意到,Windows环境中的Ring3调试器与被调试程序之间的关系是一一对应的,也就是说一个程序只能有一个调试器,而要破解一个程序的基本手段就是动态分析,也就是调试,因而创造性地提出了这样一种技术路线:如果预先主动附加一个调试器在用户目标进程上,也就阻止了其他调试器的附加,这也就起到反调试的作用。调试器还可以分担部分或全部的代码解压、变换等功能,也可以对目标进程进行实时的监视与控制,这使得根据本发明的可执行文件防破解方法更加灵活,也大大增加了对可执行文件的破解难度。此处所说的破解,主要指对软件(可执行程序)版权的破解和对软件的代码破译。本发明中将安装有Windows操作系统的系统称作Windows平台。本发明主要适应于Windows平台。
实施例一
下面参考图1说明本发明的实施例一。图1示出了根据本发明实施例一的Windows平台可执行文件API延迟导入保护方法的流程示意图。
步骤S110,启动调试器。
步骤S120,由调试器以调试方式启动用户目标程序,以生成目标进程。
步骤S130,目标进程注册筛选器异常处理函数,所注册的筛选器异常处理函数用于:若检测到所述目标进程所触发的断点异常被丢弃且所述目标进程被恢复运行,则所述目标进程进入死循环或退出。
筛选器异常处理是全局的,可以使用SetUnhandledExceptionFilter函数设置自己的异常处理回调函数,这个回调函数相当于在Windows默认的异常处理函数之前进行一些预处理,与一个过滤器的作用类似,且每一个进程只能设置一个筛选器异常处理回调函数。当异常发生时,Windows会调用我们设置的异常处理函数,并传入如下参数:
_Handlerproc_lpExceptionInfo
_lpExceptionInfo是一个指针,指向一个EXCEPTION_POINTERS结构,EXCEPTION_POINTERS结构定义如下:
其中,pExceptionRecord字段指向一个EXCEPTION_RECORD结构,ContextRecord指向一个CONTEXT结构,异常处理函数只要根据EXCEPTION_RECORD里面的异常信息,修改CONTEXT结构就可以达到控制进程执行的目的。
在处理完异常后,函数可以返回3种值。当返回EXCEPTION_EXECUTE_HANDLER(定义为1)时,进程终止但不会调用Windows默认的异常处理函数;当返回EXCEPTION_CONTINUE_SEARCH(定义为0)时,Windows会调用Windows默认的异常处理函数,显示警告信息并结束进程;当返回EXCEPTION_CONTINUE_EXECUTION(定义为-1)时,系统将CONTEXT设置回相应线程,然后继续执行程序。
步骤S140,所述目标进程注册筛选器异常处理函数之后,产生第一指定异常事件,例如任一设定的int3事件。
步骤S150,所述调试器在检测到所述目标进程触发的所述第一指定异常事件时,对所述用户目标程序进行解密操作。
步骤S160,所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP(IP是指令寄存器,存放当前指令的下一条指令的地址,CPU该执行哪条指令就是通过IP来指示的,这里的EIP是指32位机的指令寄存器)。
目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP,可尽可能少甚至不在主程序中设置期望保密的代码,而将期望保密的代码均放置在异常处理函数中,因此能够较好地避免程序代码被破解。
需要说明的是,步骤S130至S150是可选的,由于筛选器异常处理函数一般情况下仅用于处理一些程序异常,而本发明创造性地将判断其运行参数是否符合设定条件的防破解代码处理放在异常处理函数中,因此通过S130至S150可进一步提高了程序的防破解强度。
步骤S110中,调试器可由用户触发启动,也可由用户通过运行用户目标程序来触发启动。
下面结合图2来详细说明用户通过运行用户目标程序来触发启动调试器的具体流程。
子步骤S111,用户运行用户目标程序;
子步骤S112,目标程序的进程判断其是否正被调试,若判断为否,则进入步骤S113,反之,则进入步骤S114,以执行后续程序代码。
子步骤S113,目标程序触发调试器后退出,由所触发的调试器以调试方式重新启动所述目标进程。
子步骤S114,目标程序执行后续的程序代码,以完成用户所要实现的各种功能。
步骤S120中,调试器可通过CreateProcess函数启动所述目标进程,并指定DEBUG_PROCESS标志。
对于步骤S160,首先详细说明调试器通过修改被调试程序的EIP来控制被调试进程(在本实施例中为目标进程)执行的原理。
由于两个进程在不同的地址空间,不可以直接互访,需要操作系统提供接口支持。Windows提供的用于读取和修改保存线程上下文的接口函数为GetThreadContext和SetThreadContext;用于读取和修改进程的地址空间中信息的接口函数为ReadProcessMemory和WriteProcessMemory。
如果希望被调试程序能从当前运行的地址转到另一个地址继续运行,之需要在进程停止后,修改保存在该线程的CONTEXT结构中的EIP字段,然后恢复被调试进程的执行即可。如果希望被调试程序能执行一段我们希望他执行的代码,只需要调用WriteProcessMemory函数将该段代码写入目标进程的目标地址,然后将目标进程CONTEXT中的EIP修改为该目标地址,然后恢复目标进程执行即可。
可按照如下的步骤查找并调用回调函数:
(1)如果目标进程正在被调试,则系统向调试器发送EXCEPTION_DEBUG_EVENT调试事件。
(2)如果目标进程未被调试或调试器没有处理这个异常,则检查产生该异常的线程有没有安装SEH异常处理函数,如果有则调用SEH异常处理函数。
(3)如果在一个线程中安装了多个SEH函数,如果排在前面的回调函数返回了ExceptionContinueSearch,则按顺序调用下一个SEH回调函数,直到有一个函数处理了该异常且返回ExceptionContinueExecution为止。
(4)如果查找到了SEH链尾部却没有一个异常处理回调函数处理该异常,则判断目标进程是否正在被调试,如果正在被调试,则再次通知调试器。
(5)如果目标进程未正被调试或者调试器未处理这个异常,则判断其是否安装了筛选器异常处理函数,如果安装了,则调用这个异常处理函数,默认的异常处理函数根据这个筛选器回调函数的返回值做相应的处理。
(6)如果没有安装筛选器回调函数,则调用默认的系统异常处理函数终止进程。
除了这些调用之外,当某个异常处理函数处理完异常之后,为了不产生错误,往往会进行展开操作,就是用EXCEPTION_UNWIND异常代码和EXCEPTION_UNWINDING异常标志,从SEH链上第一个函数开始,把所有异常处理函数全部调用一遍,一直调用到自身为止,然后卸载自身之前的所有异常处理回调函数。这也就给了我们一次隐式调用我们的SEH异常处理函数的机会。
理解了上述内容后,再详细说明步骤S160的处理。
步骤S160中,目标进程通过触发断点异常的方式来通知调试器进行API导入及修改被调试程序的EIP的处理进一步包括:调试器利用WaitForDebugEvent函数等待目标进程产生的调试事件;调试器在检测到目标进程触发的调试事件时,判断该调试事件是否为断点异常事件;在判断为是断点异常事件时,调试器进行API导入及修改目标进程的EIP。
步骤S160中,目标进程通过触发断点异常的方式来通知调试器进行API导入及修改被调试程序的EIP的处理还可进一步包括:所述目标进程在要调用API时产生第二指定异常事件(例如任一设定的区别于前述第一指定异常事件的int3事件);所述调试器在检测到所述目标进程触发的所述第二指定异常事件时,加载相应的DLL(DynamicLinkLibrary,动态链接库),计算出所述目标进程要调用的函数地址,并将该函数地址返回给所述目标进程。
其中,目标进程注册在要调用API时产生第二指定异常事件的处理进一步包括:在目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改所述目标进程的EIP之前,目标进程构造一个采用int3指令的机器码cc填充的int3表,然后修改其导入地址表(IAT),将其导入地址表中每一项按顺序指向该int3表。该int3表中内容的每一个字节都是十六进制数cc,代表指令int3的机器语言。当int3被触发时,系统会得知该int3发生的地址,根据其地址即可判断是哪一个int3被触发,从而可以推断出程序试图调用的是哪一个API。
计算出所述目标进程要调用的函数地址并将该函数地址返回给所述目标进程的处理包括:计算发生异常的虚拟地址与int3表表头的偏移地址,得出调用API函数的序号。若在导入地址表中查找到该序号对应的导入地址,则利用导入地址修正目标线程的上下文以使得目标线程调用该API函数。若在导入地址表中未查找到该序号对应的导入地址,依据该序号确定相应的DLL名和API函数名,将确定的DLL名和API函数名写入到目标进程中预留的地址并修改目标线程上下文,以使得目标进程进行DLL装载并向调试器返回API入口地址。调试器将从目标进程返回API入口地址保存到导入地址表中,修改目标线程上下文以使得目标线程调用该API函数
由于在被保护线程(目标进程)中将IAT设置成顺序指向一个int3表,而我们由知道这个int3表的起始地址,所以通过发生int3的地址,我们可以计算出调用的API在我们调用表中的序号,根据这个序号,我们可以还原相应的DLL名和函数名,然后写入目标进程预留的用于加载DLL和获取API地址的代码区域,运行这段代码,完成DLL装载和函数地址获取工作。为了避免重复工作降低效率,我们要将我们已经加载的DLL和已经获取的API地址保存在保护进程的一个表中,当再次发生相同的API调用时只需取出该值即可。当然,为了隐藏API的调用,优选为不在目标线程中使用call指令,我们只是将返回地址写入栈中,然后根据我们获取的API地址,修改目标线程的上下文,在恢复线程的运行,就达到了隐式API调用的目的。
更具体地,由于我们编写Windows应用程序免不了使用WindowsAPI,而被远程注入到其他进程的代码在使用API的时候显然不能保证目标进程装入了相应的DLL,而且就算确定目标进程装入了该DLL,也还要想办法获取API函数的入口地址,才可以保证可以正确使用API。在要调用API时,可在目标的进程中获取我们用到的API的入口地址。在这里,借助了一种常见的API动态获取方法。当一个线程被建立并开始运行的一刻,栈中有一个返回地址,如果这个时候程序用ret指令直接返回,程序就会返回到kernel32.dll中,运行相应代码结束这个线程。由于这个返回地址位于kernel32.dll中,而我们远程线程中用到的API函数都位于kernel32.dll中,所以我们把这个返回地址取出,并按照64k的边界对齐向上搜索“MZ”标志,就可以找到kernel32.dll的加载基地址。有了这个基地址,我们就可以通过读取这个DLL可选头中的数据目录表,找到它的导出表,在通过导出表找到函数GetProcAddress的地址,然后使用这个函数获取我们需要用到的其他API的地址。
此外,优选地,调试器的进程以远程注入的方式注入到Windows操作系统的explore等进程中。
在一个API没有真正被调用之前,相应的DLL可能根本没有被加载,在保护进程和被保护进程中也没有和这个函数相关的任何信息,所以,除非分析者将用户目标程序完整地遍历一遍之外,没办法得知这个程序中到底调用了哪些API函数,因此能够较好地防止程序被破解。
本发明的上述策略可使得所有的有意义或有具体功能的操作全部均是在异常处理函数中进行,程序主体并不进行任何实际工作,这独特地设计打乱了程序的正常执行顺序,也增加了一定的调试难度,而且于此同时,我们还对这些异常处理函数进行了SMC(self-modifyingcode,自修改代码,意思是自我修改的代码,使程序在运行时自我修改),使得他们在注册之初与被调用之时或是在两次被调用之间存在较大差异,妨碍分析者理解这些函数的真正功能。
虽然本发明所揭露的实施方式如上,但所述的内容只是为了便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所属技术领域内的技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式上及细节上作任何的修改与变化,但本发明的专利保护范围,仍须以所附的权利要求书所界定的范围为准。
Claims (9)
1.一种Windows平台可执行文件API延迟导入保护方法,其特征在于,包括:
启动调试器;
由所述调试器以调试方式启动用户目标程序,以生成目标进程;
所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP;
其中,所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP的步骤,包括:
所述调试器利用WaitForDebugEvent函数等待所述目标进程产生的调试事件;
所述调试器在检测到所述目标进程触发的调试事件时,判断该调试事件是否为断点异常事件;
在判断为是断点异常事件时,所述调试器进行API导入及修改所述目标进程的EIP。
2.根据权利要求1所述的方法,其特征在于,在所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改所述目标进程的EIP之前,所述目标进程注册筛选器异常处理函数,所注册的筛选器异常处理函数用于:若检测到所述目标进程所触发的断点异常被丢弃且所述目标进程被恢复运行,则所述目标进程进入死循环或退出。
3.根据权利要求2所述的方法,其特征在于,还包括:
所述目标进程注册筛选器异常处理函数之后,产生第一指定异常事件;
所述调试器在检测到所述目标进程触发的所述第一指定异常事件时,对所述用户目标程序进行解密操作。
4.根据权利要求1所述的方法,其特征在于,所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改被调试程序的EIP的步骤,包括:
所述目标进程在要调用API时产生第二指定异常事件;
所述调试器在检测到所述目标进程触发的所述第二指定异常事件时,加载相应的DLL,计算出所述目标进程要调用的函数地址,并将该函数地址返回给所述目标进程。
5.根据权利要求4所述的方法,其特征在于,所述目标进程在要调用API时产生第二指定异常事件的步骤,包括:
在所述目标进程通过触发断点异常的方式来通知所述调试器进行API导入及修改所述目标进程的EIP之前,所述目标进程构造一个采用int3指令的机器码cc填充的int3表,然后修改其导入地址表(IAT),将其导入地址表中每一项按顺序指向该int3表。
6.根据权利要求5所述的方法,其特征在于,所述调试器在检测到所述目标进程触发的所述第二指定异常事件时、加载相应的DLL、计算出所述目标进程要调用的函数地址并将该函数地址返回给所述目标进程的步骤,包括:
计算发生异常的虚拟地址与int3表表头的偏移地址,得出调用API函数的序号;
若在所述导入地址表中查找到该序号对应的导入地址,则利用所述导入地址修正目标线程的上下文以使得所述目标线程调用该API函数。
7.根据权利要求5所述的方法,其特征在于,所述调试器在检测到所述目标进程触发的所述第二指定异常事件时、加载相应的DLL、计算出所述目标进程要调用的函数地址并将该函数地址返回给所述目标进程的步骤,包括:
计算发生异常的虚拟地址与int3表表头的偏移地址,得出调用API函数的序号;
若在所述导入地址表中未查找到该序号对应的导入地址,依据该序号确定相应的DLL名和API函数名,将确定的DLL名和API函数名写入到目标进程中预留的地址并修改目标线程上下文,以使得所述目标进程进行DLL装载并向所述调试器返回API入口地址;
所述调试器将从所述目标进程返回API入口地址保存到导入地址表中,修改所述目标线程上下文以使得所述目标线程调用该API函数。
8.根据权利要求1至6中任一项所述的方法,其特征在于,所述启动调试器的步骤包括:
用户运行用户目标程序;
目标程序的进程判断其是否正被调试,若判断为否,则目标程序触发调试器后退出,反之则进入目标程序执行后续的程序代码以完成用户所要实现的各种功能。
9.根据权利要求1至6中任一项所述的方法,其特征在于,所述调试器的进程以远程注入的方式注入到操作系统的进程中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310066958.6A CN103116715B (zh) | 2013-03-01 | 2013-03-01 | Windows平台可执行文件API延迟导入保护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310066958.6A CN103116715B (zh) | 2013-03-01 | 2013-03-01 | Windows平台可执行文件API延迟导入保护方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103116715A CN103116715A (zh) | 2013-05-22 |
CN103116715B true CN103116715B (zh) | 2016-08-03 |
Family
ID=48415088
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310066958.6A Active CN103116715B (zh) | 2013-03-01 | 2013-03-01 | Windows平台可执行文件API延迟导入保护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103116715B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105740028B (zh) * | 2016-03-03 | 2019-07-12 | 珠海豹趣科技有限公司 | 一种访问控制方法及装置 |
CN106021106B (zh) * | 2016-05-19 | 2019-05-28 | 珠海豹趣科技有限公司 | 一种进程控制方法及用户终端 |
CN106055935A (zh) * | 2016-05-19 | 2016-10-26 | 北京金山安全软件有限公司 | 一种进程控制方法、装置及电子设备 |
CN106295342B (zh) * | 2016-08-19 | 2019-02-01 | 北京金山安全管理系统技术有限公司 | 检测和清除可移植可执行文件中感染型病毒的方法及装置 |
CN108021791B (zh) * | 2016-10-31 | 2021-08-10 | 腾讯科技(深圳)有限公司 | 数据保护方法及装置 |
CN110032502B (zh) * | 2018-01-11 | 2023-05-26 | 广州市康锦信息技术有限公司 | 一种异常处理的方法、装置及电子设备 |
CN111475229B (zh) * | 2020-04-09 | 2021-01-15 | 广州锦行网络科技有限公司 | 一种Windows平台下的dll注入方法及系统 |
CN111814119B (zh) * | 2020-05-27 | 2021-03-19 | 广州锦行网络科技有限公司 | 一种反调试的方法 |
CN112733093B (zh) * | 2021-01-04 | 2024-03-12 | 中国电力科学研究院有限公司 | 基于ring3环对抗的程序行为保护方法、系统及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102694794A (zh) * | 2012-05-06 | 2012-09-26 | 北京深思洛克软件技术股份有限公司 | 一种用于安卓应用程序的场景信息保护方法 |
CN102880817A (zh) * | 2012-08-20 | 2013-01-16 | 福建升腾资讯有限公司 | 计算机软件产品运行保护方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7054901B2 (en) * | 2001-05-31 | 2006-05-30 | Juniper Networks, Inc. | Network management interface with selective rendering of output |
-
2013
- 2013-03-01 CN CN201310066958.6A patent/CN103116715B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102694794A (zh) * | 2012-05-06 | 2012-09-26 | 北京深思洛克软件技术股份有限公司 | 一种用于安卓应用程序的场景信息保护方法 |
CN102880817A (zh) * | 2012-08-20 | 2013-01-16 | 福建升腾资讯有限公司 | 计算机软件产品运行保护方法 |
Non-Patent Citations (1)
Title |
---|
《Windows环境下隐蔽调试器的设计与实现》;吴超;《中国优秀硕士学位论文全文数据库信息科技辑》;20091130(第11期);第2-6章 * |
Also Published As
Publication number | Publication date |
---|---|
CN103116715A (zh) | 2013-05-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103116715B (zh) | Windows平台可执行文件API延迟导入保护方法 | |
US11120130B2 (en) | Method and apparatus for protecting kernel control-flow integrity using static binary instrumentation | |
US11507671B1 (en) | Detection and healing of vulnerabilities in computer code | |
Patrignani et al. | Formal approaches to secure compilation: A survey of fully abstract compilation and related work | |
Sun et al. | OAT: Attesting operation integrity of embedded devices | |
De Clercq et al. | A survey of hardware-based control flow integrity (CFI) | |
Tam et al. | Copperdroid: Automatic reconstruction of android malware behaviors. | |
US7930743B2 (en) | Information processing system, information processing method, information processing program, computer readable medium and computer data signal | |
CA3023939C (en) | Method and apparatus for dynamic executable verification | |
US20110191848A1 (en) | Preventing malicious just-in-time spraying attacks | |
CN103116714A (zh) | 一种Windows平台可执行文件双进程保护方法 | |
CN102576391A (zh) | 嵌入在shell代码中的软件许可 | |
WO2013170724A1 (zh) | 安卓系统中java应用程序的保护方法 | |
TW201227394A (en) | Security through opcode randomization | |
WO2016033966A1 (zh) | 应用数据的保护方法及装置 | |
CN103164643A (zh) | 一种通过硬件进行反调试的方法和装置 | |
US20130042297A1 (en) | Method and apparatus for providing secure software execution environment based on domain separation | |
CN112733093B (zh) | 基于ring3环对抗的程序行为保护方法、系统及存储介质 | |
Ghosh et al. | Software protection for dynamically-generated code | |
CN106127054B (zh) | 一种面向智能设备控制指令的系统级安全防护方法 | |
Feichtner | A comparative study of misapplied crypto in Android and iOS applications | |
CN107205001A (zh) | python脚本的更新方法及装置、客户端、服务器 | |
Pizzolotto et al. | Mitigating Debugger-based Attacks to Java Applications with Self-Debugging | |
Wu et al. | Hack Android application and defence | |
JP2011204105A (ja) | スクリプト起動プログラム、スクリプト起動プログラムの生成プログラム、およびプログラムセット |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |