我在窥探源代码时已经看过它,并且主要用作我能说的偏移量。但是我到底有点困惑呢?
如果我要搞乱物理内存(假设我有一个可以让我使用的系统),如果需要,我会如何在我的代码中使用它?
为了澄清,我现在面临的主要困惑是理解在处理内存位置时如何使用这么大的值。在提到抵消时,我通常不会看到这种值。
我在xbox 360上为自制程序做一些编程,这主要是我看到它的地方。以下是从内存转储虚拟机管理程序的代码。
dprintf("Dumping HV....\n");
UINT64 dest = 0x8000010600032500ULL;
BYTE* pbPayload = (BYTE*)XPhysicalAlloc(0x100, MAXULONG_PTR, 0, PAGE_READWRITE);
memcpy(pbPayload, hvPayload, 112);
UINT64 src = 0x8000000000000000ULL + ((DWORD)MmGetPhysicalAddress(pbPayload));
BYTE* pbHypervisor = (BYTE*)XPhysicalAlloc(0x40000, MAXULONG_PTR, 0, PAGE_READWRITE);
memset(pbHypervisor, 0, 0x40000);
UINT64 xArg = 0x8000000000000000ULL + ((DWORD)MmGetPhysicalAddress(pbHypervisor));
HvxGetVersion(0x72627472, 4, dest, src, 0x40, xArg);
dprintf("HV dumped\nSaving HV....\n");
注意:HvxGetVersion
读取内存
我能想到的另一个地方我已经看到它在libxenon中,这是一个帮助创建自制程序的库,从很少甚至没有预先存在的代码。
void *target = (void*)(((unsigned long)0x8000000000000000UL) | shdr->sh_addr);
if (shdr->sh_type == SHT_NOBITS) {
memset (target, 0, shdr->sh_size);
} else {
memcpy ((void *) target,
(unsigned char *) addr + shdr->sh_offset,
shdr->sh_size);
}
flush_code (target, shdr->sh_size);
puts("done");