实验工具:
CE
DEV C++
首先我们得找到冷却的动态地址,再找基址
一、打开CE
找到植物大战僵尸的进程,并装载
然后我们搜索1(植物拿起是0,放下是1)
我们就先拿起,然后点再次搜索0。然后放下,然后再次搜索1。
我们搜到7条地址
然后再一个个排除
怎么排除呢
我们随便找一个地址,右键,查看是什么改写了这个地址。
然后出现这样一个窗口
这时候我们再回到界面,拿起植物,再放下植物。发现窗口并没有数据出现,我们就可以排除掉这个窗口了。
随后我们找到地址为0BEE8648的地址有写入数据
00488E73 - C6 45 48 00 - mov byte ptr [ebp+48],00 00488E7D - 88 45 49 - mov [ebp+49],al 0040CDEA - C6 44 08 70 01 - mov byte ptr [eax+ecx+70],01
我们分析放下的数据,也就是mov byte ptr [eax+ecx+70],01
双击打开详细信息
这里可以看到,关键代码处就是mov byte ptr [eax+ecx+70],01
后面那个[]中间装的就是我们的偏移值
其中地址指针是0BEE85D8
我们再到CE 中去搜索这个值(搜索的时候记住是HEX--十六进制)
我们点再次扫描,去掉会变动的值
找到一处地址为0F26B60C的数据
这回我们要点击是什么访问了这个地址(点改写你会发现没有数据)
然后再拿起放下植物,找到最后一行数据
找到下一个偏移量是144,地址是0F26B4C8
再按照上面的操作搜索
发现没有静态的地址
继续往下面找
找到后点开最后放下植物所留下的数据
mov esi,[esi+00000768]
可以看到偏移量是768
访问它的地址是002326F0
再去搜索这个地址看看
往下面拖一点就会看到有几个地址是绿色的,这个绿色的地址代表静态地址,也就是基址
我们找到基址后,记录下来,并点击手动添加地址
从上所知
基地址为:006A9EC0
一级偏移为:768
二级偏移为:144
三级偏移为:70
经过尝试,发现第一个卡槽的三级偏移是 70+ eax(此时eax的值为0)
卡槽二的三级偏移为 70+ 50
卡槽三的三级偏移为 70 + 50*2
也就是说卡槽是从零开始算起,依次加50的偏移量就可以了
下面我们测试下,先将地址添加后 激活,让该地址的值一直为1
成功修改后,我们用C做一个简单的写入
#include<stdio.h> #include<windows.h> int main(){ HWND hWnd; //窗口句柄 DWORD pid; //进程句柄 HANDLE hProcess = 0; DWORD addr = 0x006A9EC0; //基地址 DWORD offset2 = 0x144; //二级偏移 DWORD offset3 = 0x768; //一级偏移 int s; printf("输入要冷却的卡槽:\n"); scanf("%d",&s); hWnd = FindWindow(NULL,"植物大战僵尸中文版"); if (hWnd != 0){ GetWindowThreadProcessId(hWnd, &pid); hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//打开进程,取得句柄 if(hProcess == 0){ printf("打开游戏进程失败!\n"); }else{ printf("打开游戏进程成功!\n"); } }else{ printf("游戏未运行,或请使用管理员运行辅助.\n"); } if(hProcess == 0){ printf("请先打开游戏进程\n"); }else{ DWORD buf; DWORD value; DWORD offset1; int t = 1; value = (DWORD)s; ReadProcessMemory(hProcess, (LPVOID)addr, &buf, 4, 0); offset1=value*0x50 + 0x70; ReadProcessMemory(hProcess, (LPVOID)(buf + offset3), &buf, 4, 0); //计算三级偏移 printf("buf3=%x\n",buf); ReadProcessMemory(hProcess, (LPVOID)(buf + offset2), &buf, 4, 0);//计算二级偏移 printf("buf2=%x\n",buf+ offset1); DWORD res = WriteProcessMemory(hProcess, (LPVOID)(buf + offset1), &t, 4, 0); //计算一级偏移并写入 if (res == 0) { printf("修改失败"); }else{ printf("修改成功"); while(1){ WriteProcessMemory(hProcess, (LPVOID)(buf + offset1), &t, 4, 0); } } } return 0; }