首页
社区
课程
招聘
[原创]64位绕过API实现直接读取物理内存
发表于: 2018-7-20 09:38 10921

[原创]64位绕过API实现直接读取物理内存

2018-7-20 09:38
10921
本人代码写的渣,还望各方大神指教,以下代码仅为核心部分,删除了CR3获取部分(谢绝伸手党)

在64位下需要采用4级内存寻址,可参考:http://www.cnblogs.com/lanrenxinxin/p/4735027.html

亲测,在1G-16G最大物理内存下可以正常读取,更高的就没测试了,直接上干货:

PUCHAR translate_Linear_address(ULONGLONG Linearaddress, ULONG Length){ //Linearaddress=虚拟地址,Length=长度
	PUCHAR pOutAddress = Linearaddress;

	DbgPrint("ProcessCr3: %u", ProcessCr3);

	if (ProcessCr3 == 0)
	{
		DbgPrint("OpenProcessFail\n");
		return 0;
	}

	VIRTUAL_ADDRESS virtualAddress = { 0 };
	virtualAddress.ulVirtualAddress = &pOutAddress;

	// 得到页目录指针物理地址

	// 映射为虚拟地址以便取值
	PHYSICAL_ADDRESS phyAddress = { 0 };
	phyAddress.QuadPart = ProcessCr3;

	PULONG2 pPdbr = (PULONG2)MmMapIoSpace(phyAddress, sizeof(PHYSICAL_ADDRESS), MmWriteCombined);
	for (ULONG i = 0; i < 8; i++){
		DbgPrint("%X ", pPdbr[i]);
	}
	LONGLONG LevelAddress = pPdbr[0];  //virtualAddress.stVirtualAddress.Level
	LevelAddress &= 0x000000FFFFFFF000;			
	DbgPrint("Level = %X, 映射后的地址 %X\n", phyAddress, LevelAddress);

	// Pointer
	phyAddress.QuadPart = LevelAddress;
	PULONG2 pPagePointer = (PULONG2)MmMapIoSpace(phyAddress, sizeof(PHYSICAL_ADDRESS), MmWriteCombined);
	for (ULONG i = 0; i < 8; i++){
		DbgPrint("%X ", pPagePointer[i]);
	}
	LONGLONG ulPagePointer = pPagePointer[0];
	ulPagePointer &= 0x000000FFFFFFF000;	
	DbgPrint("Pointer = %X, 映射后的地址 %X\n", phyAddress, ulPagePointer);

	// Selector
	phyAddress.QuadPart = ulPagePointer;
	PULONG2 pPageSelector = (PULONG2)MmMapIoSpace(phyAddress, sizeof(PHYSICAL_ADDRESS), MmWriteCombined);
	for (ULONG i = 0; i < 8; i++){
		DbgPrint("%X ", pPageSelector[i]);
	}
	LONGLONG ulPageSelector = pPageSelector[2];    //4
	ulPageSelector &= 0x000000FFFFFFF000;
	DbgPrint("Selector = %X, 映射后的地址 %X\n", phyAddress, ulPageSelector);

	// Entry
	phyAddress.QuadPart = ulPageSelector;
	PULONG2 pPageEntry = (PULONG2)MmMapIoSpace(phyAddress, sizeof(PHYSICAL_ADDRESS), MmWriteCombined);
	for (ULONG i = 0; i < 8; i++){
		DbgPrint("%X ", pPageEntry[i]);
	}
	LONGLONG ulPageEntry = pPageEntry[0];
	ulPageEntry &= 0x000000FFFFFFF000;
	DbgPrint("Entry = %X, 映射后的地址 %X\n", phyAddress, ulPageEntry);

	// 得到物理地址
	LONGLONG ulPhyAddress = ulPageEntry + virtualAddress.stVirtualAddress.offset;

	// 映射为虚拟地址,获取其值进行验证
	phyAddress.QuadPart = ulPhyAddress;
	PUCHAR pPhyAddress = (PUCHAR)MmMapIoSpace(phyAddress, sizeof(PHYSICAL_ADDRESS), MmWriteCombined);
	DbgPrint("虚拟地址:%X, 对应物理地址:%X, Value:%S\n", pOutAddress, ulPhyAddress, pPhyAddress);

	// 传出对应物理地址
	//*pOutAddress = ulPhyAddress;
	return pPhyAddress;
}


[课程]Linux pwn 探索篇!

最后于 2018-7-20 13:09 被老坛酸菜TM编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (12)
雪    币: 914
活跃值: (2293)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
2
群名:绝地求生安全实验室
真滴牛皮
另外你这就是个VAtoPA,而且你这写的对于system进程就歇逼了
取CR3也不难,Lookup一下拿到EPROCESS 直接从固定offset取就是了
真不知道用意何在
前排瓜子花生
2018-7-20 11:09
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
3
开始吐槽:
1、MmWriteCombined是不是有丶问题
2、被换出到磁盘的虚拟内存读不了
3、没有处理4MB 1GB bigpage
4、没有判断PDE PTE present位
最后于 2018-7-20 11:30 被hzqst编辑 ,原因:
2018-7-20 11:12
0
雪    币: 42
活跃值: (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
hzqst 开始吐槽:1、MmWriteCombined是不是有丶问题2、被换出到磁盘的虚拟内存读不了3、没有处理4MB 1GB bigpage4、没有判断PDE PTE present位
这本身就是用于测试的代码,我肯定不会把最终代码放出来的,免得被用于不法用途
最后于 2018-7-20 13:02 被老坛酸菜TM编辑 ,原因:
2018-7-20 13:02
0
雪    币: 42
活跃值: (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
万剑归宗 群名:绝地求生安全实验室[em_4] 真滴牛皮[em_13] 另外你这就是个VAtoPA,而且你这写的对于system进程就歇逼了 取CR3也不难,Lookup一下拿到EPROCESS 直接从固 ...
没什么用意,抛砖引玉而已,不然怎么能够把你这样的大神请出来,至于CR3你取到的不一定是真实的。能取到真实的大神用不着看这代码!
2018-7-20 13:16
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
6
然而真实的cr3也不一定可以读到你想要的东西,而且根据你说的话,我或许就已经猜出了你的目的
2018-7-20 14:14
0
雪    币: 433
活跃值: (1895)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
老坛酸菜TM 没什么用意,抛砖引玉而已,不然怎么能够把你这样的大神请出来,至于CR3你取到的不一定是真实的。能取到真实的大神用不着看这代码!
怎么就不真实了 明明很真实呀
2018-7-20 18:49
0
雪    币: 42
活跃值: (208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
萌克力 怎么就不真实了 明明很真实呀
正常情况下当然是真实的,但是有些程序会对CR3特出处理,为的就是防止别人读物内存
2018-7-21 12:34
0
雪    币: 273
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
1年前 此发就对DXF失效.
2018-8-3 07:55
0
雪    币: 634
活跃值: (1149)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
万剑归宗 群名:绝地求生安全实验室[em_4] 真滴牛皮[em_13] 另外你这就是个VAtoPA,而且你这写的对于system进程就歇逼了 取CR3也不难,Lookup一下拿到EPROCESS 直接从固 ...
开玩笑呢。不想说什么。第一没对 缺页处理。第二 那样那CR3就不对.TP帮BE加防护了。重点这个代码是我的==。当时他找我要的。现在成原创无力吐槽
最后于 2018-8-5 02:14 被BDBig编辑 ,原因:
2018-8-5 02:12
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
11
精彩绝伦
2018-8-5 09:10
0
雪    币: 2065
活跃值: (500)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
13
精彩
2019-10-1 00:37
0
游客
登录 | 注册 方可回帖
返回
//