首页
社区
课程
招聘
[旧帖] [原创]Win8.1 x64 nt!KiServiceTable定位 0.00雪花
发表于: 2014-4-24 15:01 1653

[旧帖] [原创]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。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//