《植物大战僵尸》 辅助编写1——阳光不减

失败的一次尝试

先用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;
}

最后的效果图

posted @ 2023-02-05 23:40  dewxin  阅读(154)  评论(0编辑  收藏  举报