一种反调试的方法技术

技术编号:26031974 阅读:26 留言:0更新日期:2020-10-23 21:09
本发明专利技术提供了一种反调试方法,属于计算机安全领域。本发明专利技术首先对创建线程的函数设置Hook,当被保护程序被附加调试时,因为创建线程的函数被设置Hook而进入检测函数,在检测函数中,先执行被Hook的创建线程的函数来创建线程,线程创建完之后,再通过检测该线程的上下文指针和标志位判断被保护程序是否被附加调试,如果被附加调试,则进行相应处理并结束该线程。本发明专利技术实现了对windows系统中应用程序的反调试,方法简单,易于实现且不易被发现。

【技术实现步骤摘要】
一种反调试的方法
本专利技术涉及计算机安全领域,尤其涉及一种反调试的方法。
技术介绍
计算机已经走入千家万户,也成为现代化生活中必不可少的产品。为满足人们不断提高的生活和工作要求,企业和个人会开发实现不同功能的计算机程序。计算机程序是一组计算机能识别并执行的指令,在计算机上运行,用以满足人们不同需求的信息化工具。计算机程序以某些程序设计语言编写,如C、Java、Python等编程语言,运行于某种目标结构体系上,实现某种功能。一般地,计算机程序由英语文本进行编写,经过编译和链接成为人难以解读,但可轻易被计算机所解读的二进制化的数字格式,然后运行。在计算机程序投入实际运行前,一般都需要经过手工或编译程序等方法进行测试,修正语法错误和逻辑错误,这个过程就是程序调试。程序调试是保证计算机程序正确运行必不可少的步骤。然而,随着互联网的高速发展,网络完全成为人们越来越关心的问题。一个程序,可能被互联网上的黑客进行调试,从而带来安全隐患。因此,为了防止自己的软件被他人调试,反调试就成为广大程序员需要考虑的一个重要课题。在《恶意代码分析实战》第十六章323页中,通过检查IsDebugged标志判断是否被调试,NtQueryInformationProcess中输出的参数可以用来判断是否被调试,利用ZwSetInformationThread使得调试器无法获取该线程的调试事件,从而终止调试器对程序的调试。在中国专利申请文献CN106845170B中,公开了一种反调试方法和装置,在该方法中,将需要反调试的进程设置为调试状态;在需要反调试的进程中创建子进程;将所创建的子进程附加到需要反调试的进程中;子进程接收需要反调试的进程发送的反馈消息,并对该反馈消息进行处理。该申请通过创建一个用于调试应用程序进程的子进程,避免了应用程序被黑客攻击的可能性,实现了对应用程序的反调试。在中国专利申请文献CN106778104B中,公开了一种应用程序的反调试方法,该方法包括以下步骤:步骤S101,检测当前应用程序是否处于被调试状态,具体包括:编写功能函数用于检测当前应用程序是否处于被调试状态,该功能函数读取Android系统的状态文件,并判断所读取的状态文件中的TracePid字段,如果TracePid字段的值等于0,则说明该应用程序没有被调试,如果不等于0,则说明该应用程序已经被调试。步骤S102,在应用程序的关键点上,加入检测逻辑,具体包括:在应用程序启动的时候、用户登录成功后或者应用程序加载其他SO文件时,加入检测逻辑;步骤S103,如果检测到应用程序被调试,则获取执行调试操作的用户信息,并将该用户信息发送到服务器,并执行退出程序,执行退出程序具体包括:如果检测到应用程序当前正在被调试,则创建多个线程,并在每个线程中加入程序退出逻辑,然后随机选择一个线程来执行退出逻辑,所述的退出逻辑为通过执行Android系统提供的接口函数System.exit(0)实现退出功能;或者退出逻辑为:通过删除应用程序执行所需的对象,让程序无法继续执行下去,其中所述应用程序执行所需的对象包括读文件的句柄或者分配的内存空间。本专利技术极大的提高了程序被破解的门槛,增强了安全性。现有技术至少存在以下不足:1.现有技术中很多反调试方法需要创建子进程,很容易被猜测到该子进程用于反调试,不隐蔽。2.利用Android系统的状态文件检测程序是否被调试,只适用于Android操作系统。
技术实现思路
为解决现有技术中存在的技术问题,本专利技术提供了一种反调试方法。通常有两种方法调试程序:一种是在程序未启动的时候,由调试器启动并调试修改程序;另一种是在程序运行的时候调试该程序,这就是附加调试。本专利技术利用程序被附加调试时会调用ntdll.dll模块里的RtlCreateUserThread()函数创建线程,并对线程的上下文指针进行初始化这一特性,先在ntdll.dll模块里的RtlCreateUserThread()函数设置Hook,当被保护程序被附加调试时,会因为RtlCreateUserThread()函数被Hook而执行检测函数,在检测函数中,先执行ntdll.dll模块里的RtlCreateUserThread()函数,函数执行完后,线程创建完毕,再通过检测该线程的上下文指针和标志位判断被保护程序是否被附加调试。本专利技术提供了一种反调试的方法,包括如下步骤:S1:对创建线程的函数设置Hook;这里Hook为inlineHook(内联钩子),可以通过GetModuleHandle函数获取ntdll.dll的句柄。这里的句柄是模块句柄,它的实际含义是模块加载到内存中的虚拟地址。通过模块句柄可以找到目标函数地址。本专利技术中由被保护程序对创建线程的函数设置Hook。S2:在被保护程序中嵌入检测函数;检测函数可以放在一个dll文件里,在被保护程序运行时加载这个dll文件,会运行dll里的代码,完成Hook。Hook完后,每当被Hook的函数被调用,检测函数就会执行。S3:当被保护程序被附加调试时,会调用步骤S1中所述的创建线程的函数,此时所述创建线程的函数由于被Hook而进入检测函数;S4:检测函数执行步骤S3中被Hook的所述创建线程的函数创建线程;S5:检测函数创建线程后,通过检测该线程的相关信息来判断是否被附加调试;如果判断结果为未被附加调试,则检测结束;否则如果判断结果为被附加调试,则结束步骤S4创建的所述线程,检测结束。优选地,步骤S1中所述创建线程的函数为ntdll.dll模块里的RtlCreateUserThread()函数。当被保护程序被附加调试时,会调用ntdll.dll模块里的RtlCreateUserThread()函数来创建线程,Hook住RtlCreateUserThread()函数,使得RtlCreateUserThread()函数被调用时进入检测函数,即可进入本专利技术反调试的检测。优选地,步骤S3中,通过GetProcessAddress()函数获取目标函数的地址,也就是ntdll.dll模块里的RtlCreateUserThread()函数的地址。利用获取到的目标函数RtlCreateUserThread()的地址,修改该地址所指向的区域的代码,使其调用本专利技术中编写的hook函数function(),function()函数主要是修改堆栈,导致目标函数RtlCreateUserThread()的返回地址发生变化,返回时,会返回到自定义函数,即返回到检测函数,并且使检测函数执行完后会返回到原来的返回地址。由于该Hook方法修改了目标函数RtlCreateUserThread()的指令,所以function()函数还需要在还原寄存器环境后,把原来被修改的指令再运行一遍(这部分指令对应的代码需要提前拷贝到函数function()中),使得Hook完后,程序执行不会崩溃。优选地,步骤S5中所述线程的相关信息包括:线程的上下文本文档来自技高网
...

【技术保护点】
1.一种反调试的方法,其特征在于,包括如下步骤:/nS1:对创建线程的函数设置Hook;/nS2:在被保护程序中嵌入检测函数;/nS3:当被保护程序被附加调试时,会调用步骤S1中所述的创建线程的函数,此时所述创建线程的函数由于被Hook而进入检测函数;/nS4:检测函数执行步骤S3中被Hook的所述的创建线程的函数创建线程;/nS5:检测函数创建线程后,通过检测该线程的相关信息来判断是否被附加调试;如果判断结果为未被附加调试,则检测结束;否则如果判断结果为被附加调试,则结束步骤S4中创建的所述线程,检测结束。/n

【技术特征摘要】
1.一种反调试的方法,其特征在于,包括如下步骤:
S1:对创建线程的函数设置Hook;
S2:在被保护程序中嵌入检测函数;
S3:当被保护程序被附加调试时,会调用步骤S1中所述的创建线程的函数,此时所述创建线程的函数由于被Hook而进入检测函数;
S4:检测函数执行步骤S3中被Hook的所述的创建线程的函数创建线程;
S5:检测函数创建线程后,通过检测该线程的相关信息来判断是否被附加调试;如果判断结果为未被附加调试,则检测结束;否则如果判断结果为被附加调试,则结束步骤S4中创建的所述线程,检测结束。


2.根据权利要求1所述的方法,其特征在于,步骤S1中所述创建线程的函数为ntdll.dll模块里的RtlCreateUserThread()函数。


3.根据权利要求1所述的方法,其特征在于,步骤S5中所述线程的相关信息包括:线程的上下文指针和该线程的标志位。


4.根据权利要求3所述的方法,其特征在于,步骤S5包括以下步骤:
S501:创建线程结束;
S502:检测当前线程的上下文指针ActivationContextStackPointer和当前线程的标志位SameTebFlags中的SkipThre...

【专利技术属性】
技术研发人员:吴建亮胡鹏张振林
申请(专利权)人:广州锦行网络科技有限公司
类型:发明
国别省市:广东;44

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

1