欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

xp sp3下简单遍历ActiveProcessLinks获取进程

xp sp3下简单遍历ActiveProcessLinks获取进程

先声明~我是小菜,初学windows驱动,欢迎各位大牛拍砖~~
先放代码~
/*
从ActiveProcessLink上遍历进程
*/
VOID GetProcess()
{
  //获取EPROCESS结构
  ULONG epadr = (ULONG)PsGetCurrentProcess();
  if((epadr == 0) || (epadr == 0xffffffff)){
    KdPrint(("Can't get the process!\n"));
    return;
  }
  //获取ActiveProcessLink链表,EPROCESS+0X88是ActiveProcessLink节点
  LIST_ENTRY* pActPro = (LIST_ENTRY*)(epadr + 0x88);
  LIST_ENTRY* bC = pActPro;
  //获取保存文件名的ImageFileName数组,EPROCESS+0X174是ImageFileName数组
  UCHAR* ImageFileName = (UCHAR*)(epadr + 0x174);
  do{
    KdPrint(("%s.\n",ImageFileName));
    //遍历链表
    pActPro = (LIST_ENTRY*)pActPro->Flink;
    //获得ImageFileName
    _asm{
      mov eax,pActPro
      add eax,236
      mov ImageFileName,eax
    }
  }while(pActPro->Flink != bC);
}
#pragma LOCKEDCODE
extern "C" NTSTATUS DriverEntry (
      IN PDRIVER_OBJECT pDriverObject,
      IN PUNICODE_STRING pRegistryPath  ) 
{
#ifdef  DBG
  _asm int 3
#endif
  KdPrint(("进入驱动入口\n"));
  
  GetProcess();
  KdPrint(("DriverEntry end\n"));
  return STATUS_SUCCESS;
}
在EPROCESS中,ActiveProcessLinks域是一个双链表节点,在windows中,所有活动进程都连接在一起,构成一个双链表,表头是全局变量PsActiveProcessHead。当一个进程创建时,其ActiveProcessLinks域将作为节点加入到此链表中;当进程删除是,则从链表中移除。
但是为什么System Idle Process不能在链表中遍历出来呢?想不通。。。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功