能力值:
( LV3,RANK:30 )
|
-
-
2 楼
搞清楚什么叫VA什么叫PA在搞这些不行吗。。。。急功近利的。。。
MDL描述的是一段物理地址,map动作仅仅就是新建一段虚拟地址,并把这个虚拟地址与MDL描述的物理地址对应起来。
这样做了后,就可以实现多个不同的VA对应同一个PA,比如这里,map出来的地址与ssdt原本的地址,对应的实际物理设备都是相同的(即都是同一段物理内存设备),所以看到的内容就是一样的
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
就好比一个人,这个人的肉身相当于这里说的物理存储设备,也就是PA,但是这个人可以有N个不同名字(VA),每map一次,就等价于这个人又取了一个新名字,但这些名字始终都代表的是同一个人。
|
能力值:
( LV3,RANK:30 )
|
-
-
4 楼
对于物理存储设备来说(内存条),是不存在只能读或者只能写的权限的,这些限制都仅仅是那些不同的名字里自带了这些特征值,CPU在处理一个名字时(VA),会自动检查这些特征值,然后分别处理。
你自己map时没有设定只读权限,那map出来的VA就是可读的,写权限也是一样的情况
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
谢谢,我终于明白MDL到底在做什么了。它就是描述了一段PA,有了这个描述之后,我们可以利用这个描述创建一个新的VA到PA的映射,同时定义新的VA的属性。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
说白了就是对同一块物理地址的不同虚拟映射
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
这个东西心里明白,但表达出来确实不太好表达,我楼上正解。
|
能力值:
( 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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
学习了 看懂了 吸收,,,多谢
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
就是新建一块虚拟内存(不分配物理内存),这块虚拟内存的属性是自己设置的。
用这块虚拟内存去对应你要修改的物理内存,当你对这个新的虚拟内存操作的时候,会通过检查。
而你使用受CR0保护的虚拟地址修改时,不会通过检查。
|
能力值:
( LV3,RANK:20 )
|
-
-
11 楼
这和写时拷贝是相反的,写时拷贝是当地写入一段内存地址,将该操作的虚拟地址映射至别的物理内存。
而MDL是将别的虚拟地址映射到同样的物理地址。
|
|
|