【精选】[2-7]内核里操作进程[2-7]内核里操作进程.pdf

【精选】[2-7]内核里操作进程[2-7]内核里操作进程.pdf

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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”,

文档评论(0)

tazhiq2 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档