[辅助制作]寻找植物大战僵尸卡槽冷却基址

时间:2024-04-17 20:05:53

实验工具:

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