CN109117201A - 一种程序退出的方法及相关设备 - Google Patents
一种程序退出的方法及相关设备 Download PDFInfo
- Publication number
- CN109117201A CN109117201A CN201810728297.1A CN201810728297A CN109117201A CN 109117201 A CN109117201 A CN 109117201A CN 201810728297 A CN201810728297 A CN 201810728297A CN 109117201 A CN109117201 A CN 109117201A
- Authority
- CN
- China
- Prior art keywords
- function
- calling
- synchronization
- encryption
- program
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44594—Unloading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/526—Mutual exclusion algorithms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Storage Device Security (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例公开了一种程序退出的方法及相关设备,用于在程序被调试时,将程序改造,使得对程序的破坏更大,更无法恢复,以提高程序的安全性。本发明实施例方法包括:将加解密函数的关键数据和同步互斥锁保存到全局变量,所述加解密函数用于在进行网络协议通信时对数据进行加解密操作,所述同步互斥锁用于对所述数据进行加锁;通过调用Windows系统的应用程序编程接口API中的LoadLibraryA函数获取核心代码的内存地址;通过调用所述API中的GetModuleInformation函数获取所述核心代码的占用内存大小,以将所述核心代码保存到所述全局变量;确定当前程序是否被调试;若所述当前程序被调试,则修改所述加解密函数的关键数据,通过调用循环函数占用所述同步互斥锁,并删除所述核心代码,以退出所述当前程序。
Description
技术领域
本发明涉及控制技术领域,尤其涉及一种程序退出的方法及相关设备。
背景技术
目前,对于Windows平台开发的一部分软件来说,需要对软件的安全性进行保护,例如一些只有注册才能使用的软件、电影游戏程序或者收费软件等,这些软件都希望能安全的运行与用户电脑上,另外,最重要的则是防止黑客破解软件中的收费功能,或者破解软件的安全算法,以避免软件开发厂商的损失。对于黑客来说,通常首先是通过对软件的破解,然后才是利用破解的漏洞来获得利益。而黑客破解软件则是先通过使用一些调试器来调试程序,从而弄清楚软件的安全策略以及实现原理。
因此,对于任何客户端软件来说,检测当前客户端程序是否有被调试是比较重要的,能阻止黑客进行调试,保护软件不被破解。故,如何检测软件是否被调试,同时如何在检测到被调试后强行退出程序以防止黑客进一步调试是一个急需解决的问题。
而在现有技术中,程序的退出大多通过调用系统应用程序编程接口(applicationprogramming interface,API)函数来实现,然而黑客可以通过HOOK相关的API函数,而在调用相关退出进程的API时进行拦截,使得程序不会退出,实现了绕过程序被退出的可能性。而基于调用系统API函数来退出终止程序,一旦被黑客所拦截或者HOOK从而程序还可以继续运行。因此如何在程序被调试时,能够更大程度的破坏程序使其无法恢复,是当前一个较为重要的课题。
发明内容
本发明实施例提供了一种程序退出的方法及相关设备,用于在程序被调试时,将程序改造,使得对程序的破坏更大,更无法恢复,以提高程序的安全性。
本发明实施例的第一方面提供了一种程序退出的方法,包括:将加解密函数的关键数据和同步互斥锁保存到全局变量,所述加解密函数用于在进行网络协议通信时对数据进行加解密操作,所述同步互斥锁用于对所述数据进行加锁,所述关键数据为执行所述加解密函数所必需的数据;通过调用Windows系统的应用程序编程接口API中的LoadLibraryA函数获取核心代码的内存地址;通过调用所述API中的GetModuleInformation函数获取所述核心代码的占用内存大小,以将所述核心代码保存到所述全局变量;确定当前程序是否被调试;若所述当前程序被调试,则修改所述加解密函数的关键数据,通过调用循环函数占用所述同步互斥锁,并删除所述当前程序的核心代码,以退出所述当前程序。
在一种可能的实施例中,所述将加解密函数的关键数据和同步互斥锁保存到全局变量包括:将所述加解密函数的关键数据保存到g_kCrc32Table全局变量中;通过调用系统API函数CreatMutex创建所述同步互斥锁;当所述同步互斥锁被使用时,通过调用API函数WaitForSingleObject等待所述同步互斥锁;将所述同步互斥锁保存到g_hMutex全局变量中。
在一种可能的实施例中,所述确定当前程序是否被调试包括:通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。
在一种可能的实施例中,所述确定当前程序是否被调试包括:加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;调用所述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中的LoadLibraryA函数获取核心代码的内存地址;通过调用所述API中的GetModuleInformation函数获取所述核心代码的占用内存大小,以将所述核心代码保存到所述全局变量;判断单元,用于确定当前程序是否被调试;执行单元,用于若所述当前程序被调试,则修改所述加解密函数的关键数据,通过调用循环函数占用所述同步互斥锁,并删除所述当前程序的核心代码,以退出所述当前程序。
在一种可能的实施例中,所述保存单元包括:保存模块,用于将所述加解密函数的关键数据保存到g_kCrc32Table全局变量中;第一调用模块,用于通过调用系统API函数CreatMutex创建所述同步互斥锁;当所述同步互斥锁被使用时,通过调用API函数WaitForSingleObject等待所述同步互斥锁;所述保存模块还用于将所述同步互斥锁保存到g_hMutex全局变量中。
在一种可能的实施例中,所述获取单元包括:第二调用模块,用于通过调用Windows系统的应用程序编程接口API中的LoadLibraryA获取所述核心代码的内存地址;通过调用API中的GetModuleInformation获取所述核心代码的占用内存大小。
本发明第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述任意一项所述的程序退出的方法的步骤。
本发明第四方面提供了一种计算机可读存储介质,其上存储有计算机管理类程序,其特征在于:所述计算机管理类程序被处理器执行时实现如上述任意一项所述的程序退出的方法的步骤。
从以上技术方案可以看出,本发明实施例具有以下优点:将加解密函数的关键数据和同步互斥锁保存到全局变量,所述加解密函数用于在进行网络协议通信时对数据进行加解密操作,所述同步互斥锁用于对所述数据进行加锁,所述关键数据为执行所述加解密函数所必需的数据;通过调用Windows系统的应用程序编程接口API中的LoadLibraryA函数获取核心代码的内存地址;通过调用所述API中的GetModuleInformation函数获取所述核心代码的占用内存大小,以将所述核心代码保存到所述全局变量;确定当前程序是否被调试;若所述当前程序被调试,则修改所述加解密函数的关键数据,通过调用循环函数占用所述同步互斥锁,并删除所述当前程序的核心代码,以退出所述当前程序。
附图说明
图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、将当前程序使用的加解密函数的关键数据保存到全局变量中;
可以理解的是,在进行协议传输时都会对协议包进行加解密,因此每次与服务器进行网络协议通信时都会调用加解密函数来对数据进行加解密操作,而加解密函数中又会使用到一些关键数据,故本发明实施例中,会将这些关键数据保存到全局变量中,以使得后续可以通过修改加解密函数的关键数据来造成程序不可修复的异常,从而使得程序退出。
需要说明的是,通过修改基础功能函数,即本发明实施例的加解密函数,使得与服务器的交换和校验都不会被通过,从而服务器也会拒绝客户端的任何操作,因此客户端程序无法继续执行,使得程序的退出更为隐蔽。
由于通常的程序都会使用到CRC32函数,本发明实施例中,可将CRC32函数中使用到的变量保存到全局变量中。其中,UpdateCrc32接口即为CRC32的函数接口,具体函数原理如下:
其中在此UpdateCrc32接口中会使用到一个表格kCrc32Table,表格kCrc32Table的大小是256个字节,此表格的数据是通过一定的公式进行计算所得。一旦计算完成后,后续凡是调用UpdateCrc32函数时,都会使用到此表格kCrc32Table。因此本发明实施例中,可将此表格保存到一个全局变量中g_kCrc32Table。
103、创建并保存同步互斥锁;
另外,在一个程序中,为了提高程序的效率,通常都会编写多线程来提高程序的效率。那么在多线程程序中,多个线程会有数据交互,因此需要使用到同步互斥锁来对数据进行加锁,以防止多个线程同时访问同一个数据,而造成数据污染。需要说明的是,如果一个线程调用了锁,那么此时其他线程再次调用该锁时,只有等到第一个线程释放了该锁,才会获取到锁,否则其他线程会一直等待。
具体实现如下:
HANDLE hMutex=CreateMutex(NULL,FALSE,NULL);
通过调用系统API函数CreateMutex来实现创建一个互斥锁。
其函数原型如下:
创建完成后,则会调用获取锁。
WaitForSingleObject(hMutex,INFINITE);
通过调用系统API函数WaitForSingleObject来等待锁。
函数WaitForSingleObject的函数原型如下:
DWORD WaitForSingleObject(
HANDLE hObject,//指明一个内核对象的句柄
DWORD dwMilliseconds//等待时间
);
需要说明的是,如果该同步互斥锁没被使用则可以直接获取到;否则则会一直等待在此锁上。本发明实施例中,将这样的同步互斥锁保存到全局变量g_hMutex中。
104、将内存中的核心代码保存到全局变量中;
需要说明的是,对于一个程序来说,一定有一些核心的代码,且这些核心代码会关系到程序的执行。例如,本发明实施例中,当应用于直播平台时,核心代码可以是视频编解码的功能,也可以是消息分发的基础模块,也可以是网络模块用于接收网络数据等,具体此处不做限定。那么在本发明实施例中,可以先获取这些模块的代码并保存到全局变量中,以使得后续如果检测到程序被调试器调试时,则可以将内存中的核心代码删除掉,从而导致程序如果再次执行到核心代码则会导致程序出错,以达到退出程序的目的。
具体实现如下:
HMODULE LoadLibraryA(LPCSTR lpLibFileName);
通过系统API函数LoadLibraryA来加载和获取net.dll。
其中传入参数LPCSTR lpLibFileName用于表示需要获取的dll的名称。
该函数的返回即为该dll在内存中的核心代码地址。
HMODULE hmodule=LoadLibraryA(“net.dll”);
其中net.dll用于表示核心代码。
其中hmodule用于表示核心代码在内存中的地址。
本发明实施例中,再通过调用系统API函数GetModuleInformation来获取核心代码在内存中的大小。
系统API函数GetModuleInformation的函数原型如下:
BOOL WINAPI GetModuleInformation(
HANDLE hProcess,
HMODULE hModule,
LPMODULEINFO lpmodinfo,
DWORD cb
);
其中参数hProcess用于表示当前进程的句柄。
其中参数hModule用于表示需要获取核心代码信息的模块的句柄。
其中参数lpmodinfo用于表示指向MODULEINFO结构的指针,该结构将会储存关于核心代码的信息。
其中参数cb结构用于表示MODULEINFO的大小(以字节计算)。
GetModuleInformation(GetCurrentProcess(),hmodule,lpmodinfo,cb);
再通过调用GetModuleInformation函数将最终获取的核心代码信息存储在lpmodinfo结构中。
其中lpmodinfo.dwSizeOfImage的属性则存储了核心代码在内存中的大小。
G_netdll_Address=hModule;
将核心代码在内存中的地址存储到全局变量G_netdll_Address中;
G_netdll_size=lpmodinfo.dwSizeOfImage;
将核心代码在内存中的大小存储到全局变量G_netdll_size中。
因此通过上述方式,本发明实施例获取了核心代码在内存中的地址和大小,并将该核心代码保存到全局变量中。
需要注意的是,本发明实施例中,通过步骤102实现将当前程序使用的加解密函数的关键数据保存到全局变量中,通过步骤103创建并保存同步互斥锁,通过步骤104将内存中的核心代码保存到全局变量中,而这三个过程并不存在时序关系,即可以按照步骤102-步骤103-步骤104的时序执行,或者步骤104-步骤102-步骤103的时序执行,或者步骤102-步骤104-步骤103的时序执行等,或者同时执行等,具体此处不做限定。
105、确定当前程序是否被调试;
若当前程序在运行时,通过步骤101编写的检测调试接口函数确定当前程序是否被调试器调试。若通过检测调试接口函数确定当前程序被调试,则执行步骤106;若通过检测调试接口函数确定当前程序没有被调试,则执行其他步骤,例如继续运行当前程序等。
106、修改加解密函数的关键数据;
当前程序在运行时,如果通过步骤101的检测调试接口函数确定当前进程正在被调试时,为了阻止黑客继续调试则会想办法终止当前程序,从而防止黑客继续调试逆向分析。本发明实施例中,可以修改步骤102中保存的全局变量来造成程序不可恢复的错误,从而使得程序进行退出。对应于步骤102,具体修改方式如下:由于在步骤102中,通过全局变量g_kCrc32Table来保持CRC32的计算表格kCrc32Table,并且每次调用CRC32函数时都会使用此表格kCrc32Table,那么在确定到当前程序正在被调试器调试时,则会将表格kCrc32Table的数据进行修改,从而使得后续所有计算CRC32时都会计算出错,引起当前程序的连锁反应,最终导致当前程序异常退出,达到了退出程序的目的。需要说明的是,具体修改kCrc32Table表格的方式可为将g_kCrc32Table中的数值全部赋值为0,也可以将g_kCrc32Table中的数值随意的修改成随机数据,具体此处不做限定。
107、占用同步互斥锁;
另外,由于在编写多线程的代码中肯定会用到同步互斥锁,本发明实施例通过步骤103将同步互斥锁保存到全局变量中g_hMutex。因此,当检测到当前程序被调试器调试时,可以独占互斥该同步互斥锁,并且不进行释放,从而使得当前程序中其他逻辑如果需要同步互斥锁时,会持续等待,导致当前程序无法继续执行,使得当前程序死锁或者卡死,从而达到了退出程序的目的。
本发明实施例中,可以通过编写一个While循环来独占该同步互斥锁,具体如下:
需要说明的是,本发明实施例中,还可以采用其他方式独占该同步互斥锁,具体此处不做限定。
108、删除内存中的核心代码。
需要说明的是,通过步骤104编写的代码实现了获取当前程序的核心代码的内存地址和大小的目的。由于核心代码是当前程序一直需要执行的,如果内存中的核心代码被删除,那么当前程序在执行时,会读取无法识别的代码,导致当前程序崩溃。从而达到了本发明实施例的退出程序的目的。并且内存代码一旦删除,则无法进行恢复,只能重新启动当前程序。具体实现如下:
由于核心代码在内存中所属的内存区域是被保护只能够读取和执行的权限,是没有办法被修改的权限。然而系统函数中提供了一个API函数可以修改内存区域的属性,从而可以将该核心代码的内存区域属性修改成可以写的权限,从而可以修改内存代码,具体的,Windows系统提供了VirtualProtect这个接口来修改内存的属性。
其函数原型如下:
其中参数lpAddress,用于表示要改变属性的内存起始地址;
其中参数dwSize,用于表示要改变属性的内存区域大小;参数flNewProtect,表示内存新的属性类型,PAGE_EXECUTE_READWRITE(0x40)时该内存页为可读可写可执行,
即需要修改成PAGE_EXECUTE_READWRITE使得可以读写可以执行。
参数pflOldProtect,用于表示内存原始属性类型保存地址。
若修改内存属性成功,则函数返回任意非0值,修改失败时返回0。
VirtualProtect(G_netdll_Address,G_netdll_size,PAGE_EXECUTE_READWRITE,dwOld);
其中传入地址为步骤103保存的核心代码的内存地址G_netdll_Address,核心代码的大小则为G_netdll_size。
修改了内存属性后,本文则可以对该段修改后的内存进行操作。例如,本发明实施例可以编写一个循环来将内存代码全部清空为0,从而代码后续无法执行,具体如下:
For(int I=0;I<G_netdll_size;i++)
{
G_netdll_Address[i]=0;
}
需要注意的是,本发明实施例中,通过步骤106修改加解密函数的关键数据,通过步骤107占用同步互斥锁,通过步骤108删除内存中的核心代码,而这三个过程并不存在时序关系,即可以按照步骤106步骤107-步骤108的时序执行,或者步骤108-步骤106-步骤107的时序执行,或者步骤107-步骤108-步骤106的时序执行等,或者同时执行等,具体此处不做限定。
本发明实施例中,一旦检测到程序被调试,则对程序进行修改,使得程序被破坏,破坏程序的内存数据,内存代码,从而程序无法继续运行,从而达到了退出程序的目的。通过破坏程序数据和代码,从而程序可能在任意时刻导致程序崩溃,无法继续运行。同时为了更好更大程度的破坏程序,所以本文会刻意的将程序进行改造,使得程序的破坏会更大,更无法恢复,也更隐蔽不被察觉。同时对于程序的破坏则需要一些技巧,使得程序破坏更具有随机性和动态变化性
上面从程序退出的方法的角度对本发明实施例进行了描述,下面从程序退出设备的角度分别对本发明实施例进行描述。
请参阅图2,图2为本发明实施例提供的一种可能的程序退出设备的实施例示意图,该程序退出设备,具体包括:
保存单元201,用于将加解密函数的关键数据和同步互斥锁保存到全局变量,所述加解密函数用于在进行网络协议通信时对数据进行加解密操作,所述同步互斥锁用于对所述数据进行加锁;
获取单元202,用于通过调用Windows系统的应用程序编程接口API中的LoadLibraryA函数获取核心代码的内存地址;通过调用所述API中的GetModuleInformation函数获取所述核心代码的占用内存大小,以将所述核心代码保存到所述全局变量;
判断单元203,用于确定当前程序是否被调试;
执行单元204,用于若所述当前程序被调试,则修改所述加解密函数的关键数据,通过调用循环函数占用所述同步互斥锁,并删除所述核心代码,以退出所述当前程序。
可选的,在一些可能的实现方式中,所述保存单元201包括:
保存模块2011,用于将所述加解密函数的关键数据保存到g_kCrc32Table全局变量中;
第一调用模块2012,用于通过调用系统API函数CreatMutex创建所述同步互斥锁;当所述同步互斥锁被使用时,通过调用API函数WaitForSingleObject等待所述同步互斥锁;
所述保存模块2011还用于将所述同步互斥锁保存到g_hMutex全局变量中。
可选的,在一些可能的实现方式中,所述获取单元202包括:
第二调用模块2021,用于通过调用Windows系统的应用程序编程接口API中的LoadLibraryA获取所述核心代码的内存地址;通过调用API中的GetModuleInformation获取所述核心代码的占用内存大小。
请参阅图3,图3为本发明实施例提供的电子设备的实施例示意图。
如图3所示,本发明实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:将加解密函数的关键数据和同步互斥锁保存到全局变量,所述加解密函数用于在进行网络协议通信时对数据进行加解密操作,所述同步互斥锁用于对所述数据进行加锁;通过调用Windows系统的应用程序编程接口API中的LoadLibraryA函数获取核心代码的内存地址;通过调用所述API中的GetModuleInformation函数获取所述核心代码的占用内存大小,以将所述核心代码保存到所述全局变量;确定当前程序是否被调试;若所述当前程序被调试,则修改所述加解密函数的关键数据,通过调用循环函数占用所述同步互斥锁,并删除所述核心代码,以退出所述当前程序。
可选的,在一种可能的实施例中,所述处理器320具体用于:将所述加解密函数的关键数据保存到g_kCrc32Table全局变量中;通过调用系统API函数CreatMutex创建所述同步互斥锁;当所述同步互斥锁被使用时,通过调用API函数WaitForSingleObject等待所述同步互斥锁;将所述同步互斥锁保存到g_hMutex全局变量中。
可选的,在一种可能的实施例中,所述处理器320具体用于:通过调用Windows系统的应用程序编程接口API中的LoadLibraryA获取所述核心代码的内存地址;通过调用API中的GetModuleInformation获取所述核心代码的占用内存大小。
可选的,在一种可能的实施例中,所述处理器320具体用于:通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。
可选的,在一种可能的实施例中,所述处理器320具体用于:加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;根据所述当前进程的信息确定所述当前程序是否被调试。
可选的,在一种可能的实施例中,所述处理器320具体用于:通过调用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中的LoadLibraryA函数获取核心代码的内存地址;通过调用所述API中的GetModuleInformation函数获取所述核心代码的占用内存大小,以将所述核心代码保存到所述全局变量;确定当前程序是否被调试;若所述当前程序被调试,则修改所述加解密函数的关键数据,通过调用循环函数占用所述同步互斥锁,并删除所述核心代码,以退出所述当前程序。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:将所述加解密函数的关键数据保存到g_kCrc32Table全局变量中;通过调用系统API函数CreatMutex创建所述同步互斥锁;当所述同步互斥锁被使用时,通过调用API函数WaitForSingleObject等待所述同步互斥锁;将所述同步互斥锁保存到g_hMutex全局变量中。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过调用Windows系统的应用程序编程接口API中的LoadLibraryA获取所述核心代码的内存地址;通过调用API中的GetModuleInformation获取所述核心代码的占用内存大小。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。
可选的,在一种可能的实施例中,该计算机程序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中的LoadLibraryA函数获取核心代码的内存地址;
通过调用所述API中的GetModuleInformation函数获取所述核心代码的占用内存大小,以将所述核心代码保存到所述全局变量;
确定当前程序是否被调试;
若所述当前程序被调试,则修改所述加解密函数的关键数据,通过调用循环函数占用所述同步互斥锁,并删除所述当前程序的核心代码,以退出所述当前程序。
2.根据权利要求1所述的方法,其特征在于,所述将加解密函数的关键数据和同步互斥锁保存到全局变量包括:
将所述加解密函数的关键数据保存到g_kCrc32Table全局变量中;
通过调用系统API函数CreatMutex创建所述同步互斥锁;
当所述同步互斥锁被使用时,通过调用API函数WaitForSingleObject等待所述同步互斥锁;
将所述同步互斥锁保存到g_hMutex全局变量中。
3.根据权利要求1或2所述的方法,其特征在于,所述确定当前程序是否被调试包括:
通过调用Windows系统的应用程序编程接口API中的IsDebuggerPresent函数确定所述当前程序是否被调用;
当所述IsDebuggerPresent函数的返回值为1时,确定所述当前程序被调试;
当所述IsDebuggerPresent函数的返回值为0时,确定所述当前程序未被调试。
4.根据权利要求1或2所述的方法,其特征在于,所述确定当前程序是否被调试包括:
加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口;
调用所述NtQueryInformationProcess接口,得到所述当前进程的信息;
根据所述当前进程的信息确定所述当前程序是否被调试。
5.根据权利要求4所述的方法,其特征在于,所述加载系统的ntdll.dll模块,并根据所述ntdll.dll模块获取NtQueryInformationProcess接口包括:
通过调用API中的LoadLibraryA函数加载所述ntdll.dll模块,所述LoadLibraryA函数的输入参数包括所述ntdll.dll模块的标识信息,所述LoadLibraryA函数的输出参数为所述ntdll.dll模块的内存地址;
通过API中的GetProcAddress函数获取所述NtQueryInformationProcess接口在所述ntdll.dll模块的内存地址,所述GetProcAddress函数的输入函数包括所述ntdll.dll模块的内存地址。
6.一种程序退出设备,其特征在于,包括:
保存单元,用于将加解密函数的关键数据和同步互斥锁保存到全局变量,所述加解密函数用于在进行网络协议通信时对数据进行加解密操作,所述同步互斥锁用于对所述数据进行加锁,所述关键数据为执行所述加解密函数所必需的数据;
获取单元,用于通过调用Windows系统的应用程序编程接口API中的LoadLibraryA函数获取核心代码的内存地址;通过调用所述API中的GetModuleInformation函数获取所述核心代码的占用内存大小,以将所述核心代码保存到所述全局变量;
判断单元,用于确定当前程序是否被调试;
执行单元,用于若所述当前程序被调试,则修改所述加解密函数的关键数据,通过调用循环函数占用所述同步互斥锁,并删除所述当前程序的核心代码,以退出所述当前程序。
7.根据权利要求6所述的程序退出设备,其特征在于,所述保存单元包括:
保存模块,用于将所述加解密函数的关键数据保存到g_kCrc32Table全局变量中;
第一调用模块,用于通过调用系统API函数CreatMutex创建所述同步互斥锁;当所述同步互斥锁被使用时,通过调用API函数WaitForSingleObject等待所述同步互斥锁;
所述保存模块还用于将所述同步互斥锁保存到g_hMutex全局变量中。
8.根据权利要求6所述的程序退出设备,其特征在于,所述获取单元包括:
第二调用模块,用于通过调用Windows系统的应用程序编程接口API中的LoadLibraryA获取所述核心代码的内存地址;通过调用API中的GetModuleInformation获取所述核心代码的占用内存大小。
9.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1-5任意一项所述的方法。
10.一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行如权利要求1-5任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810728297.1A CN109117201B (zh) | 2018-07-05 | 2018-07-05 | 一种程序退出的方法及相关设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810728297.1A CN109117201B (zh) | 2018-07-05 | 2018-07-05 | 一种程序退出的方法及相关设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109117201A true CN109117201A (zh) | 2019-01-01 |
CN109117201B CN109117201B (zh) | 2021-03-16 |
Family
ID=64822866
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810728297.1A Active CN109117201B (zh) | 2018-07-05 | 2018-07-05 | 一种程序退出的方法及相关设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109117201B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109977633A (zh) * | 2019-03-28 | 2019-07-05 | 武汉斗鱼鱼乐网络科技有限公司 | 一种程序保护方法及相关装置 |
CN110287123A (zh) * | 2019-07-03 | 2019-09-27 | 武汉斗鱼鱼乐网络科技有限公司 | 一种绕过ios系统调试检测的方法及装置 |
CN111435314A (zh) * | 2019-01-11 | 2020-07-21 | 武汉瓯越网视有限公司 | 一种不阻塞线程等待异步消息的方法、系统、服务器及存储介质 |
CN112733093A (zh) * | 2021-01-04 | 2021-04-30 | 中国电力科学研究院有限公司 | 基于ring3环对抗的程序行为保护方法、系统及存储介质 |
CN114840847A (zh) * | 2021-02-02 | 2022-08-02 | 武汉斗鱼鱼乐网络科技有限公司 | 在目标进程中安全创建线程的方法、装置、介质及设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101320416A (zh) * | 2008-05-20 | 2008-12-10 | 北京深思洛克数据保护中心 | 一种检测软件处于调试状态的方法和系统 |
US20120266248A1 (en) * | 2011-04-13 | 2012-10-18 | International Business Machines Corporation | Pinpointing security vulnerabilities in computer software applications |
CN107463836A (zh) * | 2017-08-17 | 2017-12-12 | 郑州云海信息技术有限公司 | 一种Windows系统下的综合反调试方法及系统 |
US20170371732A1 (en) * | 2016-06-15 | 2017-12-28 | International Business Machines Corporation | Method for debugging static memory corruption |
-
2018
- 2018-07-05 CN CN201810728297.1A patent/CN109117201B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101320416A (zh) * | 2008-05-20 | 2008-12-10 | 北京深思洛克数据保护中心 | 一种检测软件处于调试状态的方法和系统 |
US20120266248A1 (en) * | 2011-04-13 | 2012-10-18 | International Business Machines Corporation | Pinpointing security vulnerabilities in computer software applications |
US20170371732A1 (en) * | 2016-06-15 | 2017-12-28 | International Business Machines Corporation | Method for debugging static memory corruption |
CN107463836A (zh) * | 2017-08-17 | 2017-12-12 | 郑州云海信息技术有限公司 | 一种Windows系统下的综合反调试方法及系统 |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111435314A (zh) * | 2019-01-11 | 2020-07-21 | 武汉瓯越网视有限公司 | 一种不阻塞线程等待异步消息的方法、系统、服务器及存储介质 |
CN109977633A (zh) * | 2019-03-28 | 2019-07-05 | 武汉斗鱼鱼乐网络科技有限公司 | 一种程序保护方法及相关装置 |
CN110287123A (zh) * | 2019-07-03 | 2019-09-27 | 武汉斗鱼鱼乐网络科技有限公司 | 一种绕过ios系统调试检测的方法及装置 |
CN112733093A (zh) * | 2021-01-04 | 2021-04-30 | 中国电力科学研究院有限公司 | 基于ring3环对抗的程序行为保护方法、系统及存储介质 |
CN112733093B (zh) * | 2021-01-04 | 2024-03-12 | 中国电力科学研究院有限公司 | 基于ring3环对抗的程序行为保护方法、系统及存储介质 |
CN114840847A (zh) * | 2021-02-02 | 2022-08-02 | 武汉斗鱼鱼乐网络科技有限公司 | 在目标进程中安全创建线程的方法、装置、介质及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN109117201B (zh) | 2021-03-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109117201A (zh) | 一种程序退出的方法及相关设备 | |
Bai et al. | Formal modeling and verification of smart contracts | |
CN109643255B (zh) | 在云系统中自动检测分布式并发错误 | |
Bai et al. | Effective static analysis of concurrency {Use-After-Free} bugs in linux device drivers | |
Petrov et al. | Race detection for web applications | |
Musuvathi et al. | Fair stateless model checking | |
US8719801B2 (en) | Timing analysis of concurrent programs | |
US11409630B2 (en) | Systems and methods of formal verification | |
Hendler et al. | A dynamic-sized nonblocking work stealing deque | |
Yang et al. | Making parallel programs reliable with stable multithreading | |
Chang et al. | Detecting atomicity violations for event-driven Node. js applications | |
US8392891B2 (en) | Technique for finding relaxed memory model vulnerabilities | |
Zheng et al. | Park: accelerating smart contract vulnerability detection via parallel-fork symbolic execution | |
CN102708043A (zh) | 静态数据竞争检测和分析 | |
Zhao et al. | Haepg: An automatic multi-hop exploitation generation framework | |
Shirole et al. | Testing for concurrency in UML diagrams | |
US20180107463A1 (en) | Safe loading of dynamic user-defined code | |
CN107239698A (zh) | 一种基于信号处理机制的反调试方法和装置 | |
Tunç et al. | Sound dynamic deadlock prediction in linear time | |
CN109977633A (zh) | 一种程序保护方法及相关装置 | |
US20170061106A1 (en) | Anti-reverse engineering unified process | |
Crincoli et al. | Vulnerable smart contract detection by means of model checking | |
Sinha et al. | Predicting serializability violations: SMT-based search vs. DPOR-based search | |
Caromel et al. | Robust exception handling in an asynchronous environment | |
Agarwal et al. | Nekara: Generalized concurrency testing |
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 |