首页
社区
课程
招聘
[原创] 不调用系统api读写物理内存的方法
2023-10-4 01:24 12449

[原创] 不调用系统api读写物理内存的方法

2023-10-4 01:24
12449

话不多说,直接上代码

PVOID Mapper = 0;
PTE_64* MapperPte = 0;
u64 MapperPteOrigPfn = 0;

VOID Init()
{
	Mapper = MmAllocateIndependentPages(0x1000, -1);
	memset(Mapper, 0, 0x1000);
	MapperPte = MiGetPteAddress(Mapper);
	MapperPteOrigPfn = MapperPte->PageFrameNumber;
}

VOID ReadPhysicalMemoryInPage(PVOID Buffer, u64 Phys, u64 Size)
{
	_disable();

	MapperPte->PageFrameNumber = Phys >> PAGE_SHIFT;
	__invlpg(Mapper);

	__movsb((PUCHAR)Buffer, (PUCHAR)Mapper + (Phys & 0xFFF), Size);

	MapperPte->PageFrameNumber = MapperPteOrigPfn;

	_enable();
}


原理:

先分配一个Mapper,用MmAllocateIndependentPages的原因是不会分配出大页,用ExAllocatePool等api是有概率分配出大页Pde内存的哦

获取Mapper的Pte并保存原始Pfn,用于后续还原


改Pte->Pfn使得Mapper映射我们的物理地址,刷tlb,拷贝内存,还原Pfn

关中断的原因是invlpg之后切到其他核心会导致在其他核心的tlb没被刷新从而拷贝到错误的数据,其实提升irql就行了


注意事项:

多核情况要注意分配多个Mapper给每个核心使用

仅拷贝一个页面,跨页要自己处理

未修复内存缓存属性,读物理内存没什么问题,写入物理内存就要注意了,可以通过pte.pat实现


总结:

非常简单的手动映射物理内存读写

其实类似的代码在各个开源的VT上多少有出现过

UC上的人还在用MmCopy... 




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

收藏
点赞7
打赏
分享
最新回复 (7)
雪    币: 2192
活跃值: (3492)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
R0g 2 2023-10-4 14:05
2
0

雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2023-10-4 15:02
3
0
EAC:懂了 这就去监控invlpg
雪    币: 3663
活跃值: (3843)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caolinkai 2023-10-4 16:10
4
0
感谢分享
雪    币: 46
活跃值: (1595)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-10-4 17:36
5
0
哈哈,大伙有活了。
雪    币: 446
活跃值: (598)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
L@in 2023-10-4 21:51
6
0
好活
雪    币: 19299
活跃值: (28938)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-10-4 23:04
7
1
感谢分享
雪    币: 216
活跃值: (829)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iaoedsz2018 2023-12-7 21:54
8
0
6666666666666666666666666666666666666666
游客
登录 | 注册 方可回帖
返回