首页
社区
课程
招聘
[求助]extern PServiceDescriptorTable KeServiceDescriptorTable;这样定义是什么意思啊??请进......
发表于: 2008-12-19 15:08 10549

[求助]extern PServiceDescriptorTable KeServiceDescriptorTable;这样定义是什么意思啊??请进......

2008-12-19 15:08
10549
typedef struct _ServiceDescriptorTable_ {
PVOID pSSDTBase;
PVOID pServiceCounterTable;
ULONG ulNumberOfServices;
PVOID pParamTableBase;
} ServiceDescriptorTable, *PServiceDescriptorTable;
extern PServiceDescriptorTable KeServiceDescriptorTable;
DDK里没有KeServiceDescriptorTable的定义,这个是从网上找来的,就是不知道extern PServiceDescriptorTable KeServiceDescriptorTable;这个定义是什么意思啊?????

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
就是定义KeServiceDescriptorTable结构吧
我也不明白其中原理 为什么这样定义 就可以利用 KeServiceDescriptorTable获取ssdt成员了
2008-12-19 15:50
0
雪    币: 200
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
下面代码是SSDT HOOK:
#include <ntddk.h>
typedef struct _ServiceDescriptorTable_ {
PVOID pSSDTBase;
PVOID pServiceCounterTable;
ULONG ulNumberOfServices;
PVOID pParamTableBase;
} ServiceDescriptorTable, *PServiceDescriptorTable;
extern PServiceDescriptorTable KeServiceDescriptorTable;
int oldtp;                        /*全局变量,存放ZwTerminateProcess的原始地址*/
NTSTATUS new_tp(HANDLE phandle,int exitcode)
{
        DbgPrint("enter my ZwTerminateProcess");
        return STATUS_SUCCESS;
}
VOID NT_unload(IN PDRIVER_OBJECT pDriverObject)
{
    *(int *)((int)KeServiceDescriptorTable->pSSDTBase+0x101*4)=oldtp;
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObj,IN PUNICODE_STRING pRegString)
{       
                UNICODE_STRING tp;
                RtlInitUnicodeString(&tp,L"ZwTerminateProcess");
                (PVOID)oldtp=MmGetSystemRoutineAddress(&tp);
        pDriverObj->DriverUnload=NT_unload;
        oldtp=*(int *)((int)KeServiceDescriptorTable->pSSDTBase+0x101*4);
                DbgPrint("ADDRESS of ZwTerminateProcess is:%x",oldtp);
        DbgPrint("ADDRESS of ZwTerminateProcess is:%x",*(int *)((int)KeServiceDescriptorTable->pSSDTBase+0x101*4));   /*0x101是ZwTerminateProcess在SSDT表中的索引*/
        _asm
        {
      mov eax,CR0
                and eax,0fffeffffh
                mov CR0,eax
        }
   *(int *)((int)KeServiceDescriptorTable->pSSDTBase+0x101*4)=(int)new_tp;    /*填入自定义的函数地址*/
        return STATUS_SUCCESS;
}现在的问题是:
DbgPrint("ADDRESS of ZwTerminateProcess is:%x",oldtp);
        DbgPrint("ADDRESS of ZwTerminateProcess is:%x",*(int *)((int)KeServiceDescriptorTable->pSSDTBase+0x101*4));   
这两个函数打印出来的结果不一样啊,不知道为什么??MmGetSystemRoutineAddress函数获得的不也是指向函数的地址吗????
有谁知道啊??????
我的系统是XP3,内存模式是PAE模式的
2008-12-19 18:56
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
4
你怎么知道没有,人家库里面有呢!
2008-12-19 19:14
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
已经被你的DDK定义过了.

你引用的时候加个extern ,就不是重复申明变量了.而是引用之~~
2008-12-19 20:04
0
雪    币: 200
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我在3楼又提了一个问题,现在还是弄不懂啊,谁来解答一下啊
2008-12-20 00:53
0
雪    币: 311
活跃值: (124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
可以参考以下这篇文章,里面提到系统服务号101h,NtTerminateProcess和ZwTerminateProcess的关系:

标 题: 【原创】内核态进程管理器Intercessor和实现细节
作 者: greatcsk
时 间: 2007-09-05,20:20
链 接: http://bbs.pediy.com/showthread.php?t=51157
2008-12-20 03:26
0
雪    币: 217
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
内核下,ZwXxx函数还是会走int 2e这条路,为的是把PreviousMode变为KernelMode。NtXxx是真正实现的地方。SSDT里面放的是NtXxx的函数地址。
2008-12-20 12:40
0
雪    币: 200
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
可是我用工具查看ntoskrnl.exe文件,并没有发现有NtTerminateProcess这个函数啊
2008-12-20 13:23
0
雪    币: 445
活跃值: (25)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
Nt开头的是ntdll.dll导出的,ntoskrnl.exe导出的是Zw开头的函数
2008-12-20 13:49
0
游客
登录 | 注册 方可回帖
返回
//