要修改或读取其他进程的数据,首先要知道几个知识:
一、1.windows系统为每个程序分配4GB的虚拟内存,虚拟内存由“页文件”实现。
2.每个程序的4GB空间的前2GB是程序的私有空间,后2GB是系统的空间。
3.每个页文件4KB。
4.在程序私有的2GB中,windows 98系列的系统的程序的可用地址为4MB--2GB
windows 2000系列的系统的程序的可用地址为64KB--2GB
因此还需要先判别程序运行的操作系统。
二、1.查阅MSDN可知,Read/WriteProcessMemory都需要一定的权限,
因此打开句柄时必须赋予相应权限。
这个程序是《Windows程序设计》——王艳平著的第二章的一个程序
程序的具体实现过程是:
创建一个子进程执行一个自己写的测试程序,
然后得到有读权限的子进程的句柄,搜索要改的数据的内存,最后修改。
原程序稍有错误,原程序没有取得读和写权限,所以GetLastError会返回998——内存位置访问无效。
和5——拒绝访问。
修改后程序正确执行,但是在读取一些不可用内存地址时会有229错误(会有很多,是正常的)
——仅完成部分的 ReadProcessMemory 或WriteProcessMemory 请求。
修改后的源代码如下:
/****以下是02MemRepair.cpp中的代码****/
#include <stdio.h>
#include <windows.h>
BOOL FindFirst(DWORD dwValue); // 在目标进程空间进行第一次查找
BOOL CompareAPage(DWORD dwBaseAddr,DWORD dwValue);// 比较目标进程内存一页中比较
BOOL FindNext(DWORD dwValue); // 在目标进程空间进行第二三四查找
void ShowList(); // 打印搜索出的地址
DWORD g_arList[1024]; // 存放查找到