c++实现内存修改进程内存 修改马里奥
1.HWND:表示句柄(handle), Wnd 是变量对象描述,表示窗口,所以hWnd 表示窗口句柄
2.FindWindow函数返回与指定字符串相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。这个函数不会查找子窗口。 函数原型: HWND FindWindow( LPCTSTR lpClassName,LPCTSTR lpWindowName)//类名,标题名 3.DWORD双字DWORD processid 进程标识符id用双字类型
4.HANDLE:句柄,是Windows用来表示对象的(不是C++的对象),HWND是其中一种,HWND是HANDLE,但HANDLE不只是HWND,HANDLE是一个通用句柄表示,HWND是一个专用表示窗口的句柄。
5.OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。 函数原型: HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);
6.GetWindowThreadProcessId 函数原型
DWORD GetWindowThreadProcessId(
HWND hWnd,
LPDWORD lpdwProcessId
);返回线程号,注意,lpdwProcessId 是存放进程号的变量。返回值是线程号,lpdwProcessId 是进程号存放处。
当然可以把答案再放到其它地方。如
DWORD dwPID, dwTID;
dwTID = GetWindowThreadProcessId( hWnd, &dwPID );
7.WriteProcessMemory VC++声明
BOOL WriteProcessMemory(
HANDLE hProcess,//由OpenProcess返回的进程句柄。
LPVOID lpBaseAddress,//要写的内存首地址
LPVOID lpBuffer,//指向要写的数据的指针
DWORD nSize,//要写入的字节数。
LPDWORD lpNumberOfBytesWritten//返回值,非零值代表成功(编程时写0)
);
vc++修改马里奥总结: 1.使用findWindow找到窗口句柄 2.通过GetWindowThreadProcessId找到进程id(pid) 3.OpenProcess打开进程 4.WriteProcessMemory修改内存
源代码:
#include<stdio.h> #include<windows.h> int main() { HWND h=FindWindow(NULL,"Super Mario XP") ;//获取窗口句柄 DWORD processid; GetWindowThreadProcessId(h,&processid);//获取进程id HANDLE Hprocess=NULL; Hprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processid);//打开进程 if(Hprocess==0) printf("打开进程失败! "); else { printf("打开进程成功! "); printf("修改为:"); int n; scanf("%d",&n); DWORD life; life=(DWORD)n; // DWORD lifeaddr=0x004282a2; DWORD a=WriteProcessMemory(Hprocess,(LPVOID)(0x004282a2),&life,4,0);//注意参数 if(a==0) printf("修改失败!"); else printf("修改成功!"); } return 0; }