能力值:
( LV2,RANK:10 )
|
-
-
2 楼
就是定义KeServiceDescriptorTable结构吧
我也不明白其中原理 为什么这样定义 就可以利用 KeServiceDescriptorTable获取ssdt成员了
|
能力值:
( 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模式的
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
你怎么知道没有,人家库里面有呢!
|
能力值:
( LV12,RANK:1010 )
|
-
-
5 楼
已经被你的DDK定义过了.
你引用的时候加个extern ,就不是重复申明变量了.而是引用之~~
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我在3楼又提了一个问题,现在还是弄不懂啊,谁来解答一下啊
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
可以参考以下这篇文章,里面提到系统服务号101h,NtTerminateProcess和ZwTerminateProcess的关系:
标 题: 【原创】内核态进程管理器Intercessor和实现细节
作 者: greatcsk
时 间: 2007-09-05,20:20
链 接: http://bbs.pediy.com/showthread.php?t=51157
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
内核下,ZwXxx函数还是会走int 2e这条路,为的是把PreviousMode变为KernelMode。NtXxx是真正实现的地方。SSDT里面放的是NtXxx的函数地址。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
可是我用工具查看ntoskrnl.exe文件,并没有发现有NtTerminateProcess这个函数啊
|
能力值:
( LV8,RANK:130 )
|
-
-
10 楼
Nt开头的是ntdll.dll导出的,ntoskrnl.exe导出的是Zw开头的函数
|
|
|