實驗工具:
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; }
