C/C++植物大战僵尸之CE找基址+修改器制作(基础版)

47 篇文章 38 订阅

思路:

每个程序打开后他们的数据的内存地址都会改变,但他们的静态基址和偏移不会变

关于获取的是静态基址,所以就算是关闭了游戏,再开启动,地址也是不变的也可以修改

所以我们用CE找到他的静态地址和偏移地址,再用C/C++里面的ReadProcessMemory和WriteProcessMemory进行修改就可以了。


下面用图文解析用CE找植物大战僵尸向日葵产生的那个Sunshine

首先打开CE,选择植物大战僵尸,如下图所示



然后搜索第一次值“150”



搜索完后,有很多数据,先不要管他,先种一朵花,花掉100点,这是我们可以看到一个数据有变化(如下图)



随后我们双击那个内存,然后在下面那个框里面右击,然后选择紫色框



随后我们找到这数据的详细信息,然后记录他的偏移地址0X5560和要查找的地址的可能值11565EA0(如下图所示)



接下来,我们查找这个值:11565EA0如下图所示



查找后经过筛选发现地址为0x27FA760的地址与游戏数据sunshine有关,我们记录下。如下图所示偏移地址为00x768,要查找的地址指针可能是027F9FF8



接下来我们查找这个地址0x027F9FF8,我们找到一个绿色的静态基址(绿色显示的是静态基址),如下所示



我们现在分析下这个静态基址经过两次偏移是不是就对应了sunshine


我们发现这个基址经过第一次偏移0x768和第二次偏移0x5560后在地址0x11568400地址里面的值是50,正好对应。所以我们已经找到了这个静态基址(读者可以修改尝试)


所以如果我们要做修改器。我们理一理思路

由地址0x006A9F38里的值+0x768后是个地址,

这个地址里的值+0x5560就是存储sunshine的内存单元。

所以我们C/C++代码如下(因为代码比较简单,遇到不会的函数可以查百度或者msdn,在此不再详细说明)

源码里面有注释

代码如下:

#include <Windows.h>
#include <stdio.h>


int main()
{
	DWORD  getLastError;
	//找到窗口
	HWND hWinmine = FindWindowW(NULL, L"植物大战僵尸中文版");
	DWORD dwPID = 0;
	GetWindowThreadProcessId(hWinmine, &dwPID);	//获取进程标识
	if (dwPID == 0)
	{
		printf_s("获取PID失败\n");
		return -1;
	}
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwPID);
	if (hProcess == NULL)
	{
		printf_s("进程打开失败\n");
		getLastError = GetLastError();
		return -1;
	}

	DWORD dwNum = 0, dwSize = 0;
	
	//基址
	DWORD SunShineBaseAddress = 0x006A9EC0;
	//基址值
	DWORD SunShineBaseAddressValue = 0;
	if (0 == ReadProcessMemory(hProcess, (LPVOID)SunShineBaseAddress, &SunShineBaseAddressValue, sizeof(DWORD), &dwSize))
	{
		printf_s("静态址获取失败\n");
		getLastError = GetLastError();
		return -1;
	}
	//一级偏移
	DWORD SunShineOffsetFirst = 0x768;
	//一级偏移值
	DWORD SunShineOffsetFirstValue = 0;

	if (0 == ReadProcessMemory(hProcess, (LPVOID)(SunShineBaseAddressValue + SunShineOffsetFirst), &SunShineOffsetFirstValue, sizeof(DWORD), &dwSize))
	{
		printf_s("一级偏移获取失败\n");
		getLastError = GetLastError();
		return -1;
	}

	//二级偏移
	DWORD SunShineOffsetSecond = 0x5560;
	//最后值
	DWORD SunShineNum=0;
	if (0 == ReadProcessMemory(hProcess, (LPVOID)(SunShineOffsetFirstValue + SunShineOffsetSecond), &SunShineNum, sizeof(DWORD), &dwSize))
	{
		printf_s("二级偏移获取失败\n");
		getLastError = GetLastError();
		return -1;
	}
	int modifySunshine;
	printf_s("SunShineNum:%d\n", SunShineNum);
	printf_s("输入你要修改后的值:");
	scanf_s("%d", &modifySunshine);
	WriteProcessMemory(hProcess, (LPVOID)(SunShineOffsetFirstValue + SunShineOffsetSecond), &modifySunshine, sizeof(DWORD), &dwSize);
	

	CloseHandle(hProcess);
	system("pause");
	return 0;
}
运行结果如下图所示:

因为获取的是静态基址,所以就算是关闭了,再开,也可以修改。

下节课中我们用Qt封装下界面,就可以发给小伙伴使用了。

  • 34
    点赞
  • 161
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: 基址(base address)是指在计算机程序中存储区域的起始地址。在使用某些工具和技术进行逆向工程或调试时,基址是一项非常实用的技巧。以下是五种常见的方法来基址: 1. 静态基址:通过分析程序的源代码或反汇编结果,查程序中使用到的全局变量或函数的指针,从而基址。 2. 寄存器基址:某些程序会将内存地址暂存在CPU的寄存器中。通过跟踪程序的运行过程,可以观察并分析这些寄存器中的值,基址。 3. 引用链基址:程序中的某些数据对象可能会以链表结构进行组织。通过跟踪这些链表的指针,可以追溯到链表的头结点,从而基址。 4. 堆栈基址:在程序的堆栈(stack)中,可以通过寻栈帧(stack frame)的指针,并分析栈帧的结构,来基址。 5. 动态基址:有些程序会在运行时生成代码或修改内存布局,使得基址的位置会经常变化。通过动态分析和调试工具,可以实时捕捉和跟踪这些基址的变化,最终基址。 此外,也有一些单独基址的方法: 1. 遍历内存:通过扫描程序的内存空间,到存储有特定数值(如全局变量的初始值)的地址,作为基址的候选。 无论使用哪种方法,基址后,可以将其用于数据的读写、函数的调用以及其他与内存相关的操作,更好地理解和控制程序的行为。但需要注意的是,基址的位置可能会因为程序的更新或变化而发生变动,因此需要动态调试技术来保持基址的可追踪性。 ### 回答2: 基址是指在计算机程序中,通过一系列的技术手段,确定某个变量或内存地址的准确位置。这在软件逆向工程和调试等领域非常实用。在OD (OllyDbg) CE (Cheat Engine)这两个常用的调试和修改工具中,可以采用以下五种方法来基址: 1. 静态基址:在程序运行前,通过静态分析确定变量或内存地址的基址,然后在运行时,通过相对偏移计算出真实地址。这种方法适用于没有代码加密或混淆的程序。 2. API函数追踪:通过追踪程序中的API函数的调用,可以间接地找出变量或内存地址的基址。例如,可以追踪与目标变量读写相关的函数,然后通过函数内部的计算与操作,找出基址的位置。 3. 数据断点:通过在程序内设置数据断点,当指定的变量或内存地址发生读写操作时,可以确定变量的所在位置。OD和CE都支持这种方法,可以实时监控变量的值和地址变化。 4. 内存搜索:通过在程序运行时,利用OD或CE的内存搜索功能,可以到指定的变量或内存地址的基址。可以通过初始值、已知偏移等条件,缩小搜索范围,然后进行逐步逼近。 5. 反汇编代码分析:通过反汇编程序的代码,结合逆向工程的技术,可以分析出变量或内存地址的相关指令和操作,从而推算出基址的位置。 此外,除了以上的五种方法外,还有一种单独基址的方法,即通过内存修改器直接对变量进行修改,然后观察变量在内存中的位置变化。这种方法适用于一些简单的游戏应用,但不适用于复杂的程序和应用。 总之,基址的方法有多种多样,可以根据具体情况选择合适的方法。在使用这些方法时,需要对程序进行详细的分析和调试,有一定的逆向工程知识和经验会更有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值