-
-
[旧帖] [原创]Win8.1 x64 nt!KiServiceTable定位 0.00雪花
-
发表于: 2014-4-24 15:01 1653
-
参考http://bbs.pediy.com/showthread.php?t=126106&highlight=ssdt+x64
整个的过程是按照上面这个资料的方法进行的,只是lcz没有给出代码,作为新人发个lcz的思路到代码的过程,望转正式会员~~~
代码段如下:
char * CodeScanStart = (char*)&ZwClose;
CodeScanStart = CodeScanStart + 0x1e;
int i = 0;
int co = 0;
i = (*(int *)(CodeScanStart-4));
CodeScanStart = CodeScanStart + i; //nt!KiServiceInternal
CodeScanStart = CodeScanStart + 0x61;
i = (*(int *)(CodeScanStart - 4));
CodeScanStart = CodeScanStart + i; //nt!KiSystemServiceStart
CodeScanStart = CodeScanStart + 0x1b;
i = (*(int *)(CodeScanStart - 4));
CodeScanStart = CodeScanStart + i; //nt!KeServiceDescriptorTable
PSERVICE_DESCRIPTOR_TABLE DESCRIPTOR_TABLE =(PSERVICE_DESCRIPTOR_TABLE)CodeScanStart;
按照lcz的思路先将ZwClose地址给一个char *类型变量。
然后在windbg中看ZwClose的反汇编代码,算出ZwClose起始地址到调用KiServiceInternal的下一条指令地址差为0x1e。
故加上0x14。
上一条是jmp指令,jmp使用的是和下一条指令的地址差来寻址。故去上一条跳转指令取得地址差,然后加到获得的jmp下一条指令地址上,就得到KiServiceInternal地址。
之后类似。
直到获得了KiServerDescriptorTable地址,和windbg比较没有错。
最后将其强制类型转换为SSDT结构。这个结构没导出,要自己声明。
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
PULONG ServiceTable;
PULONG ServiceCounterTable;
ULONG NumberOfService;
ULONG ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;
这个结构的第一个成员就是KiServiceTable。
整个的过程是按照上面这个资料的方法进行的,只是lcz没有给出代码,作为新人发个lcz的思路到代码的过程,望转正式会员~~~
代码段如下:
char * CodeScanStart = (char*)&ZwClose;
CodeScanStart = CodeScanStart + 0x1e;
int i = 0;
int co = 0;
i = (*(int *)(CodeScanStart-4));
CodeScanStart = CodeScanStart + i; //nt!KiServiceInternal
CodeScanStart = CodeScanStart + 0x61;
i = (*(int *)(CodeScanStart - 4));
CodeScanStart = CodeScanStart + i; //nt!KiSystemServiceStart
CodeScanStart = CodeScanStart + 0x1b;
i = (*(int *)(CodeScanStart - 4));
CodeScanStart = CodeScanStart + i; //nt!KeServiceDescriptorTable
PSERVICE_DESCRIPTOR_TABLE DESCRIPTOR_TABLE =(PSERVICE_DESCRIPTOR_TABLE)CodeScanStart;
按照lcz的思路先将ZwClose地址给一个char *类型变量。
然后在windbg中看ZwClose的反汇编代码,算出ZwClose起始地址到调用KiServiceInternal的下一条指令地址差为0x1e。
故加上0x14。
上一条是jmp指令,jmp使用的是和下一条指令的地址差来寻址。故去上一条跳转指令取得地址差,然后加到获得的jmp下一条指令地址上,就得到KiServiceInternal地址。
之后类似。
直到获得了KiServerDescriptorTable地址,和windbg比较没有错。
最后将其强制类型转换为SSDT结构。这个结构没导出,要自己声明。
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
PULONG ServiceTable;
PULONG ServiceCounterTable;
ULONG NumberOfService;
ULONG ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;
这个结构的第一个成员就是KiServiceTable。
赞赏
看原图
赞赏
雪币:
留言: