首页
社区
课程
招聘
[求助]求教一下内核地址到物理地址的转换
发表于: 2017-1-5 02:28 4069

[求助]求教一下内核地址到物理地址的转换

2017-1-5 02:28
4069
signed __int64 __fastcall MiGetPhysicalAddress(unsigned __int64 kAddress, signed __int64 *_out_PaAddress, UINT32 *a3)
{
        signed __int64 v_PML4T; // r9@1
        unsigned __int64 v4; // r10@1
        unsigned __int64 v5; // rcx@3
        signed __int64 v6; // rax@4
        unsigned __int64 v8; // rcx@12
        signed __int64 v9; // [sp+10h] [bp+8h]@6

        *a3 = 0;
        v_PML4T = (kAddress >> (3 * 9 + 12)) & 0x1FF;
        v4 = kAddress;
        if (*(UCHAR *)(8 * v_PML4T - 0x90482413000i64) & 1)
        {
                if (*(UCHAR *)(((kAddress >> 27) & 0x1FFFF8) - 0x90482600000i64) & 1)
                {
                        v5 = *(UINT64 *)(((kAddress >> 18) & 0x3FFFFFF8) - 0x904C0000000i64);
                        if ((v5 & 0x81) == -127)
                        {
                                goto LABEL_4; //n
                        }
                }
                if (*(UCHAR *)(8 * v_PML4T - 0x90482413000i64) & 1)
                {
                        if (*(UCHAR *)(((v4 >> 27) & 0x1FFFF8) - 0x90482600000i64) & 1)
                        {
                                DbgPrint2("1--:%p\n", (((v4 >> 18) & 0x3FFFFFF8) - 0x904C0000000i64)); //== FFFFF6FB7E2002A8
                                v5 = *(UINT64 *)(((v4 >> 18) & 0x3FFFFFF8) - 0x904C0000000i64);
                                if (v5 & 1)
                                {
                                        DbgPrint("v5:%p\n", v5);
                                        if ((v5 & 0x80u) != 0i64) //n
                                        {
                                        LABEL_4:
                                                v6 = ((v5 >> 12) & 0xFFFFFFFFFi64) + ((v4 >> 12) & 0x1FF);
                                        LABEL_5:
                                                *a3 = 1;
                                        LABEL_6:
                                                v9 = v6 << 12;
                                                DbgPrint("v9:%p\n", v9);
                                                ((PUINT32)&v9)[0] = (v4 & 0xFFF) + ((UINT32)v6 << 12); //offset
                                                *_out_PaAddress = v9;
                                                return 1i64;
                                        }
                                        DbgPrint2("2--:%p\n", ((v4 >> 9) & 0x7FFFFFFFF8i64) - 0x98000000000i64);  //== FFFFF6FC40055038
                                        v8 = *(UINT64 *)(((v4 >> 9) & 0x7FFFFFFFF8i64) - 0x98000000000i64);
                                        if (v8 & 1) //y
                                        {
                                                v6 = (v8 >> 12) & 0xFFFFFFFFFi64;
                                                if (!_bittest64((const signed __int64 *)&v8, 0xBu)) //n
                                                {
                                                        goto LABEL_6;
                                                }
                                                       
                                                DbgPrint("v6:%p\n", v6);
                                                goto LABEL_5; //y
                                        }
                                }
                        }
                }
        }
        return 0i64;
}

__int64 __fastcall _MmGetPhysicalAddress(__int64 kAddress)
{
        int v1; // eax@1
        UINT32 v3; // [sp+38h] [bp+10h]@1
        __int64 PaAddress; // [sp+40h] [bp+18h]@1

        v1 = (INT32)MiGetPhysicalAddress(kAddress, &PaAddress, &v3);
        return PaAddress & -(signed __int64)(v1 != 0);
}

这是IDA直接F5过来的 完全看不懂啊

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 8197
活跃值: (3322)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
PHYSICAL_ADDRESS
MmGetPhysicalAddress (
    __in PVOID BaseAddress
    )

{
    PMMPTE PointerPte;
    PHYSICAL_ADDRESS PhysicalAddress;

    if (MI_IS_PHYSICAL_ADDRESS(BaseAddress)) {
        PhysicalAddress.QuadPart = MI_CONVERT_PHYSICAL_TO_PFN (BaseAddress);
    }
    else {

#if (_MI_PAGING_LEVELS>=4)
        PointerPte = MiGetPxeAddress (BaseAddress);
        if (PointerPte->u.Hard.Valid == 0) {
            KdPrint(("MM:MmGetPhysicalAddressFailed base address was %p",
                      BaseAddress));
            ZERO_LARGE (PhysicalAddress);
            return PhysicalAddress;
        }
#endif

#if (_MI_PAGING_LEVELS>=3)
        PointerPte = MiGetPpeAddress (BaseAddress);
        if (PointerPte->u.Hard.Valid == 0) {
            KdPrint(("MM:MmGetPhysicalAddressFailed base address was %p",
                      BaseAddress));
            ZERO_LARGE (PhysicalAddress);
            return PhysicalAddress;
        }
#endif

        PointerPte = MiGetPdeAddress (BaseAddress);
        if (PointerPte->u.Hard.Valid == 0) {
            KdPrint(("MM:MmGetPhysicalAddressFailed base address was %p",
                      BaseAddress));
            ZERO_LARGE (PhysicalAddress);
            return PhysicalAddress;
        }

        if (MI_PDE_MAPS_LARGE_PAGE (PointerPte)) {
            PhysicalAddress.QuadPart = MI_GET_PAGE_FRAME_FROM_PTE (PointerPte) +
                                           MiGetPteOffset (BaseAddress);
        }
        else {
            PointerPte = MiGetPteAddress (BaseAddress);

            if (PointerPte->u.Hard.Valid == 0) {
                KdPrint(("MM:MmGetPhysicalAddressFailed base address was %p",
                          BaseAddress));
                ZERO_LARGE (PhysicalAddress);
                return PhysicalAddress;
            }
            PhysicalAddress.QuadPart = MI_GET_PAGE_FRAME_FROM_PTE (PointerPte);
        }
    }

    PhysicalAddress.QuadPart = PhysicalAddress.QuadPart << PAGE_SHIFT;
    PhysicalAddress.LowPart += BYTE_OFFSET(BaseAddress);

    return PhysicalAddress;
}
2017-1-5 10:04
0
雪    币: 41
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
抄完Wrk的了 转出来是0 可能是32位的关系吧
2017-1-5 12:01
0
雪    币: 615
活跃值: (765)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
这是win1064位的吗
2017-1-11 18:26
0
游客
登录 | 注册 方可回帖
返回