读写另一个进程内存的函数:
BOOL ReadProcessMemory(
HANDLE hProcess, // 待读进程的句柄
LPCVOID lpBaseAddress, // 目标进程中待读内存的起始地址
LPVOID lpBuffer, // 用来接受读取数据的缓冲区
DWORD nSize, // 要读取的字节数
LPDWORD lpNumberOfBytesRead // 用来供函数返回实际读取的字节数
);
WriteProcessMemory( hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead); // 参数含义同上
不同操作系统方法不一样,获取操作系统版本的函数:
BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInfo);
系统会将操作系统的版本信息返回到参数lpVersionInfo 指向的OSVERSIONINFO结构中。
typedef struct _OSVERSIONINFO {
DWORD dwOSVersionInfoSize; // 本结构的大小,必须在调用之前设置
DWORD dwMajorVersion; // 操作系统的主版本号
DWORD dwMinorVersion; // 操作系统的次版本号
DWORD dwBuildNumber; // 操作系统的编译版本号
DWORD dwPlatformId; // 操作系统平台。可以是VER_PLATFORM_WIN32_NT(2000 系列)等
TCHAR szCSDVersion[128]; // 指定安装在系统上的最新服务包,例如“Service Pack 3”等
} OSVERSIONINFO;
在查找时目标进程内存中很可能存在多个你要搜索的值,所以在进行第一次搜索的时候,要把搜索
到的地址记录下来,然后让用户改变要搜索的值,再在记录的地址中搜索,直到搜索到的地址
惟一为止。为此写两个辅助函数和3 个全局变量。
BOOL FindFirst(DWORD dwValue); // 在目标进程空间进行第一次查找
BOOL FindNext(DWORD dwValue); // 在目标进程地址空间进行第2、3、4⋯⋯次查找
DWORD g_arList[1024]; // 地址列表
int g_nListCnt; // 有效地址的个数
HANDLE g_hProcess; // 目标进程句柄