-
-
[原创]彩蛋解密之物理内存读写到****的转变
-
发表于:
2019-8-19 04:18
12450
-
通过查阅资料我们发现驱动层的代码不会出现在PML4T表的前0x80项中的,这样等于我们就有了0x80*(0x1000/8)*1G=65536G的空间是可以用来映射物理内存的
这里我们决定使用1G的大页面映射方式进行映射,我们的代码中只对前512G进行了映射,基本上现在内存没有超过这个大小的了。
https://github.com/zouxianyu/PhysicalMemoryRW
(别想了,这只是原料,反应需要自己实现的)
在上次的文章结尾处我挖了个坑,这次给它填上。
首先放上一段在DriverEntry中让人看了挠头的操作
1 2 3 4 | ContextVirtualToPhysical(&g_PhysicalOpCR3);
ULONG64 Read1 = *( PULONG64 )0x0;
MyPrint(_TitleAndFunc "ReadTest1:%16IX\n" , Read1);
ContextPhysicalToVirtual(&g_PhysicalOpCR3);
|
啊,读空指针啊,这不明摆着蓝屏吗?
唉,咋没蓝屏,还读到东西了呢?
下面我们来windbg看一下
唉,有点东西是吧
咋看不懂呢
这有个cr3,看看是啥东西?
这一堆整整齐齐的都是啥玩意啊?
不管了直接!vtop看一看
我相信看到这里,对分页机制比较熟悉的大手子们就应该大概懂实现原理了
首先放上一段在DriverEntry中让人看了挠头的操作
1 2 3 4 | ContextVirtualToPhysical(&g_PhysicalOpCR3);
ULONG64 Read1 = *( PULONG64 )0x0;
MyPrint(_TitleAndFunc "ReadTest1:%16IX\n" , Read1);
ContextPhysicalToVirtual(&g_PhysicalOpCR3);
|
啊,读空指针啊,这不明摆着蓝屏吗?
1 2 3 4 | ContextVirtualToPhysical(&g_PhysicalOpCR3);
ULONG64 Read1 = *( PULONG64 )0x0;
MyPrint(_TitleAndFunc "ReadTest1:%16IX\n" , Read1);
ContextPhysicalToVirtual(&g_PhysicalOpCR3);
|
啊,读空指针啊,这不明摆着蓝屏吗?
唉,咋没蓝屏,还读到东西了呢?
下面我们来windbg看一下
唉,有点东西是吧
咋看不懂呢
这有个cr3,看看是啥东西?
这一堆整整齐齐的都是啥玩意啊?
不管了直接!vtop看一看
我相信看到这里,对分页机制比较熟悉的大手子们就应该大概懂实现原理了
首先需要熟悉分页机制,不懂的查阅intel手册和网上的一些文章进行学习。
下面贴出intel手册中对于分页使用规则的详细说明。
调用CreatePhysicalOpCR3BySystemCR3进行初始化
在其中分别依次调用pAllocPhysicalOpPageTableMemory、pMapSystemPML4T、pFillGeneratedPML4TandPDPT进行初始化,并填充结构
需要读取物理内存时调用ContextVirtualToPhysical、ContextPhysicalToVirtual进行环境切换
卸载时调用FreePhysicalOpCR3
在其中依次调用pUnmapSystemPML4T、pFreePhysicalOpPageTableMemory并清理结构
首先使用:CreatePhysicalOpCR3BySystemCR3
进行初始化工作,下面是这个函数的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | NTSTATUS CreatePhysicalOpCR3BySystemCR3( ULONG64 SystemCR3, PPHYSICAL_OP_CR3 pPhysicalOpCR3)
{
if (g_IsPhysicalOpInit)
return STATUS_UNSUCCESSFUL;
if (!NT_SUCCESS(pAllocPhysicalOpPageTableMemory(pPhysicalOpCR3)))
return STATUS_UNSUCCESSFUL;
if (!NT_SUCCESS(pMapSystemPML4T(SystemCR3, pPhysicalOpCR3)))
return STATUS_UNSUCCESSFUL;
if (!NT_SUCCESS(pFillGeneratedPML4TandPDPT(pPhysicalOpCR3)))
return STATUS_UNSUCCESSFUL;
ULONG64 SystemCR3Flag = GetCR3Flag(SystemCR3);
pPhysicalOpCR3->CR3Generated = ( ULONG64 )pPhysicalOpCR3->pAllocPA_PML4T | SystemCR3Flag;
pPhysicalOpCR3->CR3System = SystemCR3;
pPrintPhysicalOpStructure(pPhysicalOpCR3);
g_IsPhysicalOpInit = TRUE;
return STATUS_SUCCESS;
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | NTSTATUS CreatePhysicalOpCR3BySystemCR3( ULONG64 SystemCR3, PPHYSICAL_OP_CR3 pPhysicalOpCR3)
{
if (g_IsPhysicalOpInit)
return STATUS_UNSUCCESSFUL;
if (!NT_SUCCESS(pAllocPhysicalOpPageTableMemory(pPhysicalOpCR3)))
return STATUS_UNSUCCESSFUL;
if (!NT_SUCCESS(pMapSystemPML4T(SystemCR3, pPhysicalOpCR3)))
return STATUS_UNSUCCESSFUL;
if (!NT_SUCCESS(pFillGeneratedPML4TandPDPT(pPhysicalOpCR3)))
return STATUS_UNSUCCESSFUL;
ULONG64 SystemCR3Flag = GetCR3Flag(SystemCR3);
pPhysicalOpCR3->CR3Generated = ( ULONG64 )pPhysicalOpCR3->pAllocPA_PML4T | SystemCR3Flag;
pPhysicalOpCR3->CR3System = SystemCR3;
pPrintPhysicalOpStructure(pPhysicalOpCR3);
g_IsPhysicalOpInit = TRUE;
return STATUS_SUCCESS;
}
|
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!