首页 > 其他分享 >《植物大战僵尸》 辅助编写1——阳光不减

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

时间:2023-02-05 23:55:48浏览次数:62  
标签:processId 僵尸 不减 edi 植物 阳光 printf 编写 赋值

失败的一次尝试

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

最后的效果图

标签:processId,僵尸,不减,edi,植物,阳光,printf,编写,赋值
From: https://www.cnblogs.com/dewxin/p/17094199.html

相关文章

  • STM32 RTC掉电不走时(有备用电池供电,HAL库编写)
    问题简述:实验环境:使用stm32cubemx配置生成了一个RTC的工程,使能了外部时钟LSE,提供了备用电池VBTE。问题:断开主电源后(备用电池已经安装好了),再次上电读取RTC的值发现,数值为断......
  • 项目管理:如何编写高质量的Makefile?
    文章目录​​背景​​​​熟练掌握Makefile语法​​​​规划Makefile要实现的功能​​​​设计合理的Makefile结构​​​​掌握Makefile编写技巧​​​​技巧1:善用......
  • 【教程搬运】分析并编写suricata规则(内含两个示例)
    suricata规则分析参考1参考2Suricata签名的结构在高层次上,Suricata签名由三部分组成:Action:当流量符合规则时采取的行动Header:一个标题,描述主机、IP地址、端口、协......
  • 进程控制之僵尸进程和孤儿进程
    一、孤儿进程1.孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程。子进程成为孤儿进程之后,init进程则会成为其新的父进程,称为init进程领养孤儿进程。2.例程:1......
  • 编写干净代码的 9 条必须知道的规则
    您是否厌倦了盯着一堆连您的猫都不会碰的代码?别再看了。在这篇文章中,我将告诉您9条规则,将您的烂尾代码变成艺术品。 所以喝杯咖啡,坐下来负责你的代码!规则#1-让你......
  • drf快速编写接口
    创建序列化类字段参数fromrest_frameworkimportserializersfromapp01.modelsimportBook举例:classBooksSerializer(serializers.Serializer):name=seria......
  • USB键盘驱动编写和测试
    一、原理分析1.首先通过打印usb_buf[i]中的8字节数据,看一下按键按下之后会接收到什么。1)通过按完所有键盘按键打印的结果可知,有8个按键会打印在usb_buf[0]里,即:ctrl左键......
  • 使用python编写简单的api接口
    先安装flask模块pipinstallFlaskpy文件fromflaskimportFlask,request,jsonifyapp=Flask(__name__)@app.route('/hello_world')defhello_world():r......
  • python pandas.DataFrame 编写的Excel分割工具
    importpandasaspdfrompandasimportDataFrameasDFimportosclassSplitExcel(object): """ 分割任意的Excel文件,根据指定的列对文件进行分割,并存储到指......
  • 编写 预留单查询报表 遇到的问题
    1.写完代码运行的时候报错了,前面输查询条件的那个页面没有问题,展示的时候出问题了,错误信息是:运行时错误      GETWA_NOT_ASSIGNED上网查了之后,说是内表结......