CN110737892B - 一种针对apc注入的检测方法和相关装置 - Google Patents
一种针对apc注入的检测方法和相关装置 Download PDFInfo
- Publication number
- CN110737892B CN110737892B CN201810803125.6A CN201810803125A CN110737892B CN 110737892 B CN110737892 B CN 110737892B CN 201810803125 A CN201810803125 A CN 201810803125A CN 110737892 B CN110737892 B CN 110737892B
- Authority
- CN
- China
- Prior art keywords
- function
- code
- module
- jump
- ntqueueapcthread
- 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.)
- Active
Links
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/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/566—Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/302—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a software system
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Software Systems (AREA)
- Quality & Reliability (AREA)
- Health & Medical Sciences (AREA)
- Mathematical Physics (AREA)
- General Health & Medical Sciences (AREA)
- Virology (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明实施例公开了一种针对APC注入的检测方法及相关装置。本发明实施例方法包括:调用应用程序编程接口API中的OpenProcess函数以打开当前进程的句柄;调用API中的EnumProcessModule函数获取当前进程中的所有模块的模块信息,模块信息包括内存起始地址、内存结束地址和标识信息;将所有模块的模块信息进行存储得到存储列表,存储列表用于根据内存地址确定内存地址所属的模块;对当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得***函数NtQueueApcThread的回调函数的内存地址;调用API中的GetModuleNameByAddress函数,以根据回调函数的内存地址获取到回调函数的内存地址对应的模块的目标标识信息;若目标标识信息不包含于存储列表,则确定回调函数的内存地址对应的模块为APC注入的非法模块。
Description
技术领域
本发明涉及开发平台领域,尤其涉及一种针对APC注入的检测方法和相关装置。
背景技术
目前,随着Windows平台的越加成熟,基于Windows平台所开发的软件的功能越来越多样化,其中包括一些特殊功能的软件,例如监控某个程序的所有读写文件,监控键盘输入,监控网络流量等等。然而对于Windows平台来说,很多功能都需要通过hook的方式来实现,例如监控一个程序打开的所有文件,则可以通过hook打开的文件的应用程序编程接口(application programming interface,API)函数,从而可以得到该打开的文件的文件名。而这些hook功能的实现都是需要通过注入一个模块到目标进程中,从而目标进程可以执行黑客编写的功能。通常,黑客会使用一些传统的注入方法,例如伪造输入法来注入,远程线程注入,修改导入表注入等,且现有技术中,软件开发商对这些注入方法都进行了检测。
然而,现阶段,黑客使用了一种新的注入方法,该新的注入方法通过异步过程调用(Asynchronous Procedure Call,APC)注入,使得黑客可以利用其实现机制来注入一个模块到目标进程中。因此如何检测出使用APC方式注入模块的方法,是一个亟需解决的问题。
发明内容
本发明实施例提供了一种针对异步过程调用APC注入的检测方法和相关装置,用于检测出黑客是否使用APC方式来注入模块。
本发明实施例的第一方面提供了一种针对APC注入的检测方法,包括:调用应用程序编程接口API中的OpenProcess函数以打开当前进程的句柄;调用所述API中的EnumProcessModule函数获取所述当前进程中的所有模块的模块信息,所述模块信息包括内存起始地址、内存结束地址和标识信息;将所述所有模块的模块信息进行存储得到存储列表,所述存储列表用于根据内存地址确定所述内存地址所属的模块;对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址;调用所述API中的GetModuleNameByAddress函数,以根据所述回调函数的内存地址获取到所述回调函数的内存地址对应的模块的目标标识信息,所述目标标识信息包含于所述所有模块的标识信息;若所述目标标识信息不包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为APC注入的非法模块。
在一种可能的实施例中,所述调用所述API中的EnumProcessModule获取所述当前进程中的所有模块的模块信息包括:遍历所述所有模块的模块信息;调用所述API中的GetModuleFileNameEx函数获取所述所有模块的标识信息;调用所述API中的GetModuleInformation函数获取所述当前进程中所有模块的内存起始地址和内存结束地址。
在一种可能的实施例中,对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址包括:编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述***函数NtQueueApcThread跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述***函数NtQueueApcThread,所述跳转桩代码包括需***的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;备份所述***函数NtQueueApcThread,将所述***函数NtQueueApcThread修改为所述第一跳转代码;当执行到所述***函数NtQueueApcThread时,根据所述第一跳转代码从所述***函数NtQueueApcThread跳转到所述跳转桩代码;根据所述跳转桩代码中的hooklogicfunc函数获取所述***函数NtQueueApcThread的回调函数的内存地址。
在一种可能的实施例中,所述***函数NtQueueApcThread的回调函数为所述***函数NtQueueApcThread的第二个参数。
在一种可能的实施例中,所述根据所述跳转桩代码中的hooklogicfunc函数获取所述***函数NtQueueApcThread的回调函数的内存地址之后,所述方法还包括:执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述***函数NtQueueApcThread;恢复所述程序中所有的线程,继续执行所述***函数NtQueueApcThread。
在一种可能的实施例中,所述将所述***函数NtQueueApcThread修改为所述第一跳转代码包括:调用***API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过***API函数WriteProcessMemory将所述***函数NtQueueApcThread修改为所述第一跳转代码。
在一种可能的实施例中,所述方法还包括:若所述目标标识信息包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为未被APC注入的模块。
本发明实施例的第二方面提供了一种检测装置,包括:调用单元,用于调用应用程序编程接口API中的OpenProcess函数以打开当前进程的句柄;所述调用单元还用于,调用所述API中的EnumProcessModule函数获取所述当前进程中的所有模块的模块信息,所述模块信息包括内存起始地址、内存结束地址和标识信息;存储单元,用于将所述所有模块的模块信息进行存储得到存储列表,所述存储列表用于根据内存地址确定所述内存地址所属的模块;hook单元,用于对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址;所述调用单元还用于,调用所述API中的GetModuleNameByAddress函数,以根据所述回调函数的内存地址获取到所述回调函数的内存地址对应的模块的目标标识信息;确定单元,若所述目标标识信息不包含于所述存储列表,则用于确定所述回调函数的内存地址对应的模块为APC注入的非法模块。
在一种可能的实施例中,所述调用单元具体用于:遍历所述所有模块的模块信息;调用所述API中的GetModuleFileNameEx函数获取所述所有模块的标识信息;调用所述API中的GetModuleInformation函数获取所述当前进程中所有模块的内存起始地址和内存结束地址。
在一种可能的实施例中,所述hook单元具体用于:编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述***函数NtQueueApcThread跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述***函数NtQueueApcThread,所述跳转桩代码包括需***的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;备份所述***函数NtQueueApcThread,将所述***函数NtQueueApcThread修改为所述第一跳转代码;当执行到所述***函数NtQueueApcThread时,根据所述第一跳转代码从所述***函数NtQueueApcThread跳转到所述跳转桩代码;根据所述跳转桩代码中的hooklogicfunc函数获取所述***函数NtQueueApcThread的回调函数的内存地址。
在一种可能的实施例中,所述***函数NtQueueApcThread的回调函数为所述***函数NtQueueApcThread的第二个参数。
在一种可能的实施例中,所述检测装置还包括:跳转单元,用于执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述***函数NtQueueApcThread;恢复单元,用于恢复所述程序中所有的线程,继续执行所述***函数NtQueueApcThread。
在一种可能的实施例中,所述hook单元具体用于:调用***API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过***API函数WriteProcessMemory将所述***函数NtQueueApcThread修改为所述第一跳转代码。
在一种可能的实施例中,所述确定单元还用于:若所述目标标识信息包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为未被APC注入的模块。
本发明第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述任意一项所述的针对APC注入的检测方法的步骤。
本发明第四方面提供了一种计算机可读存储介质,其上存储有计算机管理类程序,其特征在于:所述计算机管理类程序被处理器执行时实现如上述任意一项所述的针对APC注入的检测方法的步骤。
从以上技术方案可以看出,本发明实施例具有以下优点:调用应用程序编程接口API中的OpenProcess函数以打开当前进程的句柄;调用所述API中的EnumProcessModule函数获取所述当前进程中的所有模块的模块信息,所述模块信息包括内存起始地址、内存结束地址和标识信息;将所述所有模块的模块信息进行存储得到存储列表,所述存储列表用于根据内存地址确定所述内存地址所属的模块;对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址;调用所述API中的GetModuleNameByAddress函数,以根据所述回调函数的内存地址获取到所述回调函数的内存地址对应的模块的目标标识信息,所述目标标识信息包含于所述所有函数的标识信息;若所述目标标识信息不包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为APC注入的非法模块。本发明实施例通过在hook代码中加入对当前函数的回调函数的地址进行检测,如果发现回调函数地址所属于的地址不是本进程的合法模块,则说明存在非法模块的注入,从而可以检测到APC的注入。
附图说明
图1为本发明实施例提供的一种可能的针对APC注入的检测方法的流程图;
图2为本发明实施例提供的一种可能的检测装置的结构示意图;
图3为本发明实施例提供的一种可能的电子设备的硬件结构示意图;
图4为本发明实施例提供的一种可能的计算机可读存储介质的硬件结构示意图。
具体实施方式
本发明实施例提供了一种针对异步过程调用APC注入的检测方法及检测装置,用于检测出黑客是否使用APC方式来注入模块。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、***、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
请参阅图1,为本发明实施例提供的一种针对APC注入的检测方法的方法流程图,具体包括:
101、打开当前进程的句柄;
为了检测出黑客是否使用APC方式注入模块,首先需要获取当前进程中加载的所有模块的模块信息,该模块信息包括所有模块的内存起始地址和内存结束地址,以及模块的标识信息,本发明实施例中,该标识信息可以为模块的名称信息。并在获取到该所有模块的模块信息后,记录所有模块的内存起始地址和内存结束地址,以及模块的标识信息,从而方便通过传入一个内存地址可以查询到该内存地址属于哪个内存的模块信息。
本发明实施例中,编写一个接口,该接口用于传入一个内存地址以查询该内存地址所在的模块信息,具体地,编写一个接口GetModuleNameByAddress,用于传入一个内存地址从而获取该内存地址所在的进程中的模块信息。
Char*GetModuleNameByAddress(DWORD dwAddress){
其中,编写该接口的过程中,首先需要打开当前进程的句柄,实际应用中,可以通过调用***API函数OpenProcess来打开当前进程的句柄:
HANDLE hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|
PROCESS_VM_READ,FALSE,processID)。
102、获取当前进程中的所有模块的模块信息;
本发明实施例中,可以通过调用***API中的EnumProcessModules来获取当前进程的所有模块的模块信息:
EnumProcessModules(hProcess,hMods,sizeof(hMods),&cbNeeded);
其函数原型如下:
BOOL WINAPI EnumProcessModules(HANDLE hProcess,HMODULE*lphModule,DWORD cb,LPDWORD lpcbNeeded);
其中,参数hProcess用于表示传入进程的句柄;参数lphModule用来存放所有模块句柄的数组;参数cb lphModule参数用于表示所传入的数组的大小,单位是字节;参数lpcbNeeded用于表示把所有模块的句柄存放进lphModule参数所传入的数组中,所需要的字节数。其中所有信息则存储在参数hMods中。
通过编写一个for循环来遍历hMods中的模块信息,并定义一个存储模块名称变量szName,然后同过调用***API中的GetModuleFileNameEx函数来获取该模块的名称信息,并将该名称信息存储于szName中。
for(i=0;i<(cbNeeded/sizeof(HMODULE));i++){
Char szName[MAX_PATH];
GetModuleFileNameEx(hProcess,hMods[i],szName,sizeof(szName)));
本发明实施例中,通过调用***函数GetModuleInformation获取模块的内存起始地址和内存结束地址,具体如下:
GetModuleInformation(hProcess,hMods[i],&ModNtInfo,sizeof(MODULEINFO))
}
然后,其中获取的模块信息则存储在变量ModNtInfo中;其中,变量ModNtInfo的属性lpBaseOfDll用于存储该模块在内存中的内存起始地址;变量ModNtInfo的属性SizeOfImage用于存储该模块在内存中的大小信息,因此可以通过内存起始地址和大小信息,得到该模块在内存中的内存结束地址。
103、将所有模块的模块信息进行存储得到存储列表;
在得到所有模块的模块信息,包括模块的内存起始地址、内存结束地址和模块的标识信息如名称信息后,可以获取到存储列表,该存储列表中则包括每个动态链接库文件(dynamic link library,DLL)的文件名称信息,DLL的内存起始地址,DLL的结束地址。因此,可以接口的输入参数dwAddress来查询该内存地址是在那个DLL模块内,从而知道该内存地址属于那个模块。具体地,本发明实施例中,使用一个结构体ModuleInfo来存储一个模块的信息。
Struct ModuleInfo{
String ModuleName;
DWORD ModuleStart;
DWORD ModuleEnd;
}
其中String ModuleName;用于表示模块的名称;DWORD ModuleStart;用于表示模块的起始地址;DWORD ModuleEnd;用于表示模块的结束地址。
需要说明的是,对于一个进程来说,可能会加载很多模块,则需要一个链表来存储所加载的所有模块的模块信息。因此,本发明实施例中,使用一个标准模板库(standardtemplate library,STL)中的链表List来存储模块的结构信息,具体如下:
List<ModuleInfo>listModuleInfo;
因此,后续则将获取到的每个模块都存储到这个链表listModuleInfo中,已得到存储列表。
104、对当前进程的***函数NtQueueApcThread进行hook操作;
本发明实施例中,APC的注入,都会调用当前进程的NtQueueApcThread函数,并且该NtQueueApcThread函数的第二个参数则是函数的回调函数地址。其函数原型如下:
其中参数ThreadHandle用于表示线程的句柄;参数ApcRoutine用于表示回调函数的内存地址,定义的APC函数地址;参数NormalContext用于表示APC执行的上下文;参数SystemArgument1用于表示APC函数的参数1;参数SystemArgument2用于表示APC函数的参数2。
为获取NtQueueApcThread函数的第二个参数的内存地址ApcRoutine,可通过Hook的方式来获得,进而可以查询该内存地址所述模块是合法还是非合法。
首先,编写HOOK代码来对函数NtQueueApcThread进行hook操作。
本发明实施例中,可以编写inlinehook来对***函数NtQueueApcThread进行hook,且对于该函数的第二个参数即其真实的回调函数地址,本文则可以通过hook来获取。对于inlinehook来说,其会将需要hook的代码修改成一个jump指令,本发明实施例中,该需要hook的代码即为***函数NtQueueApcThread。而对于jump的位置,则是需要先跳转到中间桩代码,然后从中间桩来跳转到hook逻辑代码,逻辑代码执行完成后,再执行原始的代码,然后再跳转到hook后的位置。从而实现了在原始代码执行流程中,***了一段自己编写的逻辑代码的目的。那么跳转桩的代码则需要完成保存当前执行的被hook代码的执行环境,包括所有寄存器的保存,标志寄存器的保存,同时为了方便在hook逻辑代码中执行相应的逻辑,需要传入参数,本文则考虑传入3个参数给hook逻辑代码。同时在跳转代码中需要调用hook逻辑代码,执行完成后则恢复寄存器的保存到寄存器中。具体包括如下步骤:
步骤1、构造跳转桩
其中代码使用一个变量byTrpJmpPadCode来存储,此段代码中保存的是汇编指令对应的机器码,左边的16进制数据是机器码,而右边的则是对应的汇编代码助记符。例如0x60则对应的汇编代码是pushad。其中pushad则是将所有寄存器压入到堆栈中;Pushfd则是将标志寄存器压入到堆栈中;push arg3表示将参数3压入堆栈中;push arg2表示将参数2压入堆栈中;push arg1表示将参数1压入堆栈中;call 0x90909090则表示调用hook逻辑代码,其中0x90909090用于填入hooklogicfunc函数的内存地址;add esp,0xc表示堆栈平衡,将之前压入的3个参数从堆栈中弹出来;popfd表示从堆栈中之前保存的值还原到标志寄存器中;popad表示从堆栈中之前保存的所有寄存器的值还原到寄存器中。需要说明的是,这些代码都是最基本的代码,能够正常的完成功能。
步骤2、构造JUMP跳转。
跳转代码包括两个,即第一跳转代码和第二跳转代码,该第一跳转代码用于修改原程序代码来跳转到跳转桩的代码中,第二跳转代码则是从跳转桩代码跳转到原程序代码中。
那么对于修改程序原始代码来实现跳转的代码如下:
BYTE byJmpPadCode[HOOKFUNC_JMP_TRP_CODE_SIZE]={0xe9,0x90,0x90,0x90,0x90//jmp xxxx
};
其核心代码则是一条跳转指令,用于从原始代码跳转到跳转桩代码中。同时对于跳转代码需要计算跳转的偏移地址,具体实现则是通过如下公式:
Offset=dwJumpPad-dwHookAddr-0x5;
其中偏移offset则是由跳转桩的代码地址减去实际需要hook的代码内存地址再减去5个字节。
步骤3、构造从跳转桩跳转到原始代码处。
执行完成从原始代码跳转到跳转桩后,再执行完成hook逻辑代码后,则接着会执行原始代码处的代码,执行完成后则需要通过第二跳转代码从跳转桩的代码跳转到原始代码处接着执行原始代码,从而接着原程序的流程继续执行。
BYTE byJmpSrcCode[HOOK_JMP_SRC_CODE_SIZE]={0xe9,0x90,0x90,0x90,0x90//jmp xxxx};
核心代码是一条跳转指令,用于从原始代码即***函数NtQueueApcThread跳转到跳转桩代码中。同时,针对跳转代码需要计算跳转的偏移地址。具体实现则是通过如下公式:
Offset=dwHookAddr-dwJumpPad-HOOKFUNC_TRP_JMPPADCODE_SIZE-0x5;
其中偏移offset则是由HOOK处的地址减去跳转桩的代码地址减去跳转桩代码的长度再减去5个字节。
步骤4、分配跳转桩的内存。
需要说明的是,本文跳转桩的代码是动态分配可以执行的内存,所以其是一种动态代码,没有固定位置,随着***内存的空闲内存变化而变化。具体则通过***API函数VirtualAlloc来分配内存,并且需要分配可以读写可以执行的内存属性。具体如下:
BYTE*VirtualMem=VirtualAlloc(NULL,dwVirtualSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
其中参数dwVirtualSize用于表示跳转桩代码的大小;返回值则是分配的具体内存地址。
步骤5、读取被hook处的原始代码即***函数NtQueueApcThread。
本发明实施例中,被hook处的原始代码会被修改成一个jump指令,所以在修改前先需要进行备份该原始代码即***函数NtQueueApcThread,从而执行完成跳转桩代码后继续执行原始代码。具体则可以通过***API函数ReadProcessMemory来读取内存:
BOOL bRet=ReadProcessMemory(hProcess,(LPVOID)dwHookAddr,&bySrcCode,dwHookLen,&nRead);
其中参数hProcess表示本进程的句柄;参数dwHookAddr表示hook的内存地址;参数bySrcCode则用于存储原始代码;参数dwHookLen则表示读取的长度;修改被hook处的代码属性。
由于程序中代码都是只读可执行的内存属性,如果需要对其进行hook则需要修改成可以写可以执行的内存属性,***API函数提供了修改内存属性的方法VirtualProtectEx,如下:
VirtualProtectEx(hProcess,(LPVOID)dwHookAddr,dwHookLen,PAGE_EXECUTE_READWRITE,&dwOld);
其中修改的地址是需要hook的地址dwHookAddr;dwHookLen则是dwHookAddr的长度;修改的属性为PAGE_EXECUTE_READWRITE,表示可以读写可以执行。
步骤6、修改原始代码写入跳转代码。
本发明实施例中,通过***函数WriteProcessMemory则可以修改原始代码。
WriteProcessMemory(hProcess,(LPVOID)dwHookAddr,&byJmpPadCode,HOOK_JMP_SRC_CODE_SIZE,&nWrite);
本发明实施例中,在被hook处的代码写入了一个跳转代码,通过该跳转代码跳转到上述编写的跳转桩的代码。
步骤7、编写跳转桩中的代码hooklogicfunc,使其具备获取参数的功能。
本发明实施例中,在跳转桩代码byTrpJmpPadCode中,编写了对应的压入参数的功能,并且跳转桩中hooklogicfunc则是实际hook后执行的***的一段代码逻辑。整个hook功能的实际作用则都是为了在***函数NtQueueApcThread中***一段代码来获取其第二个参数的内存地址。本文的hooklogicfunc则会实现对应的获取功能,具体实现如下:在hook桩中会传入3个参数,包括byBuffIndex,byLevel和dwXorKey:
Void hooklogicfunc(BYTE byBuffIndex,BYTE byLevel,DWORD dwXorKey){
DWORD dwAddrXorKey=(DWORD)&dwXorKey;
本发明实施例中,首先获取传入参数dwXorKey的内存地址dwAddrXorKey。
通过获取的内存地址dwAddrXorKey则可以推算出NtQueueApcThread第二个参数的值。本文通过对***实际计算得出是在与参数dwXorKey距离13*4的偏移处。
DWORD dwCallBackAddr=dwAddrXorKey+13*4;
}
故可以得到第二个参数的函数的内存地址dwCallBackAddr。
105、根据回调函数的内存地址获取到回调函数的内存地址对应的模块的目标标识信息;
通过步骤104获得了***函数NtQueueApcThread的回调函数的内存地址后,可以查询该函数的内存地址所属的模块信息,包括回调函数的内存地址对应的模块的目标标识信息。
本发明实施例中,在步骤101中编写了获得了当前进程的所有模块的模块信息,并且也编写了对应的接口来查询一个内存地址所对应的模块信息。故本发明实施例中,可以调用GetModuleNameByAddress函数来获取到对应的模块信息,其中返回值则是对应的具体模块的名称即目标标识信息,具体如下:
Char*pResult=GetModuleNameByAddress(dwCallBackAddr);
其中,返回值pResult即为获取得到的目标标识信息。
106、确定回调函数的内存地址对应的模块为APC注入的非法模块。
需要说明的是,对于一个正常的客户端其所有的模块信息是已知的,那么客户端则可以将获取得到的目标标识信息即pResult来上报到服务器,使得服务器通过模块的名称则可以确定是合法的还是非法的,具体地,如果上报的模块名称不属于客户端编写的所有模块的名称,而属于一个不属于客户端编写的模块,则说明是一个APC注入的非法模块,属于其他第三方开发的模块。而只有上报的模块名称包含在客户端编写模块列表中即存储列表的模块才是合法模块。
本发明实施例中,可以通过由客户端采集信息上报到服务器,使得服务器来判断回调函数的内存地址对应的模块的合法性的方法,能防止一些合法的正常软件产生的误报。例如对于一些合法的输入法也会可能产生这样的回调模块,服务器则可以通过加入合法模块列表来排除这些正常的模块。例如对于搜狗拼音输入法,则可能会注入模块sogou.dll,那么也可能会使用APC的方式,那么客户端检测则会上报sougou.dll,服务器则可以依据实际情况将上报sougou.dll认为是合法的。而一旦判断逻辑写到客户端,则无法及时的进行排查,只有通过重新更新客户端版本。
如果当前进程有APC的模块注入,则其会调用当前进程的函数NtQueueApcThread,其中核心的是通过该函数传入的回调函数地址,函数地址则代表了其代码所在的内存地址,通过函数地址则可以获取到其对应的模块信息,从而通过模块信息则可以得到是否是非法模块,从而能够对APC模块的注入进行检测,故本发明实施例中,可以通过编写一个hook工具来对当前进程的NtQueueApcThread函数进行hook,并且通过hook来获取其填入APC的函数回调函数地址,当被hook后,如果有其他黑客程序通过APC的注入方式来注入模块的话,则一定会调用当前进程的NtQueueApcThread,那么则一定会被本文的hook代码所感知,在对应的hook代码中,本文则会通过在hook代码中加入对当前函数的回调函数的地址进行检测,如果发现回调函数地址所属于的地址不是本进程的合法模块,则说明存在非法模块的注入,从而可以检测到APC的注入。
本发明实施例中,通过编写一个hook工具来对当前进程的这个函数进行hook,并且通过hook来获取其填入APC的函数的回调函数地址,当被hook后,如果有其他黑客程序通过APC的注入方式来注入模块的话,则一定会调用当前进程的NtQueueApcThread,那么则一定会被本文的hook代码所感知,在对应的hook代码中,本文则会通过在hook代码中加入对当前函数的回调函数的地址进行检测,如果发现回调函数地址所属于的地址不是本进程的合法模块,则说明存在非法模块的注入,从而可以检测到APC的注入。
上面从针对异步过程调用APC注入的检测方法的角度对本发明实施例进行了描述,下面从检测装置的角度对本发明实施例进行描述。
请参阅图2,图2为本发明实施例提供的一种可能的检测装置的实施例示意图,包括:
调用单元201,用于调用应用程序编程接口API中的OpenProcess函数以打开当前进程的句柄;
所述调用单元201还用于,调用所述API中的EnumProcessModule函数获取所述当前进程中的所有模块的模块信息,所述模块信息包括内存起始地址、内存结束地址和标识信息;
存储单元202,用于将所述所有模块的模块信息进行存储得到存储列表,所述存储列表用于根据内存地址确定所述内存地址所属的模块;
hook单元203,用于对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址;
所述调用单元201还用于,调用所述API中的GetModuleNameByAddress函数,以根据所述回调函数的内存地址获取到所述回调函数的内存地址对应的模块的目标标识信息,所述目标标识信息包含于所述所有模块的标识信息;
确定单元204,若所述目标标识信息不包含于所述存储列表,则用于确定所述回调函数的内存地址对应的模块为APC注入的非法模块。
可选的,在一些可能的实现方式中,所述调用单元201具体用于包括:用于遍历所述所有模块的模块信息;调用所述API中的GetModuleFileNameEx函数获取所述所有模块的标识信息;调用所述API中的GetModuleInformation函数获取所述当前进程中所有模块的内存起始地址和内存结束地址。
可选的,在一些可能的实现方式中,所述hook单元203具体用于:编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述***函数NtQueueApcThread跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述***函数NtQueueApcThread,所述跳转桩代码包括需***的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;备份所述***函数NtQueueApcThread,将所述***函数NtQueueApcThread修改为所述第一跳转代码;当执行到所述***函数NtQueueApcThread时,根据所述第一跳转代码从所述***函数NtQueueApcThread跳转到所述跳转桩代码;根据所述跳转桩代码中的hooklogicfunc函数获取所述***函数NtQueueApcThread的回调函数的内存地址。
可选的,在一些可能的实现方式中,所述检测装置还包括:
跳转单元205,用于执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述***函数NtQueueApcThread;
恢复单元206,用于恢复所述程序中所有的线程,继续执行所述***函数NtQueueApcThread。
可选的,在一些可能的实现方式中,所述hook单元203具体应用:调用***API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过***API函数WriteProcessMemory将所述***函数NtQueueApcThread修改为所述第一跳转代码。
可选的,在一些可能的实现方式中,所述确定单元204还用于:若所述目标标识信息包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为未被APC注入的模块。
本发明实施例中,通过编写一个hook工具来对当前进程的这个函数进行hook,并且通过hook来获取其填入APC的函数的回调函数地址,当被hook后,如果有其他黑客程序通过APC的注入方式来注入模块的话,则一定会调用当前进程的NtQueueApcThread,那么则一定会被本文的hook代码所感知,在对应的hook代码中,本文则会通过在hook代码中加入对当前函数的回调函数的地址进行检测,如果发现回调函数地址所属于的地址不是本进程的合法模块,则说明存在非法模块的注入,从而可以检测到APC的注入。
请参阅图3,图3为本发明实施例提供的电子设备的实施例示意图。
如图3所示,本发明实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:调用应用程序编程接口API中的OpenProcess函数以打开当前进程的句柄;调用所述API中的EnumProcessModule函数获取所述当前进程中的所有模块的模块信息,所述模块信息包括内存起始地址、内存结束地址和标识信息;将所述所有模块的模块信息进行存储得到存储列表,所述存储列表用于根据内存地址确定所述内存地址所属的模块;对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址;调用所述API中的GetModuleNameByAddress函数,以根据所述回调函数的内存地址获取到所述回调函数的内存地址对应的模块的目标标识信,所述目标标识信息包含于所述所有模块的标识信息息;若所述目标标识信息不包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为APC注入的非法模块。
可选的,在一种可能的实施例中,所述处理器具体用于:遍历所述所有模块的模块信息;调用所述API中的GetModuleFileNameEx函数获取所述所有模块的标识信息;调用所述API中的GetModuleInformation函数获取所述当前进程中所有模块的内存起始地址和内存结束地址。
可选的,在一种可能的实施例中,所述处理器具体用于:编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述***函数NtQueueApcThread跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述***函数NtQueueApcThread,所述跳转桩代码包括需***的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;备份所述***函数NtQueueApcThread,将所述***函数NtQueueApcThread修改为所述第一跳转代码;当执行到所述***函数NtQueueApcThread时,根据所述第一跳转代码从所述***函数NtQueueApcThread跳转到所述跳转桩代码;根据所述跳转桩代码中的hooklogicfunc函数获取所述***函数NtQueueApcThread的回调函数的内存地址。
可选的,在一种可能的实施例中,所述处理器具体用于:执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述***函数NtQueueApcThread;恢复所述程序中所有的线程,继续执行所述***函数NtQueueApcThread。
可选的,在一种可能的实施例中,所述处理器具体用于:调用***API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过***API函数WriteProcessMemory将所述***函数NtQueueApcThread修改为所述第一跳转代码。
可选的,在一种可能的实施例中,所述处理器具体用于:若所述目标标识信息包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为未被APC注入的模块。
在具体实施过程中,处理器320执行计算机程序311时,可以实现图1对应的实施例中任一实施方式。
本发明实施例中,通过编写一个hook工具来对当前进程的这个函数进行hook,并且通过hook来获取其填入APC的函数的回调函数地址,当被hook后,如果有其他黑客程序通过APC的注入方式来注入模块的话,则一定会调用当前进程的NtQueueApcThread函数,那么则一定会被本文的hook代码所感知,在对应的hook代码中,本文则会通过在hook代码中加入对当前函数的回调函数的地址进行检测,如果发现回调函数地址所属于的地址不是本进程的合法模块,则说明存在非法模块的注入,从而可以检测到APC的注入。
由于本实施例所介绍的电子设备为实施本发明实施例中一种检测装置所采用的设备,故而基于本发明实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本发明实施例中的方法不再详细介绍,只要本领域所属技术人员实施本发明实施例中的方法所采用的设备,都属于本发明所欲保护的范围。
请参阅图4,图4为本发明实施例提供的一种计算机可读存储介质的实施例示意图。
如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,该计算机程序411被处理器执行时实现如下步骤:调用应用程序编程接口API中的OpenProcess函数以打开当前进程的句柄;调用所述API中的EnumProcessModule函数获取所述当前进程中的所有模块的模块信息,所述模块信息包括内存起始地址、内存结束地址和标识信息;将所述所有模块的模块信息进行存储得到存储列表,所述存储列表用于根据内存地址确定所述内存地址所属的模块;对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址;调用所述API中的GetModuleNameByAddress函数,以根据所述回调函数的内存地址获取到所述回调函数的内存地址对应的模块的目标标识信息,所述目标标识信息包含于所述所有模块的标识信息;若所述目标标识信息不包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为APC注入的非法模块。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:遍历所述所有模块的模块信息;调用所述API中的GetModuleFileNameEx函数获取所述所有模块的标识信息;调用所述API中的GetModuleInformation函数获取所述当前进程中所有模块的内存起始地址和内存结束地址。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述***函数NtQueueApcThread跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述***函数NtQueueApcThread,所述跳转桩代码包括需***的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;备份所述***函数NtQueueApcThread,将所述***函数NtQueueApcThread修改为所述第一跳转代码;当执行到所述***函数NtQueueApcThread时,根据所述第一跳转代码从所述***函数NtQueueApcThread跳转到所述跳转桩代码;根据所述跳转桩代码中的hooklogicfunc函数获取所述***函数NtQueueApcThread的回调函数的内存地址。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述***函数NtQueueApcThread;恢复所述程序中所有的线程,继续执行所述***函数NtQueueApcThread。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:调用***API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;通过***API函数WriteProcessMemory将所述***函数NtQueueApcThread修改为所述第一跳转代码。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:若所述目标标识信息包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为未被APC注入的模块。
本发明实施例中,通过编写一个hook工具来对当前进程的这个函数进行hook,并且通过hook来获取其填入APC的函数的回调函数地址,当被hook后,如果有其他黑客程序通过APC的注入方式来注入模块的话,则一定会调用当前进程的NtQueueApcThread函数,那么则一定会被本文的hook代码所感知,在对应的hook代码中,本文则会通过在hook代码中加入对当前函数的回调函数的地址进行检测,如果发现回调函数地址所属于的地址不是本进程的合法模块,则说明存在非法模块的注入,从而可以检测到APC的注入。
需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。
Claims (10)
1.一种针对异步过程调用APC注入的检测方法,其特征在于,包括:
调用应用程序编程接口API中的OpenProcess函数以打开当前进程的句柄;
调用所述API中的EnumProcessModule函数获取所述当前进程中的所有模块的模块信息,所述模块信息包括内存起始地址、内存结束地址和标识信息;
将所述所有模块的模块信息进行存储得到存储列表,所述存储列表用于根据内存地址确定所述内存地址所属的模块;
对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址;
调用所述API中的GetModuleNameByAddress函数,以根据所述回调函数的内存地址获取到所述回调函数的内存地址对应的模块的目标标识信息,若所述目标标识信息包含于所述所有模块的标识信息,则确定所述回调函数的内存地址对应的模块为APC注入的合法模块;
若所述目标标识信息不包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为APC注入的非法模块。
2.根据权利要求1所述的方法,其特征在于,所述调用所述API中的EnumProcessModule获取所述当前进程中的所有模块的模块信息包括:
遍历所述所有模块的模块信息;
调用所述API中的GetModuleFileNameEx函数获取所述所有模块的标识信息;
调用所述API中的GetModuleInformation函数获取所述当前进程中所有模块的内存起始地址和内存结束地址。
3.根据权利要求1所述的方法,其特征在于,对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址包括:
编写跳转代码和跳转桩代码,所述跳转代码包括第一跳转代码和第二跳转代码,所述第一跳转代码用于从所述***函数NtQueueApcThread跳转到所述跳转桩代码,所述第二跳转代码用于从所述跳转桩代码跳转到所述***函数NtQueueApcThread,所述跳转桩代码包括需***的inlinehook逻辑代码,所述跳转桩代码用于保存所述程序中待hook原始代码的执行环境;
备份所述***函数NtQueueApcThread,将所述***函数NtQueueApcThread修改为所述第一跳转代码;
当执行到所述***函数NtQueueApcThread时,根据所述第一跳转代码从所述***函数NtQueueApcThread跳转到所述跳转桩代码;
根据所述跳转桩代码中的hooklogicfunc函数获取所述***函数NtQueueApcThread的回调函数的内存地址。
4.根据权利要求3所述的方法,其特征在于,所述***函数NtQueueApcThread的回调函数为所述***函数NtQueueApcThread的第二个参数。
5.根据权利要求3所述的方法,其特征在于,所述根据所述跳转桩代码中的hooklogicfunc函数获取所述***函数NtQueueApcThread的回调函数的内存地址之后,所述方法还包括:
执行完成所述跳转桩代码后,根据所述第二跳转代码从所述跳转桩代码跳转到备份的所述***函数NtQueueApcThread;
恢复所述程序中所有的线程,继续执行所述***函数NtQueueApcThread。
6.根据权利要求3所述的方法,其特征在于,所述将所述***函数NtQueueApcThread修改为所述第一跳转代码包括:
调用***API函数VirtualProtectEx将所述待hook原始代码的内存属性从只读可执行修改为可写可执行;
通过***API函数WriteProcessMemory将所述***函数NtQueueApcThread修改为所述第一跳转代码。
7.根据权利要求1至6中任一项所述的方法,其特征在于,所述方法还包括:
若所述目标标识信息包含于所述存储列表,则确定所述回调函数的内存地址对应的模块为未被APC注入的模块。
8.一种检测装置,其特征在于,包括:
调用单元,用于调用应用程序编程接口API中的OpenProcess函数以打开当前进程的句柄;调用所述API中的EnumProcessModule函数获取所述当前进程中的所有模块的模块信息,所述模块信息包括内存起始地址、内存结束地址和标识信息;
存储单元,用于将所述所有模块的模块信息进行存储得到存储列表,所述存储列表用于根据内存地址确定所述内存地址所属的模块;
hook单元,用于对所述当前进程的***函数NtQueueApcThread进行挂钩hook操作,以获得所述***函数NtQueueApcThread的回调函数的内存地址;
所述调用单元还用于,调用所述API中的GetModuleNameByAddress函数,以根据所述回调函数的内存地址获取到所述回调函数的内存地址对应的模块的目标标识信息,若所述目标标识信息包含于所述所有模块的标识信息,则确定所述回调函数的内存地址对应的模块为APC注入的合法模块;
确定单元,若所述目标标识信息不包含于所述存储列表,则用于确定所述回调函数的内存地址对应的模块为APC注入的非法模块。
9.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1-7任意一项所述的方法。
10.一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行如权利要求1-7任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810803125.6A CN110737892B (zh) | 2018-07-20 | 2018-07-20 | 一种针对apc注入的检测方法和相关装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810803125.6A CN110737892B (zh) | 2018-07-20 | 2018-07-20 | 一种针对apc注入的检测方法和相关装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110737892A CN110737892A (zh) | 2020-01-31 |
CN110737892B true CN110737892B (zh) | 2021-11-09 |
Family
ID=69235502
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810803125.6A Active CN110737892B (zh) | 2018-07-20 | 2018-07-20 | 一种针对apc注入的检测方法和相关装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110737892B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113722002A (zh) * | 2020-05-26 | 2021-11-30 | 网神信息技术(北京)股份有限公司 | 用于获取命令行参数的方法和***、电子设备和存储介质 |
CN114327467A (zh) * | 2020-09-29 | 2022-04-12 | 武汉斗鱼网络科技有限公司 | 一种获取***函数信息的方法以及相关设备 |
CN112181851B (zh) * | 2020-10-27 | 2023-07-28 | 北京字跳网络技术有限公司 | 软件测试方法、设备及存储介质 |
CN115017058B (zh) * | 2022-08-04 | 2022-11-29 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
CN115543586B (zh) * | 2022-11-28 | 2023-03-17 | 成都安易迅科技有限公司 | 应用层***进程的启动方法、装置、设备及可读存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5235640A (en) * | 1989-12-21 | 1993-08-10 | International Telesystems, Inc. | Master decoder for television signal scramble systems |
CN101414341A (zh) * | 2007-10-15 | 2009-04-22 | 北京瑞星国际软件有限公司 | 一种软件自我保护的方法 |
CN102855431A (zh) * | 2011-06-27 | 2013-01-02 | 奇智软件(北京)有限公司 | 一种文件解锁、粉碎的方法及装置 |
US9424427B1 (en) * | 2012-03-16 | 2016-08-23 | Bitdefender IPR Management Ltd. | Anti-rootkit systems and methods |
CN106709325A (zh) * | 2016-11-11 | 2017-05-24 | 腾讯科技(深圳)有限公司 | 一种监控程序的方法及装置 |
CN111191227A (zh) * | 2019-07-22 | 2020-05-22 | 腾讯科技(深圳)有限公司 | 阻止恶意代码执行的方法和装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7493236B1 (en) * | 2007-08-16 | 2009-02-17 | International Business Machines Corporation | Method for reporting the status of a control application in an automated manufacturing environment |
CN106778269B (zh) * | 2016-12-01 | 2020-09-25 | 腾讯科技(深圳)有限公司 | 一种驱动层防注入方法、装置及客户端 |
-
2018
- 2018-07-20 CN CN201810803125.6A patent/CN110737892B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5235640A (en) * | 1989-12-21 | 1993-08-10 | International Telesystems, Inc. | Master decoder for television signal scramble systems |
CN101414341A (zh) * | 2007-10-15 | 2009-04-22 | 北京瑞星国际软件有限公司 | 一种软件自我保护的方法 |
CN102855431A (zh) * | 2011-06-27 | 2013-01-02 | 奇智软件(北京)有限公司 | 一种文件解锁、粉碎的方法及装置 |
US9424427B1 (en) * | 2012-03-16 | 2016-08-23 | Bitdefender IPR Management Ltd. | Anti-rootkit systems and methods |
CN106709325A (zh) * | 2016-11-11 | 2017-05-24 | 腾讯科技(深圳)有限公司 | 一种监控程序的方法及装置 |
CN111191227A (zh) * | 2019-07-22 | 2020-05-22 | 腾讯科技(深圳)有限公司 | 阻止恶意代码执行的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN110737892A (zh) | 2020-01-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110737892B (zh) | 一种针对apc注入的检测方法和相关装置 | |
US9208307B2 (en) | Automatic algorithm discovery using reverse dataflow analysis | |
CN110941528B (zh) | 一种基于故障的日志埋点设置方法、装置及*** | |
US10387627B2 (en) | Systems and methods for analyzing software | |
CN109086183B (zh) | 一种应用程序的监控方法、装置、电子设备及存储介质 | |
EP1967954A1 (en) | A method for deleting virus program and a method to get back the data destroyed by the virus. | |
CN111967017A (zh) | 生成依赖关系的方法、装置、终端设备及存储介质 | |
CN111913742B (zh) | 一种程序处理方法及相关设备 | |
CN110688658A (zh) | 未知病毒感染追溯方法、装置及*** | |
CN112099880A (zh) | 场景驱动的应用程序约减方法和*** | |
CN111913878A (zh) | 基于程序分析结果的字节码插桩方法、装置及存储介质 | |
KR100920414B1 (ko) | 트랜잭션의 지정된 수행지점에서 자바 스택을 스냅샷하는자바 프로세스 모니터링 시스템 및 그 방법 | |
CN103632099B (zh) | 未导出的Native API函数获取方法及装置 | |
CN116841906A (zh) | 智能合约的检测方法、装置及电子设备 | |
CN111625296A (zh) | 一种通过构建代码副本保护程序的方法 | |
CN111352631A (zh) | 一种接口兼容性检测方法及装置 | |
CN107798244A (zh) | 一种检测远程代码执行漏洞的方法及装置 | |
CN110673899B (zh) | 一种程序处理方法及相关设备 | |
CN114996955A (zh) | 一种云原生混沌工程实验的靶场环境构建方法及装置 | |
KR102256894B1 (ko) | 크래시 리포트 그룹핑 방법, 서버 및 컴퓨터 프로그램 | |
CN111045891B (zh) | 基于java多线程的监控方法、装置、设备以及存储介质 | |
CN113076122A (zh) | 一种资源文件管理方法、装置、设备及存储介质 | |
CN106897588B (zh) | 一种标签函数的处理方法及装置 | |
CN113296834B (zh) | 一种基于逆向工程的安卓闭源服务类型信息提取方法 | |
CN112860285B (zh) | 金融自助设备的sp升级包生成方法、装置及计算机设备 |
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 |