首页
社区
课程
招聘
[求助]MDL原理求助!!!
发表于: 2013-12-16 19:03 8858

[求助]MDL原理求助!!!

2013-12-16 19:03
8858
MDL(Memory Descriptor List)负责描述一块内存区域。文档里说是负责VA到PA的映射。分配这样一个结构,并用IoAllocateMdl初始化等,就可以使用了。
在进行SSDT hook的时候,我们用原始的SSDT地址去初始化一个MDL,修改MDL的flag,并用MmMapLockedPages锁住,MmMapLockedPages返回的地址就是具体的SSDT的页起始地址。也就是SSDT的VA转换后的页地址?对吗?这个页地址可以直接拿来访问?转换只需要最后的一步,就是页内存贮的PA?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
搞清楚什么叫VA什么叫PA在搞这些不行吗。。。。急功近利的。。。

MDL描述的是一段物理地址,map动作仅仅就是新建一段虚拟地址,并把这个虚拟地址与MDL描述的物理地址对应起来。

这样做了后,就可以实现多个不同的VA对应同一个PA,比如这里,map出来的地址与ssdt原本的地址,对应的实际物理设备都是相同的(即都是同一段物理内存设备),所以看到的内容就是一样的
2013-12-16 20:49
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
就好比一个人,这个人的肉身相当于这里说的物理存储设备,也就是PA,但是这个人可以有N个不同名字(VA),每map一次,就等价于这个人又取了一个新名字,但这些名字始终都代表的是同一个人。
2013-12-16 20:52
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
对于物理存储设备来说(内存条),是不存在只能读或者只能写的权限的,这些限制都仅仅是那些不同的名字里自带了这些特征值,CPU在处理一个名字时(VA),会自动检查这些特征值,然后分别处理。

你自己map时没有设定只读权限,那map出来的VA就是可读的,写权限也是一样的情况
2013-12-16 21:01
0
雪    币: 7
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢,我终于明白MDL到底在做什么了。它就是描述了一段PA,有了这个描述之后,我们可以利用这个描述创建一个新的VA到PA的映射,同时定义新的VA的属性。
2013-12-16 22:24
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
说白了就是对同一块物理地址的不同虚拟映射
2013-12-17 00:25
0
雪    币: 1631
活跃值: (3810)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个东西心里明白,但表达出来确实不太好表达,我楼上正解。
2013-12-17 00:45
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
8
我来贴代码了,这段代码广泛应用在各种hook之前(利用MDL使hook地址可写),看看有没有参考价值:
//
// 逆向自某个主动防御
//
PMDL MakeAddrWritable (ULONG ulOldAddress, ULONG ulSize, PULONG pulNewAddress) 
{
	PVOID pNewAddr;
	PMDL pMdl = IoAllocateMdl((PVOID)ulOldAddress, ulSize, FALSE, TRUE, NULL);
	if (!pMdl)
		return NULL;
	PAGED_CODE();

	__try {
		MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess);
	} __except (EXCEPTION_EXECUTE_HANDLER) {
		IoFreeMdl(pMdl);
		return NULL;
	}
	
	if ( pMdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | MDL_SOURCE_IS_NONPAGED_POOL ))
		pNewAddr = pMdl->MappedSystemVa;
	else                                            // Map a new VA!!!
		pNewAddr = MmMapLockedPagesSpecifyCache(pMdl, KernelMode, MmCached, NULL, FALSE, NormalPagePriority);

	if ( !pNewAddr ) {
		MmUnlockPages(pMdl);
		IoFreeMdl(pMdl);
		return NULL;
	}

	if ( pulNewAddress )
		*pulNewAddress = (ULONG)pNewAddr;
	
	return pMdl;
}
2013-12-17 11:34
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习了 看懂了 吸收,,,多谢
2013-12-18 19:19
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
就是新建一块虚拟内存(不分配物理内存),这块虚拟内存的属性是自己设置的。
用这块虚拟内存去对应你要修改的物理内存,当你对这个新的虚拟内存操作的时候,会通过检查。

而你使用受CR0保护的虚拟地址修改时,不会通过检查。
2013-12-19 13:13
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
这和写时拷贝是相反的,写时拷贝是当地写入一段内存地址,将该操作的虚拟地址映射至别的物理内存。
而MDL是将别的虚拟地址映射到同样的物理地址。
2013-12-19 13:15
0
游客
登录 | 注册 方可回帖
返回
//