- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【精选】[2-7]内核里操作进程[2-7]内核里操作进程
WIN64 内核编程基础班(作者:胡文亮;QQ:1923208126)
在内核里操作进程,相信是很多对WINDOWS 内核编程感兴趣的朋友第一个学习的知识
点。但在这里,我要让大家失望了,在内核里操作进程没什么特别的,就标准方法而言,还
是调用那几个和进程相关的NATIVE API 而已 (当然了,本文所说的进程操作,还包括对线程
和DLL 模块的操作)。本文包括10 个部分:分别是:枚举进程、暂停进程、恢复进程、结束
进程、枚举线程、暂停线程、恢复线程、结束线程、枚举DLL 模块、卸载DLL 模块。
1.枚举进程。进程就是活动起来的程序。每一个进程在内核里,都有一个名为 EPROCESS 的
巨大结构体记录它的详细信息,包括它的名字,编号(PID),出生地点(进程路径),老爹
是谁(PPID 或父进程 ID)等。在RING3 枚举进程,通常只要列出所有进程的编号即可。不
过在RING0 里,我们还要把它的身份证 (EPROCESS)地址给列举出来。顺带说一句,现实中
男人最怕的事情就是“喜当爹”,这种事情在内核里更加容易发生。因为EPROCESS 里有且只
有一个成员是记录父进程ID 的,稍微改一下,就可以认任意进程为爹了。枚举进程的方法
很多,标准方法是使用ZwQuerySystemInformation 的SystemProcessInformation 功能号,不
过如果在内核里也这么用的话,那就真是脱了裤子放屁——多此一举。因为在内核里使用这
个函数照样是得不到进程的EPROCESS 地址,而且一旦内存出错,还会蓝屏,更加逃不过任
何隐藏进程的手法。所以在内核里稳定又不失强度的枚举进程方法是枚举 PspCidTable,它
能最大的好处是能得到进程的EPROCESS 地址,而且能检查出使用“断链”这种低级手法的
隐藏进程。不过话也说回来,枚举PspCidTable 并不是一件很爽的事情,因为PspCidTable 是
一个不公开的变量,要获得它地址的话,必然要使用硬编码或者符号。所以我的方法是:变
相枚举PspCidTable 。内核里有个函数叫做PsLookupProcessByProcessId,它能通过进程PID 查
到进程的 EPROCESS,它的内部实现正是枚举了 PspCidTable。PID 的范围是从 4 开始,到
MAX_INT (2^31-1)结束,步进为4 。但实际上,大家见到的PID 基本都是小于10000 的,
而上 10000 的 PID 相信很多人都没有见过。所以我们实际的枚举范围是 4~2^18,如果
PsLookupProcessByProcessId 返回失败,则证明此进程不存在,如果返回成功,则把EPROCESS、
PID、PPID、进程名打印出来。
//声明API
NTKERNELAPI UCHAR* PsGetProcessImageFileName( IN PEPROCESS Process );
NTKERNELAPI HANDLE PsGetProcessInheritedFromUniqueProcessId( IN PEPROCESS Process );
//根据进程ID 返回进程EPROCESS,失败返回NULL
PEPROCESS LookupProcess(HANDLE Pid)
{
PEPROCESS eprocess=NULL;
if( NT_SUCCESS(PsLookupProcessByProcessId(Pid, eprocess)) )
return eprocess;
else
return NULL;
}
//枚举进程
VOID EnumProcess()
{
ULONG i=0;
PEPROCESS eproc=NULL;
for(i=4; i262144; i=i+4)
WIN64 内核编程基础班(作者:胡文亮;QQ:1923208126)
{
eproc=LookupProcess((HANDLE)i);
if(eproc!=NULL)
{
DbgPrint(“EPROCESS=%p, PID=%ld, PPID=%ld, Name=%s”,
您可能关注的文档
- 【精选】6.1 方程求根的二分法6.1 方程求根的二分法.ppt
- 【精选】6.1 建设工程安全监理基本概念6.1 建设工程安全监理基本概念.pdf
- 【精选】6-有导师学习神经网络的回归拟合6-有导师学习神经网络的回归拟合.ppt
- 【精选】6.1-1人体对振动的反应武汉理工大学,汽车理论A6.1-1人体对振动的反应武汉理工大学,汽车理论A.pdf
- 【精选】6.1.1 TT6.1.1 TT.doc
- 【精选】6.1950、60年代的诗歌创作6.1950、60年代的诗歌创作.ppt
- 【精选】6.0 建筑电气系统--简介6.0 建筑电气系统--简介.ppt
- 【精选】6.1《游戏公平—谁先走》课件6.1《游戏公平—谁先走》课件.ppt
- 【精选】6.1.01直面挫折6.1.01直面挫折.ppt
- 【精选】6.1中国绿色建筑发展的三大前景6.1中国绿色建筑发展的三大前景.doc
文档评论(0)