CN111814119A - 一种反调试的方法 - Google Patents
一种反调试的方法 Download PDFInfo
- Publication number
- CN111814119A CN111814119A CN202010461206.XA CN202010461206A CN111814119A CN 111814119 A CN111814119 A CN 111814119A CN 202010461206 A CN202010461206 A CN 202010461206A CN 111814119 A CN111814119 A CN 111814119A
- Authority
- CN
- China
- Prior art keywords
- thread
- function
- debugging
- hook
- detection
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 44
- 238000001514 detection method Methods 0.000 claims abstract description 62
- 230000006870 function Effects 0.000 claims description 136
- 101100348848 Mus musculus Notch4 gene Proteins 0.000 claims description 11
- 238000004590 computer program Methods 0.000 description 6
- 230000000694 effects Effects 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种反调试方法,属于计算机安全领域。本发明首先对创建线程的函数设置Hook,当被保护程序被附加调试时,因为创建线程的函数被设置Hook而进入检测函数,在检测函数中,先执行被Hook的创建线程的函数来创建线程,线程创建完之后,再通过检测该线程的上下文指针和标志位判断被保护程序是否被附加调试,如果被附加调试,则进行相应处理并结束该线程。本发明实现了对windows系统中应用程序的反调试,方法简单,易于实现且不易被发现。
Description
技术领域
本发明涉及计算机安全领域,尤其涉及一种反调试的方法。
背景技术
计算机已经走入千家万户,也成为现代化生活中必不可少的产品。为满足人们不断提高的生活和工作要求,企业和个人会开发实现不同功能的计算机程序。计算机程序是一组计算机能识别并执行的指令,在计算机上运行,用以满足人们不同需求的信息化工具。
计算机程序以某些程序设计语言编写,如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为inline Hook(内联钩子),可以通过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中所述线程的相关信息包括:线程的上下文指针和该线程的标志位。
优选地,步骤S5包括以下步骤:
S501:创建线程结束;
S502:检测当前线程的上下文指针ActivationContextStackPointer和当前线程的标志位SameTebFlags中的SkipThreadAttach和RanProcessInit;如果ActivationContextStackPointer=0,或者,SkipThreadAttach=1并且RanProcessInit=0,则认为被附加调试;如果不满足SkipThreadAttach=1并且RanProcessInit=0,同时ActivationContextStackPointer不等于0,则认为未被附加调试。
线程上下文指针ActivationContextStackPointer是指针,也就是一个地址,当未被附加调试时,它会被写一个地址,是在程序自身判断完标记位SameTebFlags后决定是否进行塡充,如果被附加调试,则ActivationContextStackPointer=0。SkipThreadAttach指的是线程是否被附加调试,没被附加调试SkipThreadAttach为零。当创建进程完成后,SameTebFlags中SkipThreadAttach=1并且RanProcessInit=0。
因为攻击者可能修改ActivationContextStackPointer、SkipThreadAttach或者RanProcessInit的值,而绕过反调试检测,所以只要有一个判断为被附加调试即可判断为被附加调试,但需要两个同时都不满足被附加调试的情况下,才判断为未被附加调试,增加了对被保护程序的一层保护。
S503:如果步骤S502中判断结果为未被附加调试,则检测结束;否则如果步骤S502中判断结果为被附加调试,则结束步骤S4中创建的所述线程,检测结束。
优选地,步骤S1中由被保护程序对创建线程的函数设置Hook。
优选地,步骤S5中,结束步骤S4中创建的所述线程之前,找到调试断点处,把断点“int3”指令改为“nop”指令。
断点“int3”指令是ntdll.dll文件中的代码,目的是为了让被附加调试程序响应调试事件后,让调试线程断下来,线程断下来后才可以调试。调试原本的逻辑会到达断点,只是在到达断点之前该调试被检测出来了,提前结束了。将断点“int3”指令改为“nop”指令,就是不让线程断下来,在本发明中,在调试线程结束前还没到达该断点,之所以在这里加一步改断点指令,是为了再做层防护,避免他人让调试线程结束不了,进而对调试线程进一步操作。
优选地,步骤S5中,结束步骤S4中创建的所述线程之前,修改内存属性为不可写。即进一步对被保护程序进行保护,使得他人无法对内存进行修改。
与现有技术相对比,本发明的有益效果如下:
(1)本发明利用对程序附加调试时,程序会调用RtlCreateUserThread()函数的特性,通过对该函数Hook进行是否被附加调试的检测,解决了创建子进程进行检测时易被发现的问题,达到了隐蔽检测的效果。
(2)本发明通过检测线程创建后该线程的上下文指针ActivationContextStackPointer和SameTebFlags中SkipThreadAttach和RanProcessInit标志位,判断程序是否被附加调试,解决了现有技术无法适用于windows系统的问题,达到了对windows系统下程序被附加调试的检测,实现了windows系统下的反调试。
(3)本发明仅对创建线程的函数进行Hook,并仅通过线程的上下文指针和标志位进行被附加调试的检测,方法简单易行。
(4)本发明对于线程的上下文指针ActivationContextStackPointer和SameTebFlags中SkipThreadAttach和RanProcessInit标志位,都不满足被附加调试的条件时,才判断为未被附加调试,对被保护程序增加了一层保护,降低了被攻击者绕过的可能性。
(5)本发明在判断出被附加调试后结束调试线程前,通过将断点“int3”指令改为“nop”指令,不让线程断下来,在调试线程结束前还没到达该断点,这里改断点指令,为被保护程序再加一层防护。
(6)本发明在判断出被附加调试后结束调试线程前,通过修改内存属性为不可写,到达他人无法对内存进行修改的目的,实现了对被保护程序进一步保护的效果。
附图说明
图1是现有技术中被保护程序被附加调试时的流程;
图2是本发明中反调试方法操作流程图。
具体实施方式
下面结合附图1,对本发明的具体实施方式作详细的说明。
本发明提供了一种反调试的方法,包括如下步骤:
S1:对创建线程的函数设置Hook;
这里Hook为inline Hook(内联钩子),可以通过GetModuleHandle函数获取ntdll.dll的句柄。这里的句柄是模块句柄,它的实际含义是模块加载到内存中的虚拟地址。通过模块句柄可以找到目标函数地址。本发明中由被保护程序设置Hook,实际也可以人为写一个Hook装置来Hook被保护程序,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中所述线程的相关信息包括:线程的上下文指针和该线程的标志位。
作为优选实施方式,步骤S5包括以下步骤:
S501:创建线程结束;
S502:检测当前线程的上下文指针ActivationContextStackPointer和当前线程的标志位SameTebFlags中的SkipThreadAttach和RanProcessInit;如果ActivationContextStackPointer=0,或者,SkipThreadAttach=1并且RanProcessInit=0,则认为被附加调试;如果不满足SkipThreadAttach=1并且RanProcessInit=0,同时ActivationContextStackPointer不等于0,则认为未被附加调试。
线程上下文指针ActivationContextStackPointer是指针,也就是一个地址,当未被附加调试时,它会被写一个地址,是在程序自身判断完标记位SameTebFlags后决定是否进行塡充,如果被附加调试,则ActivationContextStackPointer=0。SkipThreadAttach指的是线程是否被附加调试,没被附加调试SkipThreadAttach为零。当创建进程完成后,SameTebFlags中SkipThreadAttach=1并且RanProcessInit=0。
因为攻击者可能修改ActivationContextStackPointer、SkipThreadAttach或者RanProcessInit的值,而绕过反调试检测,所以只要有一个判断为被附加调试即可判断为被附加调试,但需要两个同时都不满足被附加调试的情况下,才判断为未被附加调试,增加了对被保护程序的一层保护。
S503:如果步骤S502中判断结果为未被附加调试,则检测结束;否则如果步骤S502中判断结果为被附加调试,则结束步骤S4中创建的所述线程,检测结束。
作为优选实施方式,步骤S1中由被保护程序对创建线程的函数设置hook。
作为优选实施方式,步骤S5中,结束步骤S4中创建的所述线程之前,找到调试断点处,把断点“int3”指令改为“nop”指令。
断点“int3”指令是ntdll.dll文件中的代码,目的是为了让被附加调试程序响应调试事件后,让调试线程断下来,线程断下来后才可以调试。调试原本的逻辑会到达断点,只是在到达断点之前该调试被检测出来了,提前结束了。将断点“int3”指令改为“nop”指令,就是不让线程断下来,在本发明中,在调试线程结束前还没到达该断点,之所以在这里加一步改断点指令,是为了再做层防护,避免他人让调试线程结束不了,进而对调试线程进一步操作。
作为优选实施方式,步骤S5中,结束步骤S4中创建的所述线程之前,修改内存属性为不可写。即进一步对被保护程序进行保护,使得他人无法对内存进行修改。
实施例1
根据本发明的一个具体实施方案,本发明包括如下步骤:
S1:对创建线程的函数设置Hook;
本发明中由被保护程序设置Hook。这里的Hook为inline Hook(内联钩子),可以通过GetModuleHandle函数获取ntdll.dll的句柄,通过模块句柄可以找到目标函数地址。
步骤S1中所述创建线程的函数为ntdll.dll模块里的RtlCreateUserThread()函数,步骤S1中由被保护程序对创建线程的函数设置hook。
S2:在被保护程序中嵌入检测函数;
将检测函数放在一个dll文件里,在被保护程序运行时加载这个dll文件,会运行dll里的代码,完成Hook。Hook完后,每当被Hook的函数被调用,检测函数就会执行。
S3:当被保护程序被附加调试时,会调用步骤S1中所述的创建线程的函数,该创建线程的函数函数被hook并进入检测函数;
当被保护程序被附加调试时,会调用ntdll.dll模块里的RtlCreateUserThread()函数来创建线程,Hook住RtlCreateUserThread()函数,使得RtlCreateUserThread()函数被调用时进入检测函数,即可进入本发明反调试的检测。
步骤S3中,通过GetProcessAddress()函数获取目标函数的地址,也就是ntdll.dll模块里的RtlCreateUserThread()函数的地址。利用获取到的目标函数RtlCreateUserThread()的地址,修改该地址所指向的区域的代码,使其调用本发明中编写的hook函数function(),function()函数主要是修改堆栈,导致目标函数RtlCreateUserThread()的返回地址发生变化,返回时,会返回到检测函数,并且使检测函数执行完后会返回到原来的返回地址。由于该Hook方法修改了目标函数RtlCreateUserThread()的指令,所以function()函数还需要在还原寄存器环境后,把原来被修改的指令再运行一遍(这部分指令对应的代码需要提前拷贝到函数function()中),使得Hook完后,程序执行不会崩溃。
S4:检测函数执行步骤S3中被Hook的所述创建线程的函数创建线程;
S5:检测函数创建线程后,通过检测该线程的相关信息来判断是否被附加调试;如果判断结果为未被附加调试,则检测结束;否则如果判断结果为被附加调试,则结束步骤S4中创建的所述线程,检测结束。
步骤S5中所述线程的相关信息包括:线程的上下文指针和该线程的标志位。线程上下文指针ActivationContextStackPointer是指针,也就是一个地址,当未被附加调试时,它会被写一个地址,在程序自身判断完标记位SameTebFlags后决定是否进行塡充,如果被附加调试,则ActivationContextStackPointer=0。SkipThreadAttach指的是线程是否被附加调试,未被附加调试SkipThreadAttach为零。当创建进程完成后,SameTebFlags中SkipThreadAttach=1并且RanProcessInit=0。
步骤S5包括以下步骤:
S501:创建线程结束;
S502:检测当前线程的上下文指针ActivationContextStackPointer和当前线程的标志位SameTebFlags中的SkipThreadAttach和RanProcessInit;如果ActivationContextStackPointer=0,或者,SkipThreadAttach=1并且RanProcessInit=0,则认为被附加调试;如果不满足SkipThreadAttach=1并且RanProcessInit=0,同时ActivationContextStackPointer不等于0,则认为未被附加调试。
因为攻击者可能修改ActivationContextStackPointer、SkipThreadAttach或者RanProcessInit的值,而绕过反调试检测,所以只要有一个判断为被附加调试即可判断为被附加调试,但需要两个同时都不满足被附加调试的情况下,才判断为未被附加调试,增加了对被保护程序的一层保护。
S503:如果步骤S502中判断结果为未被附加调试,则检测结束;否则如果步骤S502中判断结果为被附加调试,则结束步骤S4中创建的所述线程,检测结束。
步骤S5中,结束步骤S4中创建的所述线程之前,找到调试断点处,把断点“int3”指令改为“nop”指令。
断点“int3”指令是ntdll.dll文件中的代码,目的是为了让被附加调试程序响应调试事件后,让调试线程断下来,线程断下来后才可以调试。调试原本的逻辑会到达断点,只是在到达断点之前该调试被检测出来了,提前结束了。将断点“int3”指令改为“nop”指令,就是不让线程断下来,在本发明中,在调试线程结束前还没到达该断点,之所以在这里加一步改断点指令,是为了再做层防护,避免他人让调试线程结束不了,进而对调试线程进一步操作。
步骤S5中,结束步骤S4中创建的所述线程之前,修改内存属性为不可写,进一步对被保护程序进行保护,使得他人无法对内存进行修改。
本发明利用程序被附加调试时会调用ntdll.dll模块里的RtlCreateUserThread()函数创建线程,并对线程的上下文指针进行初始化这一特性,先在ntdll.dll模块里的RtlCreateUserThread()函数设置Hook,当程序被附加调试时,会因为RtlCreateUserThread()函数被Hook,而进入检测函数,在检测函数中,先执行ntdll.dll模块里的RtlCreateUserThread()函数,函数执行完后,线程创建完毕,再通过检测该线程的上下文指针和标志位判断程序是否被附加调试。实现了对windows系统应用程序的反调试,方法简单,易于实现且不易被发现。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均包含在本发明的保护范围之内。
Claims (8)
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中的SkipThreadAttach和RanProcessInit;如果ActivationContextStackPointer=0,或者,SkipThreadAttach=1并且RanProcessInit=0,则认为被附加调试;如果不满足SkipThreadAttach=1并且RanProcessInit=0,同时ActivationContextStackPointer不等于0,则认为未被附加调试;
S503:如果步骤S502中判断结果为未被附加调试,则检测结束;否则如果步骤S502中判断结果为被附加调试,则结束步骤S4中创建的所述线程,检测结束。
5.根据权利要求1所述的方法,其特征在于,步骤S1中由被保护程序对创建线程的函数设置Hook。
6.根据权利要求1所述的方法,其特征在于,步骤S5中,结束步骤S4中创建的所述线程之前,找到调试断点处,把断点“int3”指令改为“nop”指令。
7.根据权利要求1所述的方法,其特征在于,步骤S5中,结束步骤S4中创建的所述线程之前,修改内存属性为不可写。
8.根据权利要求1所述的方法,其特征在于,步骤S3中,通过GetProcessAddress()函数获取创建线程的函数的地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010461206.XA CN111814119B (zh) | 2020-05-27 | 2020-05-27 | 一种反调试的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010461206.XA CN111814119B (zh) | 2020-05-27 | 2020-05-27 | 一种反调试的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111814119A true CN111814119A (zh) | 2020-10-23 |
CN111814119B CN111814119B (zh) | 2021-03-19 |
Family
ID=72848686
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010461206.XA Active CN111814119B (zh) | 2020-05-27 | 2020-05-27 | 一种反调试的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111814119B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111814119B (zh) * | 2020-05-27 | 2021-03-19 | 广州锦行网络科技有限公司 | 一种反调试的方法 |
CN112527677A (zh) * | 2020-12-23 | 2021-03-19 | 北京深思数盾科技股份有限公司 | 应用程序的保护方法及电子设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103116715A (zh) * | 2013-03-01 | 2013-05-22 | 中标软件有限公司 | Windows平台可执行文件API延迟导入保护方法 |
CN103116714A (zh) * | 2013-03-01 | 2013-05-22 | 中标软件有限公司 | 一种Windows平台可执行文件双进程保护方法 |
US8510571B1 (en) * | 2003-03-24 | 2013-08-13 | Hoi Chang | System and method for inserting security mechanisms into a software program |
CN108021791A (zh) * | 2016-10-31 | 2018-05-11 | 腾讯科技(深圳)有限公司 | 数据保护方法及装置 |
CN111062061A (zh) * | 2019-12-10 | 2020-04-24 | 厦门市美亚柏科信息股份有限公司 | 一种用于ios系统的安全防护方法和系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111814119B (zh) * | 2020-05-27 | 2021-03-19 | 广州锦行网络科技有限公司 | 一种反调试的方法 |
-
2020
- 2020-05-27 CN CN202010461206.XA patent/CN111814119B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8510571B1 (en) * | 2003-03-24 | 2013-08-13 | Hoi Chang | System and method for inserting security mechanisms into a software program |
CN103116715A (zh) * | 2013-03-01 | 2013-05-22 | 中标软件有限公司 | Windows平台可执行文件API延迟导入保护方法 |
CN103116714A (zh) * | 2013-03-01 | 2013-05-22 | 中标软件有限公司 | 一种Windows平台可执行文件双进程保护方法 |
CN108021791A (zh) * | 2016-10-31 | 2018-05-11 | 腾讯科技(深圳)有限公司 | 数据保护方法及装置 |
CN111062061A (zh) * | 2019-12-10 | 2020-04-24 | 厦门市美亚柏科信息股份有限公司 | 一种用于ios系统的安全防护方法和系统 |
Non-Patent Citations (1)
Title |
---|
HOUJINGYI: "反调试技术总结", 《看雪论坛HTTPS://BBS.PEDIY.COM/THREAD-225740.HTM》 * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111814119B (zh) * | 2020-05-27 | 2021-03-19 | 广州锦行网络科技有限公司 | 一种反调试的方法 |
CN112527677A (zh) * | 2020-12-23 | 2021-03-19 | 北京深思数盾科技股份有限公司 | 应用程序的保护方法及电子设备 |
CN112527677B (zh) * | 2020-12-23 | 2021-09-24 | 北京深思数盾科技股份有限公司 | 应用程序的保护方法及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN111814119B (zh) | 2021-03-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Kawakoya et al. | Memory behavior-based automatic malware unpacking in stealth debugging environment | |
KR100645983B1 (ko) | 불법 프로세스 검출 모듈 및 그 방법 | |
US20050108562A1 (en) | Technique for detecting executable malicious code using a combination of static and dynamic analyses | |
Kim et al. | A Brief Survey on Rootkit Techniques in Malicious Codes. | |
US9177149B2 (en) | Method of detecting malware in an operating system kernel | |
CN111814119B (zh) | 一种反调试的方法 | |
CN109271789B (zh) | 恶意进程检测方法、装置、电子设备及存储介质 | |
US11163645B2 (en) | Apparatus and method of control flow integrity enforcement utilizing boundary checking | |
CN111859380A (zh) | Android App漏洞的零误报检测方法 | |
US20030130813A1 (en) | Adaptive test program generation | |
CN103514405B (zh) | 一种缓冲区溢出的检测方法及系统 | |
US10521588B1 (en) | Dynamic analysis of malware that has evasion code | |
Mori et al. | A tool for analyzing and detecting malicious mobile code | |
KR101842263B1 (ko) | 어플리케이션에 대한 역공학 차단 방법 및 장치 | |
Wang et al. | Detecting data races in interrupt-driven programs based on static analysis and dynamic simulation | |
CN109388948B (zh) | 一种基于虚拟化技术的潜在恶意软件分析方法及相关装置 | |
CN113760770B (zh) | 基于自动静态资源检测的反调试方法和系统 | |
US10460108B1 (en) | Method and system to identify and rectify input dependency based evasion in dynamic analysis | |
Teplyuk et al. | Study of security flaws in the Linux kernel by fuzzing | |
Saad et al. | The study of the anti-debugging techniques and their mitigations | |
KR102421394B1 (ko) | 하드웨어와 소프트웨어 기반 트레이싱을 이용한 악성코드 탐지 장치 및 방법 | |
Grechko et al. | Secure software developing recommendations | |
Kawakoya et al. | Stealth loader: Trace-free program loading for analysis evasion | |
CN113760770A (zh) | 基于自动静态资源检测的反调试方法和系统 | |
Cai et al. | A smart fuzzing approach for integer overflow detection |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |