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任意一项所述的方法。