枚举进程——暴力搜索内存(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层,通过上面的方法,就可以搜索出内存中的所有进程。
下面是关键部分源码:
一个进程要运行,必然会加载到内存中,断链隐藏进程只是把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); }
相关文章推荐
- 大数据_JAVA_第二天_进制转化和补码存储方式
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- 《我是一只IT小小鸟》读后感
- Don't Block on Async Code【转】
- git在windows命令行下使用
- 【SSH进阶之路】Spring的IOC逐层深入——Spring的IOC原理[通俗解释一下](三)
- Linux基本命令――管理目录和文件的属性
- GitHub 优秀的 Android 开源项目
- dom内容区域的滚动overflow,scroll
- [Java] 设计模式
- 【kAri OJ 616】Asce的树
- 学习进度条
- 【SSH进阶之路】Spring的IOC逐层深入——为什么要使用IOC[实例讲解](二)
- linux服务器 keepalived双机热备实例 推荐
- Cpp--改变形参指针无法实现双向传值的问题
- javascript中的事件解析与示例
- 【SSH进阶之路】Spring简介,搭建Spring环境——轻量级容器框架(一)
- leetcode(20. Valid Parentheses)
- Linux和WINDOWS下JAVA代码实现,用命令行实现对apk包重新签名打包优化
- Caffe上训练使用自己的数据