看流星社区

 找回密码
 注册账号
查看: 2332|回复: 0

内核实现遍历进程PID和进程名.显示隐藏的进程

[复制链接]

该用户从未签到

发表于 2013-4-28 08:39:43 | 显示全部楼层 |阅读模式
在上一个帖子中,我把我保护的那个进程 From1.exe    DebugPort调试端口值 清零了,OD调试器接受不到调试信息了,所以OD废了。在上图,我们也发现DebugPort 值全为0 ,这正常的,因为我没用OD调试 里面的任何进程。如果OD调试某进程的话,那么某进程的 DebugPort 值  就会变为 一个具体的数值,好像是一个 很小很小的负数。
-------------------------------
说完 DebugPort 值 ,继续。我们接下来的 连载。。。。,说得很少,很多不懂得知识点,可以直接回帖,或者百度。
-------------------------------
菜鸟驱动连载.内核实现遍历进程PID和进程名和DebugPort值,是依据进程链来遍历的,也就是依据进程的结构体的基址 来遍的。
------------------------------
这种遍历方法其实可以吧 隐藏的进程也可以 遍历出来的,因为我们是在内核里面遍历进程。。。xuetr的遍历就是采用驱动的。
本次遍历我们主要是进程名和进程PID 值。这2个东东在内核编程中有很大的用处,很多做内核 HOOK的技术都会用到这2东西。
-----------------------------

#include <ntddk.h>
PETHREAD pThreadObj = NULL;
BOOLEAN bTerminated = FALSE;
UCHAR szProcessName[10] = "Form1.exe";
extern POBJECT_TYPE *PsProcessType;
extern POBJECT_TYPE *PsThreadType;
VOID DriverUnload(PDRIVER_OBJECT pDriverObject);
VOID AntiDbgThread(PVOID pContext);
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath)
{
  OBJECT_ATTRIBUTES ObjAddr = {0};
  HANDLE ThreadHandle = 0;
  NTSTATUS NtStatus = STATUS_SUCCESS;
  KdPrint(("Driver Entry"));
  pDriverObject->DriverUnload = DriverUnload;
  InitializeObjectAttributes(&ObjAddr,NULL,OBJ_KERNEL_HANDLE,0,NULL);
  NtStatus = PsCreateSystemThread(&ThreadHandle,THREAD_ALL_ACCESS,&ObjAddr,NULL,NULL,AntiDbgThread,NULL);
  if(NT_SUCCESS(NtStatus))
  {
    KdPrint(("Thread Created"));
    NtStatus = ObReferenceObjectByHandle(ThreadHandle,THREAD_ALL_ACCESS,*PsThreadType,KernelMode,&pThreadObj,NULL);
    ZwClose(ThreadHandle);
    if(!NT_SUCCESS(NtStatus))
    {
      bTerminated = TRUE;
    }
  }
  return NtStatus;
}

VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
  bTerminated = TRUE;
  KeWaitForSingleObject(pThreadObj,Executive,KernelMode,FALSE,NULL);
  ObDereferenceObject(pThreadObj);
}

VOID AntiDbgThread(PVOID pContext)
{
  PEPROCESS pCurrentProcess = NULL;
  PEPROCESS pFirstProcess = NULL;
  LARGE_INTEGER inteval;
char *ProcessName;//进程名
ULONG PID;//进程pid
ULONG DebugPort;//调试端口
  inteval.QuadPart = -20000000;
  KeSetPriorityThread(KeGetCurrentThread(),LOW_REALTIME_PRIORITY);
    pCurrentProcess = IoGetCurrentProcess();
    pFirstProcess = pCurrentProcess;
           //  操作系统win7 32位 版 进程结构偏移  如下:
       //  +0x16c ImageFileName      //进程名 偏移
           //  +0x0b8 ActiveProcessLinks  //进程链,下一个 进程结构  偏移
           //  +0x0ec DebugPort      //传说中的调试端口 偏移
   
           //操作系统xp sp3 版的进程结构偏移  如下
            //  +0x174 ImageFileName      //进程名 偏移
           //  +0x088 ActiveProcessLinks  //进程链,下一个 进程结构  偏移
           //  +0x0bc DebugPort      //传说中的调试端口 偏移
    while(1) //当前进程名
    {
                 pCurrentProcess= (PEPROCESS)(*(PULONG)((ULONG)pCurrentProcess + 0xb8) - 0xb8);//至于这个,大家自己想,这个是+b8是进程链 ActiveProcessLinks 节点,这个节点减去 +b8  其实就是下一个进程的 进程结构基址,神奇的东东。。
                 ProcessName = (char*)((ULONG)pCurrentProcess+ 0x16C);//进程名
                 PID=PsGetProcessId(pCurrentProcess);//进程PID
                 DebugPort=*(PULONG)((ULONG)pCurrentProcess + 0xec);//进程端口
                 KdPrint(("DebugPort调试端口值%d 进程名: %s 进程PID:%d \n",DebugPort, ProcessName,PID));

      if(pCurrentProcess == pFirstProcess)
      {
                // KdPrint(("进程链表遍历结束,退出进程链表遍历"));
        goto END;
      }
    }  
END:
    KeDelayExecutionThread(KernelMode,FALSE,&inteval);
}
以上代码,注意是win7 32 位系统,才能通过的,如果你是xp系统推荐 把偏移修改下即可,绿色那部分就是,我注释了的。
如果你是 win7   64 位系统, OK你还是洗洗睡吧,或者换个win7 32 位系统,再或者 你向 微软 去 购买驱动签名。

游客,如果您要查看本帖隐藏内容请回复
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-4 08:02

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表