首页
社区
课程
招聘
[分享]一个小小的内核遍历程序
发表于: 2014-2-17 14:40 5617

[分享]一个小小的内核遍历程序

2014-2-17 14:40
5617
#include <ntddk.h>

VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
}

NTSTATUS DriverEntry(
        PDRIVER_OBJECT pDriverObject,
        PUNICODE_STRING pRegistryPath)
{
    PEPROCESS pEprocess = NULL;
    PEPROCESS pFirstEprocess = NULL;
    ULONG ulProcessName = 0;
    ULONG ulProcessId = 0;

   
    pDriverObject->DriverUnload = DriverUnload;
    pEprocess = PsGetCurrentProcess();
   
    if ( pEprocess == 0 )
    {
        KdPrint(("PsGetcurrentProcess Error ! \r\n"));
        return STATUS_SUCCESS;
    }
   
    pFirstEprocess = pEprocess;
   
    while ( pEprocess != NULL )
    {
        ulProcessName = (ULONG)pEprocess + 0x174;
        ulProcessId = *(ULONG *)((ULONG)pEprocess + 0x84);
        KdPrint(("ProcessName = %s, ProcessId = %d \r\n", ulProcessName, ulProcessId));
        pEprocess = (PEPROCESS)(*(ULONG *)((ULONG)pEprocess + 0x88) - 0x88);
        
      
    }
   
    return STATUS_SUCCESS;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
虽然论坛8年前都有了,但是还是感谢楼主开源啊,楼主继续放宝码。。。。。。
2014-2-17 15:00
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
枚举进程 = =
2014-2-17 15:15
0
雪    币: 67
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
命令行编译:

BUILD: Computing Include file dependencies:
BUILD: Examining d:\zzz directory for files to compile.
oacr invalidate root:x86chk /autocleanqueue
warnings in directory d:\zzz
process.c does not exist
1>Compiling and Linking d:\zzz *************
1>'nmake.exe /nologo BUILDMSG=Stop. -i BUILD_PASS=PASS2 LINKONLY=1 NOPASS0=1 MAKEDIR_RELATIVE_TO_BASEDIR='
1>d:\zzz: TARGETPATH is .
1>BUILDMSG: _NT_TARGET_VERSION SET TO WS03
1>NMAKE : fatal error U1073: don't know how to make 'd:\zzz\objchk_wnet_x86\i386\process.obj'
1>errors in directory d:\zzz
1>NMAKE : fatal error U1073: don't know how to make 'd:\zzz\objchk_wnet_x86\i386\process.obj'
1>Stop.
1>nmake.exe /nologo BUILDMSG=Stop. -i BUILD_PASS=PASS2 LINKONLY=1 NOPASS0=1 MAKEDIR_RELATIVE_TO_BASEDIR= failed - rc = 2
2014-2-17 16:12
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我的目的是让更多的人喜欢上驱动编程哈,体会到编程的乐趣。其实我只是菜鸟哈。我上传了附件,给菜鸟们一个玩驱动的小例子。
2014-2-17 16:55
0
雪    币: 209
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好像有Bug:
Win2003下永无止境的打印...
2014-2-17 17:48
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼上可以加一句
if(pFirstEprocess==pEprocess||(*(LONG *)((LONG)pEprocess + 0x84))<0)
{
break;
}
我在xp下列举的话还是可以的。
我加了这句反而枚举不全了。

while ( pEprocess != NULL )
    {
        ulProcessName = (ULONG)pEprocess + 0x174;
        ulProcessId = *(ULONG *)((ULONG)pEprocess + 0x84);
        KdPrint(("ProcessName = %s, ProcessId = %d \r\n", ulProcessName, ulProcessId));
        pEprocess = (PEPROCESS)(*(ULONG *)((ULONG)pEprocess + 0x88) - 0x88);

if(pFirstEprocess==pEprocess||(*(LONG *)((LONG)pEprocess + 0x84))<0)
{
break;
}
     
    }

楼上还可以使用livekd !process 0 0手动遍历一下你的系统下的进程,就应该了解了。
因为我的系统xp的最后一个进程后的进程名就是???了
你的系统的进程链表如果是无限循环的话,有可能最后一个进程又指向第一个进程了。你可以吧print出来的东西生成一个txt看看是不是这样。
2014-2-17 20:25
0
雪    币: 209
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
可以了!

上传的附件:
2014-2-18 00:34
0
雪    币: 209
活跃值: (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
上传的附件:
2014-2-18 00:52
0
游客
登录 | 注册 方可回帖
返回
//