首页
社区
课程
招聘
[旧帖] [原创]小菜刚学SSDT的一些总结 0.00雪花
2010-11-1 16:12 1775

[旧帖] [原创]小菜刚学SSDT的一些总结 0.00雪花

2010-11-1 16:12
1775
菜鸟,这段时间内在学rootkit..学完SSDT HOOK(当然是最基本的..做一个总结);说错了,请大牛指出,别鄙视
SSDT:称为系统服务调度表,用于内核和用户层面的桥梁..
定义为:
#pragma pack(1)
typedef struct _ServiceDescriptorEntry{
    unsigned int *ServiceTableBase;     //SSDT的基址
    unsigned int *ServiceCounterTableBase;
    unsigned int NumberOfServices;      //SSDT的项数
    unsigned char *ParamTableBase;
}ServiceDescriptorEntry,*PServiceDescriptorEntry;
#pragma pack()
该结构内核导出的标量名字为:KeServiceDescriptorTable..

SSDT HOOK:最基本的就是,原对指向SSDT指向的函数的地址,指向自己的函数..进行过滤
但由于SSDT是只读的,任何合法的程序不能修改这个表:
有两个方案,可以解决(我是菜鸟,目标只了解到两个)..- -.
可以通过MDL,或者修改cr0..

1.MDL其实就是一个内存区域.包含了该内存区域的起始地址,拥有进程,字节数量;
typedef struct _MDL{
   struct _MDL *Next;
   CSHORT Size;
   CSHORT MdlFlags;       ;在用SSDT hook,只要主意这里,加上 (|=)MDL_MAPPED_TO_SYSTEM_VA;这个标志
   struct _ERPROCESS *Process;
   PVOID MappedSystemVa;
   PVOID StartVa;
   ULONG ByteCount;
   ULONG ByteOffset;
}MDL,*PMDL;
用MDL,具体过程代码里有详细的解释..是网上的一些源代码改写的..我用的是VC2008,编译器..

2.cr0.
__asm{//去掉内存保护
    cli
         mov  eax,cr0
    and  eax,not 10000h
    mov  cr0,eax
  }

  //HOOK SSDT or 恢复...

  __asm{//恢复内存保护  
          mov  eax,cr0
    or   eax,10000h
    mov  cr0,eax
    sti
  }

学驱动,这方面最大的感触..不是编出来,是蓝出来的..和正在学驱动这方面,一起努力..- -

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (11)
雪    币: 46
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wlzailsn 2010-11-2 11:15
2
0
我想知道为什么给CR0 一个和 not 10000 相与的值。就会去除保护呢?
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
猥琐菜鸟 2010-11-2 11:33
3
0
CR0的第31位是分页允许位(Paging Enable),PG=0,禁用分页管理机制,此时分段管理机制产生的线性地址直接作为物理地址使    用;PG=1,启用分页管理机制,此时线性地址经分页管理机制转换位物理地址。
雪    币: 46
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wlzailsn 2010-11-2 11:49
4
0
就是说。通过禁止页寻址的方式。来修改SSDT

这么干是不是有点太大动干戈了?

不能通过SSDT所在的PTE 修改相应的权限吗?

我是新说。纯提问
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
猥琐菜鸟 2010-11-2 11:54
5
0
哈哈..你是新手的话...那我就是连皮毛都不知道的人...
你说的.PTE.现在没看到过.不知道.看来得找找资料..
一起进步..哈..
雪    币: 46
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wlzailsn 2010-11-2 12:20
6
0
PTE是page table entry就是页表里某一具体的项。
前20位是该逻辑地址所指向的物理地址。后12位为控制位(是否在内存中,是否可读写)

我对linux内核还算熟悉。但是windows的才开始学

一起进步!
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mhuxiaotao 2010-11-4 17:29
7
0
向楼主学习哈!
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
unknownace 2010-11-4 17:37
8
0
看来我已经菜到看不懂的地步了~~不过我已经习惯了~
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
watertao 2010-11-4 18:28
9
0
谢lz分享哦!
雪    币: 258
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
delphipan 2010-11-5 00:17
10
0
谢谢分享~!
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
swzi 2010-11-5 15:14
11
0
谢谢楼主分享!学习了。
雪    币: 46
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
scusword 2010-11-6 10:35
12
0
我也在学ssdt,不知道楼主有没有神马资料呢?
游客
登录 | 注册 方可回帖
返回