注册

CpuDbg x96

查看: 675|回复: 0
收起左侧

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

[复制链接]
发表于 2023-4-19 09:34:10 | 显示全部楼层 |阅读模式
在od1.x Alt+M内存窗口中缺省情况下看到的 "类型" 应该是如下这样.

[Asm] 纯文本查看 复制代码
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   RW  Guar  RW
0019A000   00002000                                       Priv   RW  Guar  RW
0019C000   00004000                         stack of mai  Priv   RW  Guar  RW
001A0000   00004000                                       Map    R         R
001B0000   00002000                                       Priv   RW        RW
001F5000   0000B000                                       Priv   RW  Guar  RW
0034C000   00004000                                       Priv   RW        RW
00350000   00003000                         data block o  Priv   RW        RW
00353000   00003000                         data block o  Priv   RW        RW
00356000   00003000                         data block o  Priv   RW        RW
00359000   00001000                         data block o  Priv   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   RW  Guar  RW
00565000   0000B000                                       Priv   RW  Guar  RW
00570000   00004000                                       Map    R         R

其中 Type 类型一栏, 可以往右拉一点, 会看到跟着一个4字节数值. 如下:
[Asm] 纯文本查看 复制代码
Address    Size       Owner      Section    Contains      Type                     Access    Initial   Mapped as
00010000   00010000                                       Map  00041004            RW        RW
00020000   0000A000                                       Priv 00021040            RWE       RWE
00030000   00001000                                       Priv 00021040            RWE       RWE
00040000   0001A000                                       Map  00041002            R         R
00095000   0000B000                                       Priv 00021104            RW  Guar  RW
0019A000   00002000                                       Priv 00021104            RW  Guar  RW
0019C000   00004000                         stack of mai  Priv 00021104            RW  Guar  RW
001A0000   00004000                                       Map  00041002            R         R
001B0000   00002000                                       Priv 00021004            RW        RW
001F5000   0000B000                                       Priv 00021104            RW  Guar  RW
0034C000   00004000                                       Priv 00021004            RW        RW
00350000   00003000                         data block o  Priv 00021004            RW        RW
00353000   00003000                         data block o  Priv 00021004            RW        RW
00356000   00003000                         data block o  Priv 00021004            RW        RW
00359000   00001000                         data block o  Priv 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                                       Map  00041002            R         R         \Device\HarddiskVolume3\Windows\System32\locale.nls
004E0000   00008000                                       Priv 00021004            RW        RW
00525000   0000B000                                       Priv 00021104            RW  Guar  RW
00565000   0000B000                                       Priv 00021104            RW  Guar  RW

其中常见的类型只有 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 更新
刚刚点到宏里面看了一下, 发现如下:
[C++] 纯文本查看 复制代码
#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_PAGES  0x20000000     
#define MEM_4MB_PAGES    0x80000000     
#define SEC_FILE           0x800000     
#define SEC_IMAGE         0x1000000     
#define SEC_PROTECTED_IMAGE  0x2000000  
#define SEC_RESERVE       0x4000000     
#define SEC_COMMIT        0x8000000     
#define SEC_NOCACHE      0x10000000     
#define SEC_WRITECOMBINE 0x40000000     
#define SEC_LARGE_PAGES  0x80000000     
#define MEM_IMAGE         SEC_IMAGE     
#define WRITE_WATCH_FLAG_RESET 0x01    

其中 #define MEM_COMMIT 0x1000 正好是  1000,
但是我看了一下我获取的 access 并没有 1000.
我又翻了下之前刷新内存的代码, 发现 原来 我所使用的 VirtualQueryEx 函数中的 第三个参数是个结构体.
而结构体中有一个 state 保存的就是 MEM_COMMIT 之类的. 如下:
[C++] 纯文本查看 复制代码
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_COMMIT  MEM_RESERVE  等属性.
这下子, 只要将 type access state 三个值或一下, 这样获取的类型数值就和 od1.x 是一样的了.最终的效果如下图:

内存类型的值

内存类型的值



回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注册

QQ|Archiver|手机版| CpuDbg x96

GMT, 2024-4-29 09:38 , Processed in 0.093750 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表