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

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

2010-11-1 16:12
1918
菜鸟,这段时间内在学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
  }

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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

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

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

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

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

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

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