扫描系统进程的方法和装置的制造方法

xiaoxiao2021-2-27  230

扫描系统进程的方法和装置的制造方法
【技术领域】
[0001]本发明涉及计算机软件领域,特别涉及一种扫描系统进程的方法和装置。
【背景技术】
[0002]RootKit是计算机攻击者用来隐藏自己的踪迹的工具,当前常见的隐藏rootkit的方法有以下几种:
[0003]I)替换或修改操作系统上关键的系统文件。
[0004]2)基于挂钩技术,通过对已加载的应用和一些诸如系统调用表的操作系统部件打内存补丁。
[0005]3)通过动态修改内核对象。
[0006]而操作系统枚举系统当前进程是通过其Na t V i e A P I函数ZwQuerySystemInfomat1n通过操作进程活动链表来实现的。具体过程如下:
[0007]首先,获取当前任一进程的指针,例如通过PsGetCurrentProcessO来获取当前进程的PEPR0CESS指针。
[0008]然后,定位到记录该当前进程与其它进程链接信息的Activelist处,具体的操作方式为ActiveList = pCurrentEprocess+0x88,即当前进程指针移动一定的步长。其中0x88Swinxp sp3下Activelist与pCurrentEprocess的步长,在不同win操作系统时该步长并不相同。
[0009]接着,以所定位的当前进程的A c t i V e I i s t遍历整个进程活动链表(Activelistlink)上每一进程的数据结构,即可获得当前的存在于进程活动链表的所有进程。
[0010]如上所述,如果利用RootKit程序将进程对象从进程活动链接中移除,那么调用ZwQuerySystemInformat1n来通过上述方法实现枚举进程的方法将不会看到目标进程了。一些病毒、木马通过RootKit技术就是这样实现自我隐藏,对计算机造成潜在的或现实的威胁。

【发明内容】

[0011]为此,需要提供一种能够查找出上述被进程活动链表忽略而实质上又在被执行的隐藏进程的全面扫描枚举系统进程的技术方案。
[0012]为实现上述目的,发明人提供了一种扫描系统进程的方法,包括步骤:
[0013]于内存中加载ntdll.dll文件,获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息;
[0014]通过反汇编查看ntdll.dll下所述私有API函数对应的源代码,再通过汇编根据所述私有API函数信息实现从R3到RO的调用;
[0015]遍历系统句柄表以获取系统所有内核句柄信息,并逐一判断是否进程句柄,如是则对其进行复制和记录,然后获得进程?目息。[ΟΟ??]进一步地,所述的扫描系统进程的方法中,在步骤“于内存中加载ntdll.dll文件”之前还包括步骤:
[0017]获取系统版本信息。
[0018]进一步地,所述的扫描系统进程的方法中,步骤“获取系统版本信息”具体包括:
[0019]通过GetProcAddress 函数获得 Kerne 132.dll 下的GetNativeSy stemlnf ο 函数的调用地址;
[0020]调用GetNativeSystemInfo函数获得结构为SYSTEM_INF0的系统信息Si;
[0021]s1.wProcessorArchitecture等于PR0CESS0R_ARCHITECTURE_AMD64(9)或PR0CESS0R_ARCHITECTURE_IA64(6),则判定系统版本为64位;否则系统版本为32位。
[0022]进一步地,所述的扫描系统进程的方法中,步骤“于内存中加载ntdl1.dl I文件,获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息”具体包括如下步骤:
[0023]于内存中加载ntdll.dll文件;
[0024]解析文件的PE头,获得导出表的相对虚拟地址RVA值,并转换为到源文件中的位移,从而得到源文件中导出表及其对应的结构为IMAGE_EXP0RT_DIRECT0RY的信息;
[0025 ] 根据导出表及其对应的结构为頂AGE_EXP0RT_D I RECTORY的信息,通过匹配函数名的方法,获取枚举进程所需的私有API函数的AddressOfNameOrdinals的序号,并通过该序号计算得到函数服务号和Win7下ECX的偏移。
[0026]进一步地,所述的扫描系统进程的方法中,步骤“遍历系统句柄表以获取系统所有内核句柄?目息,并逐一判断是否进程句柄,如是则对其进行复制和记录,然后获得进程?目息”具体包括:
[0027]通过函数NtQuery Sy stemlnf ormat 1n 传递参数 Sy stemHandle Inf ormat 1n,得到结构为PSYSTEM_HANDLE_I NF0RMAT10Ν_ΕΧ 的系统句柄表;
[0028]逐一遍历系统句柄表中的句柄信息HandleInfo,当判定句柄类型0b jectTypeNumber为进程类型时,使用自实现函数NtOpenProcess传递参数PR0CESS_DUP_HANDLE打开Handle Inf0.Proce ss Id并返回进程句柄,再使用自实现函数Dup IicateOb ject实现句柄的复制和记录,最后通过自实现函数GetProcessImageFi IeName获得当前进程的?目息O
[0029]发明人同时还提供了一种扫描系统进程的装置,包括加载单元、信息获取单元、调用单元、遍历单元、判断单元和记录单元:
[0030]所述加载单元用于在内存中加载ntdll.dll文件
[0031]所述信息获取单元用于获取枚举进程所需的私有API函数信息和Win7下的ECX偏移?目息;
[0032]所述调用单元用于通过反汇编查看ntdll.dll下所述私有API函数对应的源代码,再通过汇编根据所述私有API函数信息实现从R3到RO的调用;
[0033]所述遍历单元用于遍历系统句柄表以获取系统所有内核句柄信息;
[0034]所述判断单元用于判断遍历单元所遍历的内核句柄是否进程句柄,如是则记录单兀对其进行复制和记录,然后获得进程?目息。
[0035]进一步地,所述的扫描系统进程的装置中,还包括系统版本获取单元,用于获取系统版本信息。
[0036]进一步地,所述的扫描系统进程的装置中,系统版本获取单元获取系统版本信息具体包括:
[0037]通过GetProcAddress 函数获得 Kerne 132.dll 下的GetNativeSy stemlnf ο 函数的调用地址;
[0038]调用GetNativeSystemInfo函数获得结构为SYSTEM_INF0的系统信息Si;
[0039]若s1.wProcessorArchitecture等于PR0CESS0R_ARCHITECTURE_AMD64(9)或PR0CESS0R_ARCHITECTURE_IA64(6),则判定系统版本为64位;否则系统版本为32位。
[0040]进一步地,所述的扫描系统进程的装置中,所述加载单元于内存中加载ntdll.dll文件后,所述信息获取单元获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息具体包括:
[0041 ]解析文件的PE头,获得导出表的相对虚拟地址RVA值,并转换为到源文件中的位移,从而得到源文件中导出表及其对应的结构为IMAGE_EXP0RT_DIRECT0RY的信息;
[0042 ] 根据导出表及其对应的结构为頂AGE_EXP0RT_D I RECTORY的信息,通过匹配函数名的方法,获取枚举进程所需的私有API函数的AddressOfNameOrdinals的序号,并通过该序号计算得到函数服务号和Win7下ECX的偏移。
[0043]进一步地,所述的扫描系统进程的装置中,所述遍历单元通过函数NtQuery Sy steml nf ormat 1n传递参数Sy stemHand Ie Inf ormat 1n,得到结构为PSYSTEM_HANDLE_INF0RMAT10Ν_ΕΧ的系统句柄表;然后逐一遍历系统句柄表中的句柄信息HandleInfo;
[0044]当判断单元判定句柄类型ObjectTypeNumber为进程类型时,记录单元使用自实现函数 NtOpenProcess 传递参数 PR0CESS_DUP_HANDLE 打开 Handl e Inf0.Process Id并返回进程句柄,再使用自实现函数DuplicateObject实现句柄的复制和记录,最后通过自实现函数GetProcess ImageFi IeName获得当前进程的信息。
[0045]区别于现有技术,上述技术方案能够有效地全面扫描系统进程,包括某些通过特定途径隐藏的进程,从而达到提高系统安全性的目的。
【附图说明】
[0046]图1为本发明一实施方式所述扫描系统进程的方法的流程图;
[0047]图2为本发明一实施方式所述扫描系统进程的装置的结构示意图。
[0048]附图标记说明:
[0049]1-加载单元;
[0050]2-信息获取单元;
[0051 ]3-调用单元;
[0052]4-遍历单元;
[0053]5-判断单元;
[0054]6-记录单元;
[0055]7-系统版本获取单元。
【具体实施方式】
[0056]为详细说明技术方案的技术内容、构造特征、所实现目的及效果,以下结合具体实施例并配合附图详予说明。
[0057]请参阅图1,为本发明一实施方式所述扫描系统进程的方法的流程图;所述方法包括如下步骤:
[0058]S1、获取系统版本信息;
[0059]S2、于内存中加载ntdll.dll文件;
[0060]S3、获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息;
[0061 ] S4、通过反汇编查看ntdll.dll下所述私有API函数对应的源代码;
[0062]S5、通过汇编根据所述私有API函数信息实现从R3到RO的调用;
[0063]S6、遍历系统句柄表以获取系统所有内核句柄信息,并逐一判断是否进程句柄,如是则对其进行复制和记录,然后获得进程信息。
[0064]进一步地,所述的扫描系统进程的方法中,在步骤“于内存中加载ntdll.dll文件”之前还包括步骤:
[0065]获取系统版本信息。
[0066]进一步地,所述的扫描系统进程的方法中,步骤“获取系统版本信息”具体包括:
[0067]通过GetProcAddress 函数获得 Kerne 132.dll 下的GetNativeSy stemlnf ο 函数的调用地址;
[0068]调用GetNativeSystemInfo函数获得结构为SYSTEM_INF0的系统信息Si;
[0069]s1.wProcessorArchitecture等于PR0CESS0R_ARCHITECTURE_AMD64(9)或PR0CESS0R_ARCHITECTURE_IA64(6),则判定系统版本为64位;否则系统版本为32位。
[0070]进一步地,所述的扫描系统进程的方法中,步骤“于内存中加载ntdl1.dl I文件,获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息”具体包括如下步骤:
[0071]于内存中加载ntdll.dll文件;
[0072]解析文件的PE头,获得导出表的相对虚拟地址RVA值,并转换为到源文件中的位移,从而得到源文件中导出表及其对应的结构为IMAGE_EXP0RT_DIRECT0RY的信息;
[0073 ] 根据导出表及其对应的结构为頂AGE_EXP0RT_D I RECTORY的信息,通过匹配函数名的方法,获取枚举进程所需的私有API函数的AddressOfNameOrdinals的序号,并通过该序号计算得到函数服务号和Win7下ECX的偏移。
[0074]进一步地,所述的扫描系统进程的方法中,步骤“遍历系统句柄表以获取系统所有内核句柄?目息,并逐一判断是否进程句柄,如是则对其进行复制和记录,然后获得进程?目息”具体包括:
[0075]通过函数NtQuerySystemInformat1n 传递参数 SystemHandleInformat1nJiI^lJ结构为PSYSTEM_HANDLE_I NF0RMAT10Ν_ΕΧ 的系统句柄表;
[0076]逐一遍历系统句柄表中的句柄信息H a n d I e I n f ο,当判定句柄类型Ob jectTypeNumber为进程类型时,使用自实现函数NtOpenProcess传递参数PR0CESS_DUP_HANDLE打开Handle Inf0.Proce ss Id并返回进程句柄,再使用自实现函数Dup IicateOb ject实现句柄的复制和记录,最后通过自实现函数GetProcessImageFi IeName获得当前进程的?目息O
[0077]请参阅图2,为本发明一实施方式所述扫描系统进程的装置的结构示意图,所述装置包括加载单元1、信息获取单元2、调用单元3、遍历单元4、判断单元5和记录单元6:
[0078]所述加载单元I用于在内存中加载ntdll.dll文件
[0079]所述信息获取单元2用于获取枚举进程所需的私有API函数信息和Win7下的ECX偏移?目息;
[0080]所述调用单元3用于通过反汇编查看ntdll.dll下所述私有API函数对应的源代码,再通过汇编根据所述私有API函数信息实现从R3到RO的调用;
[0081]所述遍历单元4用于遍历系统句柄表以获取系统所有内核句柄信息;
[0082]所述判断单元5用于判断遍历单元所遍历的内核句柄是否进程句柄,如是则记录单元6对其进行复制和记录,然后获得进程信息。
[0083]进一步地,所述的扫描系统进程的装置中,还包括系统版本获取单元7,用于获取系统版本信息。
[0084]进一步地,所述的扫描系统进程的装置中,系统版本获取单元7获取系统版本信息具体包括:
[0085]通过GetProcAddress 函数获得 Kerne 132.dll 下的GetNativeSy stemlnf ο 函数的调用地址;
[0086]调用GetNativeSystemInfo函数获得结构为SYSTEM_INF0的系统信息Si;
[0087]若s1.wProcessorArchitecture等于PR0CESS0R_ARCHITECTURE_AMD64(9)或PR0CESS0R_ARCHITECTURE_IA64(6),则判定系统版本为64位;否则系统版本为32位。
[0088]进一步地,所述的扫描系统进程的装置中,所述加载单元I于内存中加载ntdll.dll文件后,所述信息获取单元2获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息具体包括:
[0089]解析文件的PE头,获得导出表的相对虚拟地址RVA值,并转换为到源文件中的位移,从而得到源文件中导出表及其对应的结构为IMAGE_EXP0RT_DIRECT0RY的信息;
[0090 ] 根据导出表及其对应的结构为頂AGE_EXP0RT_D I RECTORY的信息,通过匹配函数名的方法,获取枚举进程所需的私有API函数的AddressOfNameOrdinals的序号,并通过该序号计算得到函数服务号和Win7下ECX的偏移。
[0091]进一步地,所述的扫描系统进程的装置中,所述遍历单元4通过函数NtQuery Sy steml nf ormat 1n传递参数Sy stemHand Ie Inf ormat 1n,得到结构为PSYSTEM_HANDLE_INF0RMAT10Ν_ΕΧ的系统句柄表;然后逐一遍历系统句柄表中的句柄信息HandleInfo;
[0092]当判断单元5判定句柄类型0b jectTypeNumber为进程类型时,记录单元6使用自实现函数NtOpenProcess传递参数PR0CESS_DUP_HANDLE打开HandleInfο.ProcessId并返回进程句柄,再使用自实现函数DuplicateOb ject实现句柄的复制和记录,最后通过自实现函数GetProcess ImageFi IeName获得当前进程的信息。
[0093]区别于现有技术,上述技术方案能够有效地全面扫描系统进程,包括某些通过特定途径隐藏的进程,从而达到提高系统安全性的目的。
[0094]需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括……”或“包含……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的要素。此夕卜,在本文中,“大于”、“小于”、“超过”等理解为不包括本数;“以上”、“以下”、“以内”等理解为包括本数。
[0095]本领域内的技术人员应明白,上述各实施例可提供为方法、装置、或计算机程序产品。这些实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。上述各实施例涉及的方法中的全部或部分步骤可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机设备可读取的存储介质中,用于执行上述各实施例方法所述的全 部或部分步骤。所述计算机设备,包括但不限于:个人计算机、服务器、通用计算机、专用计算机、网络设备、嵌入式设备、可编程设备、智能移动终端、智能家居设备、穿戴式智能设备、车载智能设备等;所述的存储介质,包括但不限于:RAM、R0M、磁碟、磁带、光盘、闪存、U盘、移动硬盘、存储卡、记忆棒、网络服务器存储、网络云存储等。
[0096]上述各实施例是参照根据实施例所述的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到计算机设备的处理器以产生一个机器,使得通过计算机设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0097]这些计算机程序指令也可存储在能引导计算机设备以特定方式工作的计算机设备可读存储器中,使得存储在该计算机设备可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0098]这些计算机程序指令也可装载到计算机设备上,使得在计算机设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0099]尽管已经对上述各实施例进行了描述,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改,所以以上所述仅为本发明的实施例,并非因此限制本发明的专利保护范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围之内。
【主权项】
1.一种扫描系统进程的方法,其特征在于,包括步骤: 于内存中加载ntdll.dll文件,获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息; 通过反汇编查看ntdll.dll下所述私有API函数对应的源代码,再通过汇编根据所述私有API函数信息实现从R3到RO的调用; 遍历系统句柄表以获取系统所有内核句柄信息,并逐一判断是否进程句柄,如是则对其进行复制和记录,然后获得进程信息。2.如权利要求1所述的扫描系统进程的方法,其特征在于,在步骤“于内存中加载ntdll.dll文件”之前还包括步骤: 获取系统版本信息。3.如权利要求2所述的扫描系统进程的方法,其特征在于,步骤“获取系统版本信息”具体包括: 通过 GetProcAddress 函数获得 Kerne 132.dll 下的GetNativeSystemInf ο 函数的调用地址; 调用GetNativeSystemInfo函数获得结构为SYSTEM_INFO的系统信息Si; s1.wProcessorArchitecture 等于 PR0CESS0R_ARCHITECTURE_AMD64(9)或 PR0CESS0R_ARCHITECTURE_IA64(6),则判定系统版本为64位;否则系统版本为32位。4.如权利要求1或2所述的扫描系统进程的方法,其特征在于,步骤“于内存中加载ntdl 1.dl I文件,获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息”具体包括如下步骤: 于内存中加载ntdll.dll文件; 解析文件的PE头,获得导出表的相对虚拟地址RVA值,并转换为到源文件中的位移,从而得到源文件中导出表及其对应的结构为IMAGE_EXPORT_D IRECT0RY的信息; 根据导出表及其对应的结构为頂AGE_EXPORT_D I RECTORY的信息,通过匹配函数名的方法,获取枚举进程所需的私有API函数的AddressOfNameOrdinals的序号,并通过该序号计算得到函数服务号和Win7下ECX的偏移。5.如权利要求1或2所述的扫描系统进程的方法,其特征在于,步骤“遍历系统句柄表以获取系统所有内核句柄信息,并逐一判断是否进程句柄,如是则对其进行复制和记录,然后获得进程信息”具体包括: 通过函数 NtQuery Sy stemlnf ormat 1n 传递参数 Sy stemHandle Informat 1n,得到结构为PSYSTEM_HANDLE_I NF0RMAT10N_EX 的系统句柄表; 逐一遍历系统句柄表中的句柄信息HandleInfo,当判定句柄类型Ob jectTypeNumber为进程类型时,使用自实现函数NtOpenProcess传递参数PROCESS_DUP_HANDLE打开HandleInf0.ProcessId并返回进程句柄,再使用自实现函数DuplicateOb ject实现句柄的复制和记录,最后通过自实现函数GetProcess ImageFi IeName获得当前进程的信息。6.—种扫描系统进程的装置,其特征在于,包括加载单元、信息获取单元、调用单元、遍历单元、判断单元和记录单元: 所述加载单元用于在内存中加载ntdll.dll文件 所述信息获取单元用于获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信 息; 所述调用单元用于通过反汇编查看ntdll.dll下所述私有API函数对应的源代码,再通过汇编根据所述私有API函数信息实现从R3到RO的调用; 所述遍历单元用于遍历系统句柄表以获取系统所有内核句柄信息; 所述判断单元用于判断遍历单元所遍历的内核句柄是否进程句柄,如是则记录单元对其进行复制和记录,然后获得进程信息。7.如权利要求6所述的扫描系统进程的装置,其特征在于,还包括系统版本获取单元,用于获取系统版本信息。8.如权利要求7所述的扫描系统金曾的装置,其特征在于,系统版本获取单元获取系统版本信息具体包括: 通过 GetProcAddress 函数获得 Kerne 132.dll 下的GetNativeSy stemlnf ο 函数的调用地址; 调用GetNativeSystemInfo函数获得结构为SYSTEM_INFO的系统信息Si; 若si.wProcessorArchitecture等于PR0CESS0R_ARCHITECTURE_AMD64(9)或PROCESSOR_ARCHITECTURE_IA64(6),则判定系统版本为64位;否则系统版本为32位。9.如权利要求6或7所述的扫描系统进程的装置,其特征在于,所述加载单元于内存中加载ntdll.dll文件后,所述信息获取单元获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息具体包括: 解析文件的PE头,获得导出表的相对虚拟地址RVA值,并转换为到源文件中的位移,从而得到源文件中导出表及其对应的结构为IMAGE_EXPORT_D IRECT0RY的信息; 根据导出表及其对应的结构为頂AGE_EXPORT_D I RECTORY的信息,通过匹配函数名的方法,获取枚举进程所需的私有API函数的AddressOfNameOrdinals的序号,并通过该序号计算得到函数服务号和Win7下ECX的偏移。10.如权利要求6或7所述的扫描系统进程的装置,其特征在于,所述遍历单元通过函数NtQuery Sy steml nf ormat 1n传递参数Sy stemHand Ie Inf ormat 1n,得到结构为PSYSTEM_HANDLE_INF0RMAT10Ν_ΕΧ的系统句柄表;然后逐一遍历系统句柄表中的句柄信息HandleInfo; 当判断单元判定句柄类型ObjectTypeNumber为进程类型时,记录单元使用自实现函数NtOpenProces s传递参数 PR0CESS_DUP_HANDLE 打开 Hand Ie Inf0.Process Id并返回进程句柄,再使用自实现函数DuplicateObject实现句柄的复制和记录,最后通过自实现函数GetProcess ImageFi IeName获得当前进程的信息。
【专利摘要】为实现查出被进程活动链表忽略而实质上又在被执行的隐藏进程,发明人提供了一种扫描系统进程的方法,包括步骤:于内存中加载ntdll.dll文件,获取枚举进程所需的私有API函数信息和Win7下的ECX偏移信息;通过反汇编查看ntdll.dll下所述私有API函数对应的源代码,再通过汇编根据所述私有API函数信息实现从R3到R0的调用;遍历系统句柄表以获取系统所有内核句柄信息,并逐一判断是否进程句柄,如是则对其进行复制和记录,然后获得进程信息。发明人同时提供了实现上述方法的扫描系统进程的装置。本方案能够有效地全面扫描系统进程,包括某些通过特定途径隐藏的进程,从而达到提高系统安全性的目的。
【IPC分类】G06F21/56
【公开号】CN105488415
【申请号】CN201510857173
【发明人】张春双, 刘德建, 陈宏展, 方振华, 李上杰
【申请人】福建天晴数码有限公司
【公开日】2016年4月13日
【申请日】2015年11月30日

最新回复(0)