[輔助制作]尋找植物大戰僵屍卡槽冷卻基址


實驗工具:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM