Windows内存修改
你可能用过金山游侠,GameMaster8,Cheat Engine,那你有没有想过自己实现一个简易的内存修改工具?本文将介绍在Windows平台下实现一个简易内存修改工具的方法,只要你有一些windows内存管理机制的基本知识以及一定的c++编程能力,你就可以利用本文介绍的Windows内存管理API自己实现一个简易的内存修改工具。
本文将先介绍Windows的相关API,然后介绍下利用其实现内存修改工具的思路,最后介绍一个自己在windows api基础上封装的API(以下称内存管理及修改API或内存修改API),包括各API函数的说明以及如何通过对这套API的简单调用实现内存修改。
关于内存管理API以及简易的演示程序,代码较长,感兴趣的朋友可去https://github.com/jimth001/Windows-Memory-Modification.git 查看。
相关的windows API
1) GetSystemInfo
用来填充SYSTEM_INFO结构体信息,函数原型如下:
voidWINAPI GetSystemInfo(_Out_ LPSYSTEM_INFO lpSystemInfo)
lpSystemInfo:指向一个供函数返回信息的SYSTEM_INFO结构体。SYSTEM_INFO定义如下:
typedefstruct _SYSTEM_INFO {
union {
DWORD dwOemId;// Obsoletefield...do not use
struct {
WORD wProcessorArchitecture;//处理器架构
WORD wReserved;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
DWORD dwPageSize;//分页大小
LPVOID lpMinimumApplicationAddress;//最小寻址空间
LPVOID lpMaximumApplicationAddress;//最大寻址空间
DWORD_PTR dwActiveProcessorMask;//处理器掩码
DWORD dwNumberOfProcessors;//处理器数目
DWORD dwProcessorType;//处理器类型
DWORD dwAllocationGranularity;//虚拟内存空间的粒度
WORD wProcessorLevel;//处理器等级
WORD wProcessorRevision;//处理器版本
} SYSTEM_INFO, *LPSYSTEM_INFO;
2) GetPerformanceInfo
用来填充PERFORMANCE_INFORMATION结构体信息,用法类似于GetSystemInfo,比GetSystemInfo多一个参数,第二个参数是结构体的大小
PERFORMANCE_INFORMATION结构体定义如下:
typedef struct _PERFORMANCE_INFORMATION {
DWORD cb;//该结构体大小,调用GetPerformanceInfo前要先将其初始化
SIZE_T CommitTotal;// 系统当前提交的页面总数
SIZE_T CommitLimit;// 系统可提交的页面总数
SIZE_T CommitPeak;// 系统历史提交页面峰值
SIZE_T PhysicalTotal;// 按页分配的总的物理内存
SIZE_T PhysicalAvailable;// 系统当前提交的页面总数
SIZE_T SystemCache;
SIZE_T KernelTotal;
SIZE_T KernelPaged;
SIZE_T KernelNonpaged;
SIZE_T PageSize;// The size of a page, in bytes.
DWORD HandleCount;// The current number of open //handles.
DWORD ProcessCount;//
DWORD ThreadCount;//
}PERFORMANCE_INFORMATION, *PPERFORMANCE_INFORMATION;
3) CreateToolhelp32Snapshot
CreateToolhelp32Snapshot可以通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照。
函数原型如下:
HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS(在快照中包含系统中所有的进程)等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0
);
调用成功,返回快照的句柄,否则返回INVALID_HANDLE_VALUE
4) Process32First
process32First是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄。
函数原型如下: