您的位置:首页 > 其它

枚举进程——暴力搜索内存(Ring0)

2016-03-09 12:18 671 查看
上面说过了隐藏进程,这篇博客我们就简单描述一下暴力搜索进程。

一个进程要运行,必然会加载到内存中,断链隐藏进程只是把EPROCESS从链表上摘除了,但它还是驻留在内存中的。这样我们就有了找到它的方法。

在内核中,传入进程ID,通过ZwOpenProcess得到句柄,再传入句柄,通过ObReferenceObjectByHandle,可以获得EPROCESS,既然获得了EPROCESS,问题就迎刃而解了。

既可以选择用加偏移的方法得到进程名,也可以用PsGetProcessFileName来获取进程名。这样就得到了进程的信息。

所以,我们从0枚举到一个很大的数,比如100000(我们所见过的进程ID没有大过100000的),作为进程ID,为了提高效率,可以只把4的倍数作为进程ID(进程ID都是4的倍数),在Ring3层通过OpenProcess打开,如果得到的句柄不为空,在将其ID传入Ring0层,通过上面的方法,就可以搜索出内存中的所有进程。

下面是关键部分源码:

BOOLEAN
GetProcessImageNameByProcessID(/*IN*/ULONGulProcessID,/*OUT*/char*szProcessImageName,/*OUT*/ULONG*ulProcessNameLen)
{
CLIENT_IDCid;
HANDLEhProcess;
NTSTATUSStatus;
OBJECT_ATTRIBUTESoa;
PEPROCESSEProcess=NULL;

Cid.UniqueProcess=(HANDLE)ulProcessID;
Cid.UniqueThread=0;

InitializeObjectAttributes(&oa,0,0,0,0);

Status=ZwOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&oa,&Cid);

if(!NT_SUCCESS(Status))
{
returnFALSE;
}

Status=ObReferenceObjectByHandle(hProcess,FILE_READ_DATA,0,
KernelMode,&EProcess,0);

if(!NT_SUCCESS(Status))
{

ZwClose(hProcess);
returnFALSE;
}

ObDereferenceObject(EProcess);//上面用过ObReferenceObjectByHandle,所以这里要解一次引用计数

*ulProcessNameLen=strlen((constchar*)PsGetProcessImageFileName(EProcess));

memcpy(szProcessImageName,(constchar*)PsGetProcessImageFileName(EProcess),*ulProcessNameLen);
DbgPrint("%s\r\n",szProcessImageName);

ZwClose(hProcess);
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: