CpuDbg 发表于 2023-4-19 09:34:10

Alt+M内存窗口中的类型问题

在od1.x Alt+M内存窗口中缺省情况下看到的 "类型" 应该是如下这样.


Address   Size       Owner      Section    Contains      Type   Access    Initial   Mapped as
00010000   00010000                                       Map    RW      RW
00020000   0000A000                                       Priv   RWE       RWE
00030000   00001000                                       Priv   RWE       RWE
00040000   0001A000                                       Map    R         R
00095000   0000B000                                       Priv   RWGuarRW
0019A000   00002000                                       Priv   RWGuarRW
0019C000   00004000                         stack of maiPriv   RWGuarRW
001A0000   00004000                                       Map    R         R
001B0000   00002000                                       Priv   RW      RW
001F5000   0000B000                                       Priv   RWGuarRW
0034C000   00004000                                       Priv   RW      RW
00350000   00003000                         data block oPriv   RW      RW
00353000   00003000                         data block oPriv   RW      RW
00356000   00003000                         data block oPriv   RW      RW
00359000   00001000                         data block oPriv   RW      RW
00400000   00001000   TraceMe               PE header   Imag   R         RWE
00401000   00003000   TraceMe    .text      code          Imag   R         RWE
00404000   00001000   TraceMe    .rdata   imports       Imag   R         RWE
00405000   00001000   TraceMe    .data      data          Imag   R         RWE
00406000   00001000   TraceMe    .rsrc      resources   Imag   R         RWE
00410000   000C5000                                       Map    R         R         \Device\HarddiskVolume3\Windows\System32\locale.nls
004E0000   00008000                                       Priv   RW      RW
00525000   0000B000                                       Priv   RWGuarRW
00565000   0000B000                                       Priv   RWGuarRW
00570000   00004000                                       Map    R         R
其中 Type 类型一栏, 可以往右拉一点, 会看到跟着一个4字节数值. 如下:
Address    Size       Owner      Section    Contains      Type                     Access    Initial   Mapped as
00010000   00010000                                       Map00041004            RW      RW
00020000   0000A000                                       Priv 00021040            RWE       RWE
00030000   00001000                                       Priv 00021040            RWE       RWE
00040000   0001A000                                       Map00041002            R         R
00095000   0000B000                                       Priv 00021104            RWGuarRW
0019A000   00002000                                       Priv 00021104            RWGuarRW
0019C000   00004000                         stack of maiPriv 00021104            RWGuarRW
001A0000   00004000                                       Map00041002            R         R
001B0000   00002000                                       Priv 00021004            RW      RW
001F5000   0000B000                                       Priv 00021104            RWGuarRW
0034C000   00004000                                       Priv 00021004            RW      RW
00350000   00003000                         data block oPriv 00021004            RW      RW
00353000   00003000                         data block oPriv 00021004            RW      RW
00356000   00003000                         data block oPriv 00021004            RW      RW
00359000   00001000                         data block oPriv 00021004            RW      RW
00400000   00001000   TraceMe               PE header   Imag 01001002            R         RWE
00401000   00003000   TraceMe    .text      code          Imag 01001002            R         RWE
00404000   00001000   TraceMe    .rdata   imports       Imag 01001002            R         RWE
00405000   00001000   TraceMe    .data      data          Imag 01001002            R         RWE
00406000   00001000   TraceMe    .rsrc      resources   Imag 01001002            R         RWE
00410000   000C5000                                       Map00041002            R         R         \Device\HarddiskVolume3\Windows\System32\locale.nls
004E0000   00008000                                       Priv 00021004            RW      RW
00525000   0000B000                                       Priv 00021104            RWGuarRW
00565000   0000B000                                       Priv 00021104            RWGuarRW
其中常见的类型只有 MEM_PRIVATE(私有,缩写:Priv) MEM_MAPPED(映射,缩写:Map) SEC_IMAGE(映像,缩写:Imag) 三种, (至少目前我是遇到这三种.)
我查看了一下三个的值 分别 是
#define MEM_PRIVATE         0x20000
#define MEM_MAPPED         0x40000
#define SEC_IMAGE             0x1000000

和上面od1.x显示的完全不符,
比如第一个显示的是Map 00041004, 这个 00041004 和上面的 MEM_MAPPED   宏对比, 应该是 00040000,
多出来的 1004 我猜测应该是页权限, 我又看了一下 Access 和 Initial 属性. 确定应该是和 Access 属性或了一下.
但是我或了之后,得到的是 00040004, 另外多出来的 1000, 不知道是什么? 难道是 od1.x 的bug?
-----------------------------------------------------------------------------------------------------
2023.04.19 更新
刚刚点到宏里面看了一下, 发现如下:
#define PAGE_NOACCESS          0x01   
#define PAGE_READONLY          0x02   
#define PAGE_READWRITE         0x04   
#define PAGE_WRITECOPY         0x08   
#define PAGE_EXECUTE         0x10   
#define PAGE_EXECUTE_READ      0x20   
#define PAGE_EXECUTE_READWRITE 0x40   
#define PAGE_EXECUTE_WRITECOPY 0x80   
#define PAGE_GUARD            0x100   
#define PAGE_NOCACHE          0x200   
#define PAGE_WRITECOMBINE   0x400   
#define MEM_COMMIT         0x1000   
#define MEM_RESERVE          0x2000   
#define MEM_DECOMMIT         0x4000   
#define MEM_RELEASE          0x8000   
#define MEM_FREE            0x10000   
#define MEM_PRIVATE         0x20000   
#define MEM_MAPPED          0x40000   
#define MEM_RESET         0x80000   
#define MEM_TOP_DOWN       0x100000   
#define MEM_WRITE_WATCH    0x200000   
#define MEM_PHYSICAL       0x400000   
#define MEM_ROTATE         0x800000   
#define MEM_LARGE_PAGES0x20000000   
#define MEM_4MB_PAGES    0x80000000   
#define SEC_FILE         0x800000   
#define SEC_IMAGE         0x1000000   
#define SEC_PROTECTED_IMAGE0x2000000
#define SEC_RESERVE       0x4000000   
#define SEC_COMMIT      0x8000000   
#define SEC_NOCACHE      0x10000000   
#define SEC_WRITECOMBINE 0x40000000   
#define SEC_LARGE_PAGES0x80000000   
#define MEM_IMAGE         SEC_IMAGE   
#define WRITE_WATCH_FLAG_RESET 0x01   
其中 #define MEM_COMMIT 0x1000 正好是1000,
但是我看了一下我获取的 access 并没有 1000.
我又翻了下之前刷新内存的代码, 发现 原来 我所使用的 VirtualQueryEx 函数中的 第三个参数是个结构体.
而结构体中有一个 state 保存的就是 MEM_COMMIT 之类的. 如下:

DWORD VirtualQueryEx(
HANDLE hProcess,                     // handle to process
LPCVOID lpAddress,                   // address of region
PMEMORY_BASIC_INFORMATION lpBuffer,// information buffer
SIZE_T dwLength                      // size of buffer
);

typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
SIZE_T RegionSize;
DWORD State;         <-------------------这里保存的是 MEM_COMMIT 之类的属性.
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
而我之前的代码, 只是获取了 Protect 和 AllocationProtect 属性.
那只能将此属性也获取才行, 本来我是想用 或 来存储原先的 Access和 Initial 属性中的.
我担心之前的代码都是直接取值的, 这样要改的地方太多了. 所以我直接在 t_memory 结构体中,又增加了一个 state 成员.
用来保存 MEM_COMMITMEM_RESERVE等属性.
这下子, 只要将 type access state 三个值或一下, 这样获取的类型数值就和 od1.x 是一样的了.最终的效果如下图:




页: [1]
查看完整版本: Alt+M内存窗口中的类型问题