无限阳光
-
打开CE连接游戏程序,通过改变阳光找到阳光值的内存地址
-
把该地址添加到候选地址,右击找出是什么改写了这个地址,再回到游戏改变阳光
-
得到指令mov [edi+00005560],esi,指针基址可能是 edi=135F7788
-
CE新的扫描,勾上Hex,数值填135F7788,新的扫描
-
扫描类型改未变动的数值,然后按再次扫描若干次
-
取左上角筛选出来的地址中的第一个为候选地址,本例为0487A6C8,右击找出是什么访问了这个地址
-
会发现很多+00000768的指令,点开第一条指令
-
mov esi,[edi+00000768],指针基址可能是 edi=04879F60
-
CE新的扫描,勾上Hex,查找04879F60,首次扫描
-
左上角筛选出来的地址中有四个是绿色的地址,下面列出来了:
- PlantsVsZombies.exe+2A9EC0
- PlantsVsZombies.exe+2A9F38
- PlantsVsZombies.exe+2A9F78
- PlantsVsZombies.exe+2AA00C
-
我这里取了第一个作为基地址,双击加入到下面的候选地址栏,得到他的地址006A9EC0
-
当然,你把00400000代入PlantsVsZombies.exe去计也是一样的
-
至此,基地址006A9EC0,一级偏移地址+768,二级偏移地址+5560,全部找出
-
创建MFC,拉一个按钮并双击,写实现代码
void CplantsprojectDlg::OnBnClickedButton1() {
/*
阳光基地址:0x6A9EC0
阳光第1级偏移地址:[0x6A9EC0]0x768
阳光第2级偏移地址:[[0x6A9EC0]+0x768]+0x5560
*/
UpdateData(TRUE);
DWORD dwPid = FindGageProcessIdByWndTitle(_T("植物大战僵尸中文版"));
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
if (!hProcess) {
MessageBox(_T("打开失败"), NULL, 0);
return;
}
DWORD dwTemp = 0; //基地址
if (!ReadProcessMemory(hProcess, (LPVOID)0x6A9EC0, (LPVOID)&dwTemp, sizeof(DWORD), &dwPid)) {
MessageBox(_T("读取失败"), NULL, 0);
CloseHandle(hProcess);
return;
}
dwTemp += 0x768; //加偏移地址
if (!ReadProcessMemory(hProcess, (LPVOID)dwTemp, (LPVOID)&dwTemp, sizeof(DWORD), &dwPid)) {
MessageBox(_T("读取失败"), NULL, 0);
CloseHandle(hProcess);
return;
}
dwTemp += 0x5560; //加偏移地址
DWORD dwShine = 9999; //是传入的值,表示修改后的阳光数
DWORD dwLength = 0; //是传出的值,表示修改了的字节数
if (!::WriteProcessMemory(hProcess, (LPVOID)dwTemp, &dwShine, sizeof(DWORD),&dwLength)){
MessageBox(_T("写入失败"), NULL, 0);
CloseHandle(hProcess);
return;
}
CloseHandle(hProcess);
}
无限金币
思路同无限阳光,CE连接游戏程序,通过金币改变找地金币的值的内存地址,加入到下面候选地址
右击,找出是什么改写了这个地址,然后回到游戏改变金币,得到更改金币指令,从而得到候选地址=某寄存器值+偏移地址28
新的扫描,16进制,刚刚得到的寄存器值,然后转未改变的数值再扫描若干次
取出左上角筛选地址的第一个到候选地址,右击,找出是什么访问了这个地址,会发现很多某寄存器值+偏移地址82C
新的扫描,16进制,刚刚得到的寄存器值,然后转未改变的数值再扫描若干次
取出左上角筛选地址的绿色地址(有四个任取其一即可),或者说是“本程序名”+0级偏移地址(程序基地址偏移)
至此,得到了金币基地址,一级偏移,二级偏移,在MFC程序中增加按钮,双击,写实现代码:
void CplantsprojectDlg::OnBnClickedButton2(){
/*
金币基地址:006A9EC0(或者说是:程序基地址00400000+0级偏移地址002A9EC0)
金币1级偏移地址:[006A9EC0]+0x82C
金币2级偏移地址:[[006A9EC0]+82C]+0x28
*/
UpdateData(TRUE);
DWORD dwPid = FindGageProcessIdByWndTitle(_T("植物大战僵尸中文版"));
HANDLE hProcess = OpenPro