在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 是一样的了.最终的效果如下图:
内存类型的值
|