CN110750782A - 一种程序退出的方法及相关设备 - Google Patents

一种程序退出的方法及相关设备 Download PDF

Info

Publication number
CN110750782A
CN110750782A CN201810728285.9A CN201810728285A CN110750782A CN 110750782 A CN110750782 A CN 110750782A CN 201810728285 A CN201810728285 A CN 201810728285A CN 110750782 A CN110750782 A CN 110750782A
Authority
CN
China
Prior art keywords
function
program
memory
debugged
calling
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
Application number
CN201810728285.9A
Other languages
English (en)
Other versions
CN110750782B (zh
Inventor
周志刚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu Network Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201810728285.9A priority Critical patent/CN110750782B/zh
Publication of CN110750782A publication Critical patent/CN110750782A/zh
Application granted granted Critical
Publication of CN110750782B publication Critical patent/CN110750782B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44594Unloading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明实施例公开了一种程序退出的方法及相关设备,用于在检测到程序被调试后,强行退出程序以提高程序的安全性。本发明实施例方法包括:编写while循环函数,所述while循环函数用于调用系统内存分配函数持续分配内存,所述系统内存分配函数包括分配的内存的大小;编写for循环函数,所述for循环函数用于在所述分配的内存中插入随机数据;确定当前程序是否被调试;若所述当前程序被调试,则在编写的所述while循环函数中调用Windows系统的应用程序编程接口API中的系统内存分配函数malloc分配内存;通过调用所述API中的rand函数生成所述随机数据;根据所述for循环函数将所述随机数据插入所述分配的内存中,直至分配内存失败以退出所述当前程序。

Description

一种程序退出的方法及相关设备
技术领域
本发明涉及控制技术领域,尤其涉及一种程序退出的方法及相关设备。
背景技术
目前,对于Windows平台开发的一部分软件来说,需要对软件的安全性进行保护,例如一些只有注册才能使用的软件、电影游戏程序或者收费软件等,这些软件都希望能安全的运行与用户电脑上,另外,最重要的则是防止黑客破解软件中的收费功能,或者破解软件的安全算法,以避免软件开发厂商的损失。对于黑客来说,通常首先是通过对软件的破解,然后才是利用破解的漏洞来获得利益。而黑客破解软件则是先通过使用一些调试器来调试程序,从而弄清楚软件的安全策略以及实现原理。
因此,对于任何客户端软件来说,检测当前客户端程序是否有被调试是比较重要的,能阻止黑客进行调试,保护软件不被破解。故,如何检测软件是否被调试,同时如何在检测到被调试后强行退出程序以防止黑客进一步调试是一个急需解决的问题。
发明内容
本发明实施例提供了一种程序退出的方法及相关设备,用于在检测到程序被调试后,强行退出程序以提高程序的安全性。
本发明实施例的第一方面提供了一种程序退出的方法,包括:编写while循环函数,所述while循环函数用于调用系统内存分配函数持续分配内存,所述系统内存分配函数包括分配的内存的大小;编写for循环函数,所述for循环函数用于在所述分配的内存中插入随机数据;确定当前程序是否被调试;若所述当前程序被调试,则在编写的所述while循环函数中调用Windows系统的应用程序编程接口API中的系统内存分配函数malloc分配内存;通过调用所述API中的rand函数生成所述随机数据;根据所述for循环函数将所述随机数据插入所述分配的内存中,直至分配内存失败以退出所述当前程序。本发明实施例中,通过检测当前程序是否被调试,当检测到该当前程序确定被调试时,会不断的分配内存,当内存耗尽时,导致内存分配失败,使得在写入随机数据时导致当前程序异常,产生崩溃,起到了退出当前程序的目的,提高了程序的安全性。
在一种可能的实施例中,所述确定当前程序是否被调试包括:通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。本实现方式中,提供了确定当前程序是否被调度的具体方法,包括通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用,若返回值为1,则表示当前程序被调试;若返回值为0,则表示当前程序未被调试;使得本发明实施例更加具有可操作性。
在一种可能的实施例中,所述确定当前程序是否被调试包括:加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;根据所述当前进程的信息确定所述当前程序是否被调试。本实现方式中,提供了确定当前程序是否被调度的另一种方法,包括调用Windows系统的API中的NtQueryInformationProcess来获取当前进程的信息;根据所述当前进程的信息确定所述当前程序是否被调试,增加了本发明实施例的可实现方式。
在一种可能的实施例中,所述加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口包括:通过调用API中的LoadLibraryA函数加载所述ntdll.dll模块,所述LoadLibraryA函数的输入参数包括所述ntdll.dll模块的标识信息,所述LoadLibraryA函数的输出参数为所述ntdll.dll模块的内存地址;通过API中的GetProcAddress函数获取所述NtQueryInformationProcess接口在所述ntdll.dll模块的内存地址,所述GetProcAddress函数的输入函数包括所述ntdll.dll模块的内存地址。
本发明实施例的第二方面提供了一种程序退出设备,包括:编写单元,用于编写while循环函数,所述while循环函数用于调用系统内存分配函数持续分配内存,所述系统内存分配函数包括分配的内存的大小;编写for循环函数,所述for循环函数用于在所述分配的内存中插入随机数据;判断单元,用于确定当前程序是否被调试;调用单元,若所述判断单元确定所述当前程序被调试,用于则在编写的所述while循环函数中调用Windows系统的应用程序编程接口API中的系统内存分配函数malloc分配内存;通过调用所述API中的rand函数生成所述随机数据;插入单元,用于根据所述for循环函数将所述随机数据插入所述分配的内存中,直至分配内存失败以退出所述当前程序。本发明实施例中,判断单元通过检测当前程序是否被调试,当判断单元检测到该当前程序确定被调试时,则调用单元会根据编写好的线程功能函数退出程序,提高了程序的安全性。本发明实施例中,通过判断单元检测当前程序是否被调试,当判断单元检测到该当前程序确定被调试时,调用单元会根据编写好的线程功能函数退出程序,提高了程序的安全性。
在一种可能的实施例中,所述判断单元包括:获取模块,用于通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;确定模块,用于当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。本实现方式中,细化了判断单元如何判断当前程序是否被调试的方式,使得本发明实施例更加具有可操作性。
在一种可能的实施例中,所述判断单元包括:所述获取模块,用于加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;所述调用模块,用于根据所述当前进程的信息确定所述当前程序是否被调试。本实现方式中,细化了判断单元如何判断当前程序是否被调试的另一种方式,增加了本发明实施例的可实现方式。
在一种可能的实施例中,所述获取模块具体用于:
通过调用API中的LoadLibraryA函数加载所述ntdll.dll模块,所述LoadLibraryA函数的输入参数包括所述ntdll.dll模块的标识信息,所述LoadLibraryA函数的输出参数为所述ntdll.dll模块的内存地址;通过API中的GetProcAddress函数获取所述NtQueryInformationProcess接口在所述ntdll.dll模块的内存地址,所述GetProcAddress函数的输入函数包括所述ntdll.dll模块的内存地址。
本发明第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述任意一项所述的程序退出的方法的步骤。
本发明第四方面提供了一种计算机可读存储介质,其上存储有计算机管理类程序,其特征在于:所述计算机管理类程序被处理器执行时实现如上述任意一项所述的程序退出的方法的步骤。
从以上技术方案可以看出,本发明实施例具有以下优点:编写while循环函数,所述while循环函数用于调用系统内存分配函数持续分配内存,所述系统内存分配函数包括分配的内存的大小;编写for循环函数,所述for循环函数用于在所述分配的内存中插入随机数据;确定当前程序是否被调试;若所述当前程序被调试,则在编写的所述while循环函数中调用Windows系统的应用程序编程接口API中的系统内存分配函数malloc分配内存;通过调用所述API中的rand函数生成所述随机数据;根据所述for循环函数将所述随机数据插入所述分配的内存中,直至分配内存失败以退出所述当前程序。本发明实施例中,通过检测当前程序是否被调试,当检测到该当前程序确定被调试时,会根据编写好的线程功能函数退出程序,提高了程序的安全性。
附图说明
图1为本发明实施例提供的一种可能的程序退出的方法的流程图;
图2为本发明实施例提供的一种可能的程序退出设备的结构示意图;
图3为本发明实施例提供的一种可能的程序退出设备的硬件结构示意图;
图4为本发明实施例提供的另一可能的程序退出设备的硬件结构示意图。
具体实施方式
本发明实施例提供了一种程序退出的方法及相关设备,用于在检测到程序被调试后,强行退出程序以提高程序的安全性。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,为本发明实施例提供的一种可能的程序退出的方法的流程图,具体包括:
101、编写检测调试接口函数;
通常的对于任意一个程序,操作系统都会提供相应的机制来对程序进行调试,以方便开发人员定位程序的问题,然而此功能也会被黑客所利用,用于调试分析程序的核心功能,从而能够进行破解等。因此,操作系统也会提供相应的应用程序编程接口(application programming interface,API)来确定程序是否被调试。本发明实施例中,编写检测调试接口函数,该检测调试接口函数用于确定程序是否被调试器调试。
具体地,本发明实施例中,通过检测调试接口函数确定程序是否被调试器调试的方式有多种,例如:
方式1:通过调用系统API函数IsDebuggerPresent来获取当前程序是否被调试,其函数返回值则表示如果被调试则返回1,否则返回0。
方式2:通过读取进程信息来判断当前进程是否被调试,那么在系统API函数中也提供了相应的API函数NtQueryInformationProcess来获取当前的进程信息,然后从当前的进程信息中读取该程序是否被调试。具体实现如下:
此API函数NtQueryInformationProcess在系统的Ntdll.dll模块中,所以首先则加载系统的ntdll.dll,然后从ntdll.dll中获取NtQueryInformationProcess接口,最后则调用该NtQueryInformationProcess接口获取程序是否有被调试。通过系统API函数LoadLibraryA来加载和获取ntdll.dll,如下:
HMODULE LoadLibraryA(LPCSTR lpLibFileName);
其中传入参数LPCSTR lpLibFileName表示需要获取的dll的名称。
其中返回值即为该dll在内存中的模块地址。
HMODULE hmodule=LoadLibraryA(“ntdll.dll”);
然后通过系统API函数GetProcAddress来获取NtQueryInformationProcess接口在该dll的内存地址。
其中函数原型如下:
FARPROC GetProcAddress(
HMODULE hModule,//DLL模块句柄
LPCSTR lpProcName//函数名
);
其中需要传入参数HMODULE hModule则是ntdll.dll的模块地址,也即是本步骤之前调用获取到的hmodule。
其中需要传入参数LPCSTR lpProcName表示接口的名称,对应本文则是NtQueryInformationProcess。
其中返回值则是该接口的内存地址。
FARPROC addr=GetProcAddress(hmodule,“NtQueryInformationProcess”);
因此,获取到了NtQueryInformationProcess接口的内存地址addr。
接着则调用NtQueryInformationProcess来获取进程信息,从而可以判断当前进程是否被调试。
其中函数原型如下:
NTSYSAPI NTSTATUS NTAPI NtQueryInformationProcess(
HANDLE ProcessHandle,进程句柄
PROCESSINFOCLASS InformationClass,信息类型
PVOID ProcessInformation,缓冲指针
ULONG ProcessInformationLength,以字节为单位的缓冲大小
PULONG ReturnLength写入缓冲的字节数
);
本发明实施例中,则可以通过传入参数InformationClass为ProcessDebugPort来获取进程是否被调试。
NtQueryInformationProcess(GetCurrentProcess(),ProcessDebugPort,&debugPort,sizeof(debugPort),NULL);
其中NtQueryInformationProcess函数的第一个参数表示传入当前进程的句柄,则可以通过调用系统API函数GetCurrentProcess来获取。
NtQueryInformationProcess函数的第二个参数ProcessDebugPort表示获取当前进程是否被调试。
NtQueryInformationProcess函数的第三个参数则是获取的结果缓存区,从而最终结果数据则会存储在变量debugPort中。
最终调用完成此NtQueryInformationProcess函数后,则可以通过判断变量debugPort来确定当前程序是否被调试器调试,如果变量debugPort的值为0则说明当前程序没有被调试,如果变量debugPort的值为1则说明当前程序有被调试。
102、编写while循环函数以分配内存;
103、通过for循环将随机生成的数据写入分配的内存中;
当程序在运行时,如果本文检测到当前程序被黑客在调试,那么在步骤101中编写的检测调试接口函数发现当前程序正在被调试。本发明实施例中,为了阻止黑客继续调试,则会终止当前程序,从而防止黑客继续调试逆向分析,本发明实施例则会编写程序退出的方法。具体的,本发明实施例中,通过编写一处代码,然后在此代码中会产生错误,从而导致当前程序产生异常,以退出当前程序,此方法则比较隐蔽。同时为了进一步的提高退出程序的隐蔽性,本发明实施例则编写一个循环来分配内存,通过不断的分配内存,并往内存中写入数据,直到内存分配失败,从而导致写入分配失败的内存数据使得程序产生异常,实现退出当前程序的目的。本文编写一个while循环,此while循环则不会退出,一致执行,直到当前程序产生异常,从而导致当前程序崩溃,直接退出当前程序,具体实现如下:
While(true)
{
Char*pData=(char*)malloc(1024*10*10);
本发明实施例中,首先调用系统内存分配函数malloc来分配一段内存,其中传入参数1024*10*10表示分配的内存大小。分配完成内存后,则会将该分配的内存空间中写入一些随机数据,写入随机数据的目的是使得分配的内存空间中有不会任何规律,以防止黑客找出规律来破解当前程序。
For(int I=0;I<1024*10*10;i++)
首先编写一个for循环来对分配的内存写入数据。
pData[i]=rand();
通过调用系统API函数rand()来生成一个随机数据,并将随机数据写入分配的内存pData中。
那么由于一个程序的内存空间是有限的,而此功能函数则会不断的分配内存,当内存耗尽时,则会导致内存分配失败,从而会使得pData的值为空,从而在写入数据时pData[i]=rand()则会导致程序异常,产生崩溃,从而起到了程序退出的功能。
104、确定当前程序是否被调试;
若当前程序在运行时,通过步骤101编写的检测调试接口函数确定当前程序是否被调试器调试。若通过检测调试接口函数确定当前程序被调试,则执行步骤105;若通过检测调试接口函数确定当前程序没有被调试,则执行其他步骤,例如继续运行当前程序等。
105、若当前程序被调试,则根据线程功能函数调用程序退出函数,以退出当前程序。
若在步骤104中,确定当前程序被调试,则为了阻止黑客继续调试,本发明实施例中会终止运行当程序,从而防止黑客继续调试逆向分析。具体地,根据线程功能调用程序退出函数,从而将被调试的当前程序进行退出,阻止黑客继续调试。
需要说明的是,本发明实施例中,除了通过步骤102所描述的方式来实现退出程序的功能,还可以采用如下方式来实现程序退出的功能,例如:
方式1:通过调用系统API函数ExitProcess来退出当前进程。
ExitProcess函数原型如下:
VOID WINAPI ExitProcess(
UINT uExitCode
);
其中传入一个参数uExitCode表示退出的代码。本发明实施例中,当检测到当前程序被调试时,则将此代码传入0。具体实现如下:
ExitProcess(0);
从而实现了程序退出。
方式2:通过调用系统API函数TerminateProcess来退出当前进程。
TerminateProcess函数原型如下:
BOOL TerminateProcess(HANDLE hProcess,UINT uExitCode);
其中传入第一个参数hProcess表示当前进程的句柄。
其中传入第二个参数uExitCode表示退出的代码。发明实施例中,当检测到当前程序被调试时,则将此代码传入0。具体实现如下:
TerminateProcess(GetCurrentProcess(),0);
其中传入当前进程的句柄,从而实现了程序退出。
方式3:本发明实施例中,还可以通过创建一个线程或者多个线程功能函数,然后在创建的线程函数中调用程序退出函数,从而实现程序的退出。通过创建线程的方式则更具有隐蔽性。具体实现如下:
首先编写线程功能函数
本发明实施例中,可以通过系统提供的API函数CreateThread来创建线程。
其CreateThread函数原型如下:
Figure BDA0001720245680000092
Figure BDA0001720245680000101
其中:
参数lpThreadAttributes,用于表示线程属性,用于设置线程的属性,NULL表示使用默认的设置。
参数dwStackSize,用于表示线程堆栈大小,使用0采用默认设置,windows会根据需要动态增加堆栈大小。
参数lpStartAddress,用于表示指向线程函数的指针。
参数lpParameter,用于表示向线程函数传递的参数。
参数dwCreationFlags,用于表示线程标志,CREATE_SUSPENDED,用于表示创建一个挂起的线程,0表示创建后立即激活线程。
参数lpThreadId,表示当前线程的ID(输出参数)。
其中,最核心的是参数lpStartAddress,用于表示此线程是用于执行什么代码执行什么功能。本发明实施例中,参数lpStartAddress则可以是传入之前编写好的线程功能函数ThreadProc。
具体调用如下:
hThread=CreateThread(NULL,0,ThreadProc,NULL,0,&threadID);
那么此步骤则创建了一个线程,此线程函数则是ThreadProc,则此线程会执行此函数的功能,而在此函数中则会调用退出当前程序的函数,从而实现退出程序的目的。
需要注意的是,该方式3中,可以同时编写创建多个线程,每个线程都用于调用系统的退出进程的功能,从而实现退出程序的功能。
需要说明的是,本发明实施例中,可以采用随机策略来调用上述各退出程序的方法,从而将被调试的程序进行退出,阻止黑客继续调试。也可以采用多种方法组合的方式,即使用多种退出程序的方法的结合,使得程序退出有更多的随机性,提高黑客分析的门槛。因此,本发明实施例中,采用的退出程序的方法具体此处不做限定。
本发明实施例中,通过检测当前程序是否被调试,当检测到该当前程序确定被调试时,会根据编写好的线程功能函数退出程序,提高了程序的安全性。
上面从程序退出的方法的角度对本发明实施例进行了描述,下面从程序退出设备的角度对本发明实施例进行描述。
请参阅图2,图2为本发明实施例提供的一种可能的程序退出设备的实施例示意图,该程序退出设备,具体包括:
编写单元201,用于编写while循环函数,所述while循环函数用于调用系统内存分配函数持续分配内存,所述系统内存分配函数包括分配的内存的大小;编写for循环函数,所述for循环函数用于在所述分配的内存中插入随机数据;
判断单元202,用于确定当前程序是否被调试;
调用单元203,若所述判断单元确定所述当前程序被调试,用于则在编写的所述while循环函数中调用Windows系统的应用程序编程接口API中的系统内存分配函数malloc分配内存;通过调用所述API中的rand函数生成所述随机数据;
插入单元204,用于根据所述for循环函数将所述随机数据插入所述分配的内存中,直至分配内存失败以退出所述当前程序。
可选的,在一些可能的实现方式中,所述判断单元202包括:
获取模块2021,用于通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;
确定模块2022,用于当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。
可选的,在一些可能的实现方式中,所述判断单元202包括:
所述获取模块2021,用于加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;
所述调用模块2022,用于根据所述当前进程的信息确定所述当前程序是否被调试。
可选的,在一些可能的实现方式中,所述获取模块2021具体用于:
通过调用API中的LoadLibraryA函数加载所述ntdll.dll模块,所述LoadLibraryA函数的输入参数包括所述ntdll.dll模块的标识信息,所述LoadLibraryA函数的输出参数为所述ntdll.dll模块的内存地址;通过API中的GetProcAddress函数获取所述NtQueryInformationProcess接口在所述ntdll.dll模块的内存地址,所述GetProcAddress函数的输入函数包括所述ntdll.dll模块的内存地址。
本发明实施例中,编写模块编写线程功能函数,并根据线程功能函数创建至少一个线程,所述线程功能函数用于调用程序退出函数;确定模块确定当前程序是否被调试;若所述当前程序被调试,则创建模块根据所述至少一个线程调用所述线程功能函数,以退出所述当前程序。本发明实施例中,通过检测当前程序是否被调试,当检测到该当前程序确定被调试时,会根据编写好的线程功能函数退出程序,提高了程序的安全性。
请参阅图3,图3为本发明实施例提供的电子设备的实施例示意图。
如图3所示,本发明实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:编写while循环函数,所述while循环函数用于调用系统内存分配函数持续分配内存,所述系统内存分配函数包括分配的内存的大小;编写for循环函数,所述for循环函数用于在所述分配的内存中插入随机数据;确定当前程序是否被调试;若所述当前程序被调试,则在编写的所述while循环函数中调用Windows系统的应用程序编程接口API中的系统内存分配函数malloc分配内存;通过调用所述API中的rand函数生成所述随机数据;根据所述for循环函数将所述随机数据插入所述分配的内存中,直至分配内存失败以退出所述当前程序。
可选的,在一种可能的实施例中,所述处理器具体用于:
通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。
可选的,在一种可能的实施例中,所述处理器具体用于:加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;根据所述当前进程的信息确定所述当前程序是否被调试。
可选的,在一种可能的实施例中,所述处理器具体用于:通过调用API中的LoadLibraryA函数加载所述ntdll.dll模块,所述LoadLibraryA函数的输入参数包括所述ntdll.dll模块的标识信息,所述LoadLibraryA函数的输出参数为所述ntdll.dll模块的内存地址;通过API中的GetProcAddress函数获取所述NtQueryInformationProcess接口在所述ntdll.dll模块的内存地址,所述GetProcAddress函数的输入函数包括所述ntdll.dll模块的内存地址。
在具体实施过程中,处理器320执行计算机程序311时,可以实现图1对应的实施例中任一实施方式。
由于本实施例所介绍的电子设备为实施本发明实施例中一种程序退出设备所采用的设备,故而基于本发明实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本发明实施例中的方法不再详细介绍,只要本领域所属技术人员实施本发明实施例中的方法所采用的设备,都属于本发明所欲保护的范围。
请参阅图4,图4为本发明实施例提供的一种计算机可读存储介质的实施例示意图。
如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,该计算机程序411被处理器执行时实现如下步骤:编写while循环函数,所述while循环函数用于调用系统内存分配函数持续分配内存,所述系统内存分配函数包括分配的内存的大小;编写for循环函数,所述for循环函数用于在所述分配的内存中插入随机数据;确定当前程序是否被调试;若所述当前程序被调试,则在编写的所述while循环函数中调用Windows系统的应用程序编程接口API中的系统内存分配函数malloc分配内存;通过调用所述API中的rand函数生成所述随机数据;根据所述for循环函数将所述随机数据插入所述分配的内存中,直至分配内存失败以退出所述当前程序。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:编写线程功能函数,并根据线程功能函数创建至少一个线程,所述线程功能函数用于调用程序退出函数;确定当前程序是否被调试;若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以退出所述当前程序。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;根据所述当前进程的信息确定所述当前程序是否被调试。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过调用API中的LoadLibraryA函数加载所述ntdll.dll模块,所述LoadLibraryA函数的输入参数包括所述ntdll.dll模块的标识信息,所述LoadLibraryA函数的输出参数为所述ntdll.dll模块的内存地址;通过API中的GetProcAddress函数获取所述NtQueryInformationProcess接口在所述ntdll.dll模块的内存地址,所述GetProcAddress函数的输入函数包括所述ntdll.dll模块的内存地址。
需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。

Claims (10)

1.一种程序退出的方法,其特征在于,包括:
编写while循环函数,所述while循环函数用于调用系统内存分配函数持续分配内存,所述系统内存分配函数包括分配的内存的大小;
编写for循环函数,所述for循环函数用于在所述分配的内存中插入随机数据;
确定当前程序是否被调试;
若所述当前程序被调试,则在编写的所述while循环函数中调用Windows系统的应用程序编程接口API中的系统内存分配函数malloc分配内存;
通过调用所述API中的rand函数生成所述随机数据;
根据所述for循环函数将所述随机数据插入所述分配的内存中,直至分配内存失败以退出所述当前程序。
2.根据权利要求1所述的方法,其特征在于,所述确定当前程序是否被调试包括:
通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;
当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;
当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。
3.根据权利要求1所述的方法,其特征在于,所述确定当前程序是否被调试包括:
加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;
调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;
根据所述当前进程的信息确定所述当前程序是否被调试。
4.根据权利要求3所述的方法,其特征在于,所述加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口包括:
通过调用API中的LoadLibraryA函数加载所述ntdll.dll模块,所述LoadLibraryA函数的输入参数包括所述ntdll.dll模块的标识信息,所述LoadLibraryA函数的输出参数为所述ntdll.dll模块的内存地址;
通过API中的GetProcAddress函数获取所述NtQueryInformationProcess接口在所述ntdll.dll模块的内存地址,所述GetProcAddress函数的输入函数包括所述ntdll.dll模块的内存地址。
5.一种程序退出设备,其特征在于,包括:
编写单元,用于编写while循环函数,所述while循环函数用于调用系统内存分配函数持续分配内存,所述系统内存分配函数包括分配的内存的大小;编写for循环函数,所述for循环函数用于在所述分配的内存中插入随机数据;
判断单元,用于确定当前程序是否被调试;
调用单元,若所述判断单元确定所述当前程序被调试,用于则在编写的所述while循环函数中调用Windows系统的应用程序编程接口API中的系统内存分配函数malloc分配内存;通过调用所述API中的rand函数生成所述随机数据;
插入单元,用于根据所述for循环函数将所述随机数据插入所述分配的内存中,直至分配内存失败以退出所述当前程序。
6.根据权利要求5所述的程序退出设备,其特征在于,所述判断单元包括包括:
获取模块,用于通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;
确定模块,用于当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。
7.根据权利要求5所述的程序退出设备,其特征在于,所述判断单元包括:
所述获取模块,用于加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;
所述调用模块,用于根据所述当前进程的信息确定所述当前程序是否被调试。
8.根据权利要求7所述的程序退出设备,其特征在于,所述获取模块具体用于:
通过调用API中的LoadLibraryA函数加载所述ntdll.dll模块,所述LoadLibraryA函数的输入参数包括所述ntdll.dll模块的标识信息,所述LoadLibraryA函数的输出参数为所述ntdll.dll模块的内存地址;通过API中的GetProcAddress函数获取所述NtQueryInformationProcess接口在所述ntdll.dll模块的内存地址,所述GetProcAddress函数的输入函数包括所述ntdll.dll模块的内存地址。
9.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1-4任意一项所述的方法。
10.一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行如权利要求1-4任意一项所述的方法。
CN201810728285.9A 2018-07-05 2018-07-05 一种程序退出的方法及相关设备 Active CN110750782B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810728285.9A CN110750782B (zh) 2018-07-05 2018-07-05 一种程序退出的方法及相关设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810728285.9A CN110750782B (zh) 2018-07-05 2018-07-05 一种程序退出的方法及相关设备

Publications (2)

Publication Number Publication Date
CN110750782A true CN110750782A (zh) 2020-02-04
CN110750782B CN110750782B (zh) 2022-05-13

Family

ID=69274676

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810728285.9A Active CN110750782B (zh) 2018-07-05 2018-07-05 一种程序退出的方法及相关设备

Country Status (1)

Country Link
CN (1) CN110750782B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060212940A1 (en) * 2005-03-21 2006-09-21 Wilson Michael C System and method for removing multiple related running processes
CN104182350A (zh) * 2013-05-28 2014-12-03 中国银联股份有限公司 一种针对包括多个进程的应用的内存管理方法和装置
CN106778104A (zh) * 2017-01-20 2017-05-31 武汉斗鱼网络科技有限公司 一种应用程序的反调试方法和系统
CN108830096A (zh) * 2018-06-21 2018-11-16 广州华多网络科技有限公司 数据处理方法、装置、电子设备及存储介质

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060212940A1 (en) * 2005-03-21 2006-09-21 Wilson Michael C System and method for removing multiple related running processes
CN104182350A (zh) * 2013-05-28 2014-12-03 中国银联股份有限公司 一种针对包括多个进程的应用的内存管理方法和装置
CN106778104A (zh) * 2017-01-20 2017-05-31 武汉斗鱼网络科技有限公司 一种应用程序的反调试方法和系统
CN108830096A (zh) * 2018-06-21 2018-11-16 广州华多网络科技有限公司 数据处理方法、装置、电子设备及存储介质

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
HOUJINGYI: "反调试技术总结", 《HTTPS://BBS.PEDIY.COM/THREAD-225740.HTM》 *
WEIXIN_34288121: "内存失败", 《HTTPS://BLOG.CSDN.NET/WEIXIN_34288121/ARTICLE/DETAILS/92576881》 *

Also Published As

Publication number Publication date
CN110750782B (zh) 2022-05-13

Similar Documents

Publication Publication Date Title
JP6842367B2 (ja) ファイル中の悪意のあるコードの検出システム及び方法
JP6259862B2 (ja) ランダムアクセスメモリ内の悪質なコードを検出するためのシステムおよび方法
US9094451B2 (en) System and method for reducing load on an operating system when executing antivirus operations
US9146833B2 (en) System and method for correct execution of software based on a variance between baseline and real time information
RU2627107C2 (ru) Профилирование выполнения кода
KR100645983B1 (ko) 불법 프로세스 검출 모듈 및 그 방법
US20150213260A1 (en) Device and method for detecting vulnerability attack in program
US10013553B2 (en) Protecting software application
US8645923B1 (en) Enforcing expected control flow in program execution
JP2018041438A5 (zh)
JP4572259B1 (ja) 情報機器、プログラム及び不正なプログラムコードの実行防止方法
CN105760787B (zh) 用于检测随机存取存储器中的恶意代码的系统及方法
US11163645B2 (en) Apparatus and method of control flow integrity enforcement utilizing boundary checking
US20150121531A1 (en) System and method for preserving and subsequently restoring emulator state
US20140189654A1 (en) Systems, methods, and media for testing software patches
CN109324952B (zh) 一种基于内存映射文件检测进程实例个数的方法及装置
US9047448B2 (en) Branch auditing in a computer program
CN112231198B (zh) 一种恶意进程调试方法、装置、电子设备及介质
US10275595B2 (en) System and method for characterizing malware
US9003236B2 (en) System and method for correct execution of software based on baseline and real time information
CN110750782B (zh) 一种程序退出的方法及相关设备
EP2881883A1 (en) System and method for reducing load on an operating system when executing antivirus operations
US8925077B2 (en) Mobile devices with inhibited application debugging and methods of operation
CN108875372B (zh) 一种代码检测方法、装置、电子设备及存储介质
CN109117631A (zh) 一种程序退出的方法及相关设备

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