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

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

Info

Publication number
CN109117631A
CN109117631A CN201810728160.6A CN201810728160A CN109117631A CN 109117631 A CN109117631 A CN 109117631A CN 201810728160 A CN201810728160 A CN 201810728160A CN 109117631 A CN109117631 A CN 109117631A
Authority
CN
China
Prior art keywords
function
program
thread
debugged
present procedure
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.)
Pending
Application number
CN201810728160.6A
Other languages
English (en)
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 CN201810728160.6A priority Critical patent/CN109117631A/zh
Publication of CN109117631A publication Critical patent/CN109117631A/zh
Pending legal-status Critical Current

Links

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/55Detecting local intrusion or implementing counter-measures
    • G06F21/554Detecting local intrusion or implementing counter-measures involving event detection and direct action
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler

Abstract

本发明实施例公开了一种程序退出的方法及相关设备,用于在检测到程序被调试后,强行退出程序以提高程序的安全性。本发明实施例方法包括:根据Windows系统的应用程序编程接口API中的ThreadProc函数编写线程功能函数,所述ThreadProc函数的输入参数包括应用程序退出函数TerminateProcess,所述线程功能函数用于调用所述程序退出函数TerminateProcess;通过调用所述API中的CreatThread函数创建至少一个线程函数,所述CreatThread函数至少包括lpStartAddress参数和dwCreationFlags参数,所述lpStartAddress参数用于表示指向所述线程函数的指针,所述dwCreationFlags参数用于表示创建的线程的标识信息;确定当前程序是否被调试;若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以根据所述程序退出函数TerminateProcess退出所述当前程序。

Description

一种程序退出的方法及相关设备
技术领域
本发明涉及控制技术领域,尤其涉及一种程序退出的方法及相关设备。
背景技术
目前,对于Windows平台开发的一部分软件来说,需要对软件的安全性进行保护,例如一些只有注册才能使用的软件、电影游戏程序或者收费软件等,这些软件都希望能安全的运行与用户电脑上,另外,最重要的则是防止黑客破解软件中的收费功能,或者破解软件的安全算法,以避免软件开发厂商的损失。对于黑客来说,通常首先是通过对软件的破解,然后才是利用破解的漏洞来获得利益。而黑客破解软件则是先通过使用一些调试器来调试程序,从而弄清楚软件的安全策略以及实现原理。
因此,对于任何客户端软件来说,检测当前客户端程序是否有被调试是比较重要的,能阻止黑客进行调试,保护软件不被破解。故,如何检测软件是否被调试,同时如何在检测到被调试后强行退出程序以防止黑客进一步调试是一个急需解决的问题。
发明内容
本发明实施例提供了一种程序退出的方法及相关设备,用于在检测到程序被调试后,强行退出程序以提高程序的安全性。
本发明实施例的第一方面提供了一种程序退出的方法,包括:根据Windows系统的应用程序编程接口API中的ThreadProc函数编写线程功能函数,所述ThreadProc函数的输入参数包括应用程序退出函数TerminateProcess,所述线程功能函数用于调用所述程序退出函数TerminateProcess;通过调用所述API中的CreatThread函数创建至少一个线程函数,所述CreatThread函数至少包括lpStartAddress参数和dwCreationFlags参数,所述lpStartAddress参数用于表示指向所述线程函数的指针,所述dwCreationFlags参数用于表示创建的线程的标识信息;确定当前程序是否被调试;若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以根据所述程序退出函数TerminateProcess退出所述当前程序。本发明实施例中,通过检测当前程序是否被调试,当检测到该当前程序确定被调试时,会根据编写好的线程功能函数退出程序,提高了程序的安全性。
在一种可能的实施例中,所述确定当前程序是否被调试包括:通过调用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模块的内存地址。
本发明实施例的第二方面提供了一种程序退出设备,包括:编写单元,根据Windows系统的应用程序编程接口API中的ThreadProc函数编写线程功能函数,所述ThreadProc函数的输入参数包括应用程序退出函数TerminateProcess,所述线程功能函数用于调用所述程序退出函数TerminateProcess;调用单元,用于通过调用所述API中的CreatThread函数创建至少一个线程函数,所述CreatThread函数至少包括lpStartAddress参数和dwCreationFlags参数,所述lpStartAddress参数用于表示指向所述线程函数的指针,所述dwCreationFlags参数用于表示创建的线程的标识信息;判断单元,用于确定当前程序是否被调试;所述调用单元还用于,若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以根据所述程序退出函数TerminateProcess退出所述当前程序。本发明实施例中,通过判断单元检测当前程序是否被调试,当判断单元检测到该当前程序确定被调试时,调用单元会根据编写好的线程功能函数退出程序,提高了程序的安全性。
在一种可能的实施例中,所述判断单元包括:获取模块,用于通过调用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模块的内存地址。
本发明第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述任意一项所述的程序退出的方法的步骤。
本发明第四方面提供了一种计算机可读存储介质,其上存储有计算机管理类程序,其特征在于:所述计算机管理类程序被处理器执行时实现如上述任意一项所述的程序退出的方法的步骤。
从以上技术方案可以看出,本发明实施例具有以下优点:根据Windows系统的应用程序编程接口API中的ThreadProc函数编写线程功能函数,所述ThreadProc函数的输入参数包括应用程序退出函数TerminateProcess,所述线程功能函数用于调用所述程序退出函数TerminateProcess;通过调用所述API中的CreatThread函数创建至少一个线程函数,所述CreatThread函数至少包括lpStartAddress参数和dwCreationFlags参数,所述lpStartAddress参数用于表示指向所述线程函数的指针,所述dwCreationFlags参数用于表示创建的线程的标识信息;确定当前程序是否被调试;若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以根据所述程序退出函数TerminateProcess退出所述当前程序。本发明实施例中,通过检测当前程序是否被调试,当检测到该当前程序确定被调试时,会根据编写好的线程功能函数退出程序,提高了程序的安全性。
附图说明
图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来获取进程信息,从而可以判断当前进程是否被调试。
其中函数原型如下:
本发明实施例中,则可以通过传入参数InformationClass为ProcessDebugPort来获取进程是否被调试。
NtQueryInformationProcess(GetCurrentProcess(),ProcessDebugPort,&debugPort,sizeof(debugPort),NULL);
其中NtQueryInformationProcess函数的第一个参数表示传入当前进程的句柄,则可以通过调用系统API函数GetCurrentProcess来获取。
NtQueryInformationProcess函数的第二个参数ProcessDebugPort表示获取当前进程是否被调试。
NtQueryInformationProcess函数的第三个参数则是获取的结果缓存区,从而最终结果数据则会存储在变量debugPort中。
最终调用完成此NtQueryInformationProcess函数后,则可以通过判断变量debugPort来确定当前程序是否被调试器调试,如果变量debugPort的值为0则说明当前程序没有被调试,如果变量debugPort的值为1则说明当前程序有被调试。
102、编写线程功能函数,并根据线程功能函数创建至少一个进程;
当程序在运行时,如果本文检测到当前程序被黑客在调试,那么在步骤101中编写的检测调试接口函数发现当前程序正在被调试。本发明实施例中,为了阻止黑客继续调试,则会终止当前程序,从而防止黑客继续调试逆向分析。本文则会编写程序退出的方法。具体地,本发明实施例中,会创建一个线程或者多个线程功能函数,然后在创建的线程函数中调用程序退出函数,从而实现程序的退出。通过创建线程的方式则更具有隐蔽性。具体实现如下:
首先编写线程功能函数
本发明实施例中,可以通过系统提供的API函数CreateThread来创建线程。
其CreateThread函数原型如下:
其中:
参数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,则此线程会执行此函数的功能,而在此函数中则会调用退出当前程序的函数,从而实现退出程序的目的。
需要说明的是,本发明实施例中,可以同时编写创建多个线程,每个线程都用于调用系统的退出进程的功能,从而实现退出程序的功能。
103、确定当前程序是否被调试;
若当前程序在运行时,通过步骤101编写的检测调试接口函数确定当前程序是否被调试器调试。若通过检测调试接口函数确定当前程序被调试,则执行步骤104;若通过检测调试接口函数确定当前程序没有被调试,则执行其他步骤,例如继续运行当前程序等。
104、若当前程序被调试,则根据线程功能函数调用程序退出函数,以退出当前程序。
若在步骤103中,确定当前程序被调试,则为了阻止黑客继续调试,本发明实施例中会终止运行当程序,从而防止黑客继续调试逆向分析。具体地,根据线程功能调用程序退出函数,从而将被调试的当前程序进行退出,阻止黑客继续调试。
需要说明的是,本发明实施例中,除了通过步骤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:本发明实施例中,还可以通过编写一处代码,然后在此代码中会产生错误,从而导致程序产生异常,并退出当前程序。同时,为了进一步的提高退出程序的隐蔽性,本文则编写一个循环来分配内存,不断的分配内存,然后往内存中写入数据,直到内存分配失败,导致写入分配失败的内存数据使得程序产生异常从而退出程序。具体实现如下:
While(true)
{
本发明实施例中,编写一个while循环,此while循环则不会退出,一直执行,直到程序产生异常,从而导致程序崩溃,直接退出程序。
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()则会导致程序异常,产生崩溃,从而起到了程序退出的功能。
需要说明的是,本发明实施例中,可以采用随机策略来调用上述各退出程序的方法,从而将被调试的程序进行退出,阻止黑客继续调试。也可以采用多种方法组合的方式,即使用多种退出程序的方法的结合,使得程序退出有更多的随机性,提高黑客分析的门槛。因此,本发明实施例中,采用的退出程序的方法具体此处不做限定。
本发明实施例中,通过检测当前程序是否被调试,当检测到该当前程序确定被调试时,会根据编写好的线程功能函数退出程序,提高了程序的安全性。
上面从程序退出的方法的角度对本发明实施例进行了描述,下面从程序退出设备的角度对本发明实施例进行描述。
请参阅图2,图2为本发明实施例提供的一种可能的程序退出设备的实施例示意图,该程序退出设备,具体包括:
编写单元201,用于根据Windows系统的应用程序编程接口API中的ThreadProc函数编写线程功能函数,所述ThreadProc函数的输入参数包括应用程序退出函数TerminateProcess,所述线程功能函数用于调用所述程序退出函数TerminateProcess;
调用单元203,用于通过调用所述API中的CreatThread函数创建至少一个线程函数,所述CreatThread函数至少包括lpStartAddress参数和dwCreationFlags参数,所述lpStartAddress参数用于表示指向所述线程函数的指针,所述dwCreationFlags参数用于表示创建的线程的标识信息;
判断单元202,用于确定当前程序是否被调试;
所述调用单元203,还用于若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以根据所述程序退出函数TerminateProcess退出所述当前程序。
可选的,在一些可能的实现方式中,所述判断单元202包括:
获取模块2021,用于通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;
确定模块2022,用于当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。
可选的,在一些可能的实现方式中,所述判断单元202包括:
所述获取模块,用于加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;
所述确定模块,用于根据所述当前进程的信息确定所述当前程序是否被调试。
可选的,在一些可能的实现方式中,所述获取模块具体用于:
通过调用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时实现以下步骤:根据Windows系统的应用程序编程接口API中的ThreadProc函数编写线程功能函数,所述ThreadProc函数的输入参数包括应用程序退出函数TerminateProcess,所述线程功能函数用于调用所述程序退出函数TerminateProcess;通过调用所述API中的CreatThread函数创建至少一个线程函数,所述CreatThread函数至少包括lpStartAddress参数和dwCreationFlags参数,所述lpStartAddress参数用于表示指向所述线程函数的指针,所述dwCreationFlags参数用于表示创建的线程的标识信息;确定当前程序是否被调试;若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以根据所述程序退出函数TerminateProcess退出所述当前程序。
可选的,在一种可能的实施例中,所述处理器具体用于:
通过调用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被处理器执行时实现如下步骤:根据Windows系统的应用程序编程接口API中的ThreadProc函数编写线程功能函数,所述ThreadProc函数的输入参数包括应用程序退出函数TerminateProcess,所述线程功能函数用于调用所述程序退出函数TerminateProcess;通过调用所述API中的CreatThread函数创建至少一个线程函数,所述CreatThread函数至少包括lpStartAddress参数和dwCreationFlags参数,所述lpStartAddress参数用于表示指向所述线程函数的指针,所述dwCreationFlags参数用于表示创建的线程的标识信息;确定当前程序是否被调试;若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以根据所述程序退出函数TerminateProcess退出所述当前程序。
可选的,在一种可能的实施例中,该计算机程序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.一种程序退出的方法,其特征在于,包括:
根据Windows系统的应用程序编程接口API中的ThreadProc函数编写线程功能函数,所述ThreadProc函数的输入参数包括应用程序退出函数TerminateProcess,所述线程功能函数用于调用所述程序退出函数TerminateProcess;
通过调用所述API中的CreatThread函数创建至少一个线程函数,所述CreatThread函数至少包括lpStartAddress参数和dwCreationFlags参数,所述lpStartAddress参数用于表示指向所述线程函数的指针,所述dwCreationFlags参数用于表示创建的线程的标识信息;
确定当前程序是否被调试;
若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以根据所述程序退出函数TerminateProcess退出所述当前程序。
2.根据权利要求1所述的方法,其特征在于,所述确定当前程序是否被调试包括:
通过调用所述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.一种程序退出设备,其特征在于,包括:
编写单元,根据Windows系统的应用程序编程接口API中的ThreadProc函数编写线程功能函数,所述ThreadProc函数的输入参数包括应用程序退出函数TerminateProcess,所述线程功能函数用于调用所述程序退出函数TerminateProcess;
调用单元,用于通过调用所述API中的CreatThread函数创建至少一个线程函数,所述CreatThread函数至少包括lpStartAddress参数和dwCreationFlags参数,所述lpStartAddress参数用于表示指向所述线程函数的指针,所述dwCreationFlags参数用于表示创建的线程的标识信息;
判断单元,用于确定当前程序是否被调试;
所述调用单元还用于,若所述当前程序被调试,则根据所述至少一个线程调用所述线程功能函数,以根据所述程序退出函数TerminateProcess退出所述当前程序。
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任意一项所述的方法。
CN201810728160.6A 2018-07-05 2018-07-05 一种程序退出的方法及相关设备 Pending CN109117631A (zh)

Priority Applications (1)

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

Applications Claiming Priority (1)

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

Publications (1)

Publication Number Publication Date
CN109117631A true CN109117631A (zh) 2019-01-01

Family

ID=64821937

Family Applications (1)

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

Country Status (1)

Country Link
CN (1) CN109117631A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111427623A (zh) * 2020-03-20 2020-07-17 北京奇艺世纪科技有限公司 程序退出方法、装置、计算机设备和存储介质

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101266550A (zh) * 2007-12-21 2008-09-17 北京大学 一种恶意代码检测方法
CN104809392A (zh) * 2015-04-29 2015-07-29 浪潮电子信息产业股份有限公司 一种基于Windows进程的系统性保护方法及装置
CN105677407A (zh) * 2008-09-09 2016-06-15 联想(北京)有限公司 应用程序关闭方法和装置
CN106020958A (zh) * 2016-05-17 2016-10-12 北京金山安全软件有限公司 一种获取文件占用进程的方法、装置及电子设备
CN106778098A (zh) * 2015-11-24 2017-05-31 中国移动通信集团公司 一种安卓系统应用程序的保护方法和装置
CN106778104A (zh) * 2017-01-20 2017-05-31 武汉斗鱼网络科技有限公司 一种应用程序的反调试方法和系统
CN107463836A (zh) * 2017-08-17 2017-12-12 郑州云海信息技术有限公司 一种Windows系统下的综合反调试方法及系统
CN108184146A (zh) * 2018-01-12 2018-06-19 武汉斗鱼网络科技有限公司 一种计算直播平台人气的方法及相关设备

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101266550A (zh) * 2007-12-21 2008-09-17 北京大学 一种恶意代码检测方法
CN105677407A (zh) * 2008-09-09 2016-06-15 联想(北京)有限公司 应用程序关闭方法和装置
CN104809392A (zh) * 2015-04-29 2015-07-29 浪潮电子信息产业股份有限公司 一种基于Windows进程的系统性保护方法及装置
CN106778098A (zh) * 2015-11-24 2017-05-31 中国移动通信集团公司 一种安卓系统应用程序的保护方法和装置
CN106020958A (zh) * 2016-05-17 2016-10-12 北京金山安全软件有限公司 一种获取文件占用进程的方法、装置及电子设备
CN106778104A (zh) * 2017-01-20 2017-05-31 武汉斗鱼网络科技有限公司 一种应用程序的反调试方法和系统
CN107463836A (zh) * 2017-08-17 2017-12-12 郑州云海信息技术有限公司 一种Windows系统下的综合反调试方法及系统
CN108184146A (zh) * 2018-01-12 2018-06-19 武汉斗鱼网络科技有限公司 一种计算直播平台人气的方法及相关设备

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
BEYONDTECHNOLOGY: "多线程CreateThread函数的用法及注意事项", 《HTTPS://WWW.CNBLOGS.COM/BEYONDTECHNOLOGY/ARCHIVE/2010/08/30/1813082.HTML》 *
CHINABINLANG: "创建进程CreateProcess,结束进程 TerminateProcess", 《HTTPS://BLOG.CSDN.NET/CHINABINLANG/ARTICLE/DETAILS/47804063,CHINABINLANG》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111427623A (zh) * 2020-03-20 2020-07-17 北京奇艺世纪科技有限公司 程序退出方法、装置、计算机设备和存储介质
CN111427623B (zh) * 2020-03-20 2023-06-30 北京奇艺世纪科技有限公司 程序退出方法、装置、计算机设备和存储介质

Similar Documents

Publication Publication Date Title
US10180896B2 (en) System and method of debugging multi-threaded processes
US9223964B2 (en) Detecting JAVA sandbox escaping attacks based on JAVA bytecode instrumentation and JAVA method hooking
US9146833B2 (en) System and method for correct execution of software based on a variance between baseline and real time information
TWI612439B (zh) 用以偵測未經授權之記憶體存取的計算裝置、方法及機器可讀儲存媒體
CN109840410A (zh) 一种进程内数据隔离与保护的方法和系统
US10013553B2 (en) Protecting software application
CN104715202B (zh) 一种虚拟机中的隐藏进程检测方法和装置
CN102722672B (zh) 一种检测运行环境真实性的方法及装置
JP6984710B2 (ja) コンピュータ装置およびメモリ管理方法
JP2012118884A (ja) プロセッサ及び半導体装置
US9514028B2 (en) System and method for determining correct execution of software based on baseline and real time trace events
CN107239698A (zh) 一种基于信号处理机制的反调试方法和装置
WO2023035751A1 (zh) 移动端应用的智能混淆
CN109324952A (zh) 一种基于内存映射文件检测进程实例个数的方法及装置
EP2047366A1 (en) A method of dynamic protection of data during the execution of a software code in intermediate language in a digital apparatus
CN109117631A (zh) 一种程序退出的方法及相关设备
JP2008234248A (ja) プログラム実行装置及びプログラム実行方法
US9003236B2 (en) System and method for correct execution of software based on baseline and real time information
CN106127054B (zh) 一种面向智能设备控制指令的系统级安全防护方法
US8707306B1 (en) Implementing user-selectable concurrent access protection mechanism in a multi-tasking modeling environment
US8925077B2 (en) Mobile devices with inhibited application debugging and methods of operation
CN110750782B (zh) 一种程序退出的方法及相关设备
JP2012008825A (ja) プログラム難読化装置、プログラム制御装置、プログラム難読化方法及びプログラム
CN106021106B (zh) 一种进程控制方法及用户终端
GB2450505A (en) Authorised debugging

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
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20190101