失败的一次尝试
先用Cheat Engine扫阳光的地址,然后找到修改该值的代码。一个是捡阳光时增加,一个是种植物减少。
这里我们看种植物减少的部分。
0041BA76 将计算过的阳光赋值回 阳光数量 这个变量。
一开始的方向是想找到位于.data section的指针,一直指向 edi+0x5560 这个地址。 那么我们就需要看看是什么赋值给edi.
可以看到是00410868: mov edi, ebp
指令将当前函数栈的baseAddress赋值给了edi。
而函数的stack所在的地址是随机的,因此想直接通过修改内存的值来修改阳光可能性非常低了。
修改代码实现阳光不减
回到第一张图, 0041BA69 先调用了一个函数,里面给ebx赋值,疑似植物的阳光开销,然后下面的代码用esi减去ebx。
这里我们只需要将0041BA74 的指令替换为nop指令即可。
此处我们参照upSir的植物大战僵尸逆向教程编写一个程序。
在启动游戏后,打开辅助软件,让他将对应位置的代码修改为nop指令。
int main()
{
int processId = GetProcessByExeName(_T("PlantsVsZombies.exe"));
if (processId == -1)
{
printf("=========================================");
printf("ERROR: 游戏未启动");
printf("=========================================");
}
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, false, processId);
UINT16 nopAsm = 0x9090;
WriteProcessMemory(handle, (void*)0x0041BA74, &nopAsm, sizeof(short), NULL);
std::cout << "Hello World!\n";
}
int GetProcessByExeName(const TCHAR *name)
{
PROCESSENTRY32 processEntry;
memset(&processEntry, 0, sizeof(PROCESSENTRY32));
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
processEntry.dwSize = sizeof(PROCESSENTRY32);
bool noError = Process32First(hSnapshot, &processEntry);
do {
if (_tcscmp(processEntry.szExeFile, name) == 0)
{
return processEntry.th32ProcessID;
}
noError = Process32Next(hSnapshot, &processEntry);
} while (noError);
return -1;
}