【驱动笔记14】初步认识MDL
来源:互联网 发布:算法导论 视频教程 编辑:程序博客网 时间:2024/06/05 05:10
前段时间在群里有人问起什么是MDL,当时三言两语也不知道解释清楚了没,今天闲着无事,索性记录下来吧,就当是做个笔记,以后忘了也好查阅。
我们知道,系统中一些重要的表项如SSDT是只读的,如果我们强行对其进行修改就会造成BSOD的严重后果。当然这种保护方式很容易被绕过,我们曾经介绍了通过修改cr0来禁用WP(WriteProtect,写保护)位的方法,现在再介绍一种不需要使用汇编的方法,就是MDL。
MDL的全称是Memory DescriptorList,即内存描述符表。我们可以通过MDL描述一块内存区域,在MDL中包含了该内存区域的起始地址、拥有者进程、字节数量、标记等信息,如下所示:
typedef struct _MDL
{
} MDL, *PMDL;
我们先来看一段在SSDT HOOK中常见的代码,如下所示:
PMDL MDSystemCall;
PVOID *MappedSCT;
MDSystemCall = MmCreateMdl(NULL,KeServiceDescriptorTable
if(!MDSystemCall)
{
}
MmBuildMdlForNonPagedPoo
MDSystemCall->MdlFlags |=MDL_MAPPED_TO_SYSTEM_VA;
MappedSCT = MmMapLockedPages(MDSystemCall, KernelMode);
HookOn( ZwTerminateProcess, New_ZwTerminateProcess);
其中KeServiceDescriptorTable
后面的代码首先从不分页的内存池中BuildMDL,然后添加一个MDL_MAPPED_TO_SYSTEM_VA标记以便允许写入该内存区域;然后我们将这块内存锁起来,现在可以就开始HOOKSSDT了,直到关闭HOOK后才将其释放。从这里就可以看出,这种方式明显没有修改cr0的方法好,呵呵呵呵。
不过这种方法的应用范围比较广,控制精度也较好,精确地指定了要修改哪一块内存的标记,两者方法算是各有千秋吧,谁喜欢用哪一种都可以
- 【驱动笔记14】初步认识MDL
- 初步认识MDL
- 初步认识MDL
- 初步认识MDL
- 初步认识MDL
- 初步认识MDL
- 驱动笔记----MDL(close Write Protect)
- 初步认知MySQL metadata lock(MDL)
- C++ 学习笔记_0001_初步认识
- 001.【笔记】android socket 初步认识
- Hibernate学习笔记<一> 初步认识Hibernate
- Qt学习笔记1:初步认识控件
- MDL
- MDL
- MDL
- MDL
- MDL
- Linux驱动学习12(初步认识内存管理)
- 线性表
- C经典 使用选择排序排列字符串数组
- 世界经济考题与考点
- redis主从不同步问题处理
- 两个JFramen之间的通信
- 【驱动笔记14】初步认识MDL
- canvas学习绘制图片和添加图片等等一
- CSS3滤镜-水平和垂直翻转图片
- 数组指针和指针数组的区别
- 关于AsyncTask-异步任务的简单理解
- 乱码问题总结
- 关于火狐下SyntaxError: missing ] after element list
- 字典序全排列
- IO学习(十)了解解码与编码,用转换流处理乱码问题