C#如何得到内存地址里面的值,我追加50分

2024-11-28 09:31:35
推荐回答(1个)
回答(1):

在c#中调用VirtualQueryEx(api接口)!

在WIN32中,每个应用程序都可“看见”4GB的线性地址空间,其中最开始的4MB和最后的2GB由操作系统保留,剩下不足2GB的空间用于应用程序私有空间。具体分配如下:0xFFFFFFFF-0xC0000000的1GB用于VxD、存储器管理和文件系统;0xBFFFFFFF- 0x80000000的1GB用于共享的WIN32 DLL、存储器映射文件和共享存储区;0x7FFFFFFF-0x00400000为每个进程的WIN32专用地址;0x003FFFFF- 0x00001000为MS-DOS 和 WIN16应用程序;0x00000FFF-0x00000000为防止使用空指针的4,096字节。以上都是指逻辑地址,也就是虚拟内存。
虚拟内存通常是由固定大小的块来实现的,在WIN32中这些块称为“页”,每页大小为4,096字节。在Intel CPU结构中,通过在一个控制寄存器中设置一位来启用分页。启用分页时CPU并不能直接访问内存,对每个地址要经过一个映射进程,通过一系列称作“页表” 的查找表把虚拟内存地址映射成实际内存地址。通过使用硬件地址映射和页表WIN32可使虚拟内存即有好的性能而且还提供保护。利用处理器的页映射能力,操作系统为每个进程提供独立的从逻辑地址到物理地址的映射,使每个进程的地址空间对另一个进程完全不可见。WIN32中也提供了一些访问进程内存空间的函数,但使用时要谨慎,一不小心就有可能破坏被访问的进程。

VirtualQueryEx
函数功能描述:查询地址空间中内存地址的信息。

函数原型:
DWORD VirtualQueryEx( HANDLE hProcess, LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, DWORD dwLength );
参数:
hProcess 进程句柄。
LpAddress 查询内存的地址。
LpBuffer 指向MEMORY_BASIC_INFORMATION结构的指针,用于接收内存信息。
DwLength MEMORY_BASIC_INFORMATION结构的大小。
返回值:
函数写入lpBuffer的字节数,如果不等于sizeof(MEMORY_BASIC_INFORMATION)表示失败。
备注:
MEMORY_BASIC_INFORMATION在WinNT.h中定义如下:
typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress; // 区域基地址。
PVOID AllocationBase; // 分配基地址。
DWORD AllocationProtect; // 区域被初次保留时赋予的保护属性。
SIZE_T RegionSize; // 区域大小(以字节为计量单位)。
DWORD State; // 状态(MEM_FREE、MEM_RESERVE或 MEM_COMMIT)。
DWORD Protect; // 保护属性。
DWORD Type; // 类型。
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

成员解释:
BaseAddress 与LpAddress参数的值相同,但是四舍五入为页面的边界值。
AllocationBase 指明用VirtualAlloc函数分配内存区域的基地址。LpAddress
在该区域之内。
AllocationProtect 指明该地址空间区域被初次保留时赋予该区域的保护属性。
PAGE_READONLY 只读属性,如果试图进行写操作,将引发访问违规。如果系统
区分只读、执行两种属性,那么试图在该区域执行代码也将引
发访问违规。
PAGE_READWRITE 允许读写。
PAGE_EXECUTE 只允许执行代码,对该区域试图进行读写操作将引发访问违规。
PAGE_EXECUTE_READ 允许执行和读取。
PAGE_EXECUTE_READWRITE 允许读写和执行代码。
PAGE_EXECUTE_WRITECOPY 对于该地址空间的区域,不管执行什么操作,都不会引发访问违
规。如果试图在该页面上的内存中进行写入操作,就会将它自己
的私有页面(受页文件的支持)拷贝赋予该进程。
PAGE_GUARD 在页面上写入一个字节时使应用程序收到一个通知(通过一个异
常条件)。该标志有一些非常巧妙的用法。Windows 2000在创建
线程堆栈时使用该标志。
PAGE_NOACCESS 禁止一切访问。
PAGE_NOCACHE 停用已提交页面的高速缓存。一般情况下最好不要使用该标志,
因为它主要是供需要处理内存缓冲区的硬件设备驱动程序的开发
人员使用的。
RegionSize 用于指明内存块从基地址即BaseAddress开始的所有页面的大
小(以字节为计量单位)这些页面与含有用LpAddress参数设
定的地址的页面拥有相同的保护属性、状态和类型。
State 用于指明所有相邻页面的状态。
MEM_COMMIT 指明已分配物理内存或者系统页文件。
MEM_FREE 空闲状态。该区域的虚拟地址不受任何内存的支持。该地址空间没
有被保留。改状态下AllocationBase、AllocationProtect、Protect
和Type等成员均未定义。
MEM_RESERVE 指明页面被保留,但是没有分配任何物理内存。该状态下Protect成
员未定。
Protect 用于指明所有相邻页面(内存块)的保护属性。这些页面与含有
拥有相同的保属性、状态和类型。意义同AllocationProtect。
Type 用于指明支持所有相邻页面的物理存储器的类型(MEM_IMAGE,
MEM_MAPPED或MEM_PRIVATE)。这些相邻页面拥有相同的保护属
性、状态和类型。如果是Windows 98,那么这个成员将总是
MEM_PRIVATE 。
MEM_IMAGE 指明该区域的虚拟地址原先受内存映射的映像文件(如.exe或DLL
文件)的支持,但也许不再受映像文件的支持。例如,当写入模块
映像中的全局变量时,“写入时拷贝”的机制将由页文件来支持特
定的页面,而不是受原始映像文件的支持。
MEM_MAPPED 该区域的虚拟地址原先是受内存映射的数据文件的支持,但也许不
再受数据文件的支持。例如,数据文件可以使用“写入时拷贝”的
保护属性来映射。对文件的任何写入操作都将导致页文件而不是原
始数据支持特定的页面。
MEM_PRIVATE 指明该内存区域是私有的。不被其他进程共享。

c#怎样调用api不用我说了吧

更简单的方法:

每隔一定时间,抓取屏幕截屏,分析指定位置的颜色值,然后...