C# 植物大戰殭屍逆向之---實現植物無冷卻 (編寫植物大戰殭屍輔助 一)
C# 植物大戰殭屍逆向之---植物無冷卻 (編寫植物大戰殭屍輔助 一)
本章說明:
利用CE工具找出植物道具欄冷卻的地址,實現道具無冷卻
一、首先還是開啟CE工具,新增上游戲程序,開始搜尋值,我之前已經搜到植物冷卻的資料型別為位元組,
在可使用的情況下為1,否則為0。 (之前我已經通過搜尋未知的資料找出來了,我這裡就不演示了。直接搜尋1)
找出這麼多資料後,我們拿起植物,它的值就會變為0, 點再次掃描
然後我們又點右鍵 取消種植,他就又恢復1,重複的掃描幾次,就會排除很多無用的資料。
最後排查出還有這些地址。接下來判斷哪一個才是對的,把資料拉下來。
上一章說到,一般記憶體地址很有規律規則的先不看它,我們優先看比較特別的地址,目前就只有這一個。
我們來試著把數值改一下,改成0,看植物會不會進入冷卻狀態
這樣就是找對了,改為0後,他會進入冷卻狀態。 那麼我們接下來就開始找它的靜態地址 (每次啟動遊戲固定的)
跟上一章一樣的。
二、找基址
在CE右鍵這個地址,檢視是誰在寫入這塊資料,往上追溯。(遊戲中,當你拿起植物的時候,肯定有一塊地址在往冷卻的這個地址寫值的,我們要找到是誰在往這兒寫資料)
我們會看到沒有顯示資料, 我們回到遊戲中拿起這個植物再放下,它就會往這兒寫資料了。
我們選中寫入1的這個一項,點選更多資訊後 會彈出額外資訊框。
然後分析一下這段程式碼,我們看到
它再記憶體中從暫存器eax+edx+70偏移的地址來置為1
然後我們從暫存器資訊中中看到eax 值是為0的,所以忽略掉。
然後edx是 2D5306F0
再開啟計算器用這個地址+上70的偏移,發現跟我們CE最開始找出的地址是同一個。
那麼我們就是找對了的。
現在我們已經知道有一層的偏移是 70了, 記住,我們還要接著往上找。
分析下edx暫存器的來源,CE十六進位制 4位元組搜尋下這個EDX的值是哪個記憶體在儲存著這個值。
只有一個就很省事,不用去排查其他的。 拉下來檢視什麼在訪問這個地址,進入遊戲拿起植物又放下
又發現edx的來源 是ECX暫存器+15C的偏移取的記憶體值。 我們點選這一項檢視更多資訊看看。
, 搜尋這個地址值。 查出70多條資料。 老樣子,我們先看比較特別一點的地址。
進入遊戲拿起植物又放下,檢視誰在對這個地址進行寫入
發現ecx暫存器的值又來源於 ebx+868偏移,點選更多資訊進去。
EBX的值是 0265A528, CE繼續搜這個地址.
現在基本上已經找出來了,靜態地址已經出現了。 我們來看這個靜態地址是誰在訪問。
現在就已經找到了,ECX暫存器的值來源於直接從00755E0C記憶體中取值的。 那麼就用這個靜態地址加上三層偏移,就ok了。
到這兒,我們會發現,也只是植物欄1 的植物無冷卻了,我們還需要將 其他的找出來。
這兒就有個技巧了,遊戲開發者,一般都不會將道具欄每一格都分開儲存的, 大部分都是陣列或者連結串列。 我們先試試第一種,從我們找出的第一個道具欄的地址來加一定的偏移 看看能不能找出。
三、新增偏移,找出所有植物欄的冷卻地址。
我們一下一下子的加,看找出來的地址資料,是不是1和0,是的話 我們就修改下值,到遊戲中看對不對。
我這邊已經試出來了,點20下,每次點一下都會加4位元組。
然後修改數值 到遊戲測試,發現是正確的。 那麼接下來的4個植物欄都是一樣的在上一個基礎上點20下。 那麼對應十六進位制每次增加的是50。 我們用計算器也可以計算出下一個偏移是多少
好。到這兒基本上所有的植物欄的冷卻值都知道了。
四、編寫C#程式,實現植物欄無冷卻
1 bool isCooling = false; //是否開啟無冷卻 2 int CoolingTimerId; //冷卻時鐘id 3 4 /// <summary> 5 /// 獲取植物欄1冷卻基址 6 /// </summary> 7 /// <returns></returns> 8 public int GetCoolingMemoryAddr() 9 { 10 int addr; //靜態地址 11 int drift; //偏移1 12 int drift2; //偏移2 13 int drift3; 14 15 addr = EastDrive.DriverRead.ReadMemoryInteger(proId, 0x00755E0C); //獲取出靜態地址中的陽光地址值 16 drift = EastDrive.DriverRead.ReadMemoryInteger(proId, addr + EastDrive.Tools.BaseS_16To10("868")); //加上第一層偏移 17 drift2 = EastDrive.DriverRead.ReadMemoryInteger(proId, drift + EastDrive.Tools.BaseS_16To10("15C")); //第二層偏 18 drift3 = drift2 + EastDrive.Tools.BaseS_16To10("70"); //第三層偏移 拿到存值冷卻值的地址 19 20 return drift3; 21 } 22 23 /// <summary> 24 /// 植物欄無冷卻 25 /// </summary> 26 /// <param name="sender"></param> 27 /// <param name="e"></param> 28 private void check_cooling_CheckedChanged(object sender, EventArgs e) 29 { 30 isCooling = check_cooling.Checked; 31 32 if (!isCooling && CoolingTimerId != 0) //關閉 33 East.WinCore.Win32Api.CloseTimer(CoolingTimerId); 34 else 35 StartCooling(); //開啟 36 } 37 38 /// <summary> 39 /// 開啟無冷卻 40 /// </summary> 41 public void StartCooling() 42 { 43 //建立時鐘 鎖定冷卻值 44 CoolingTimerId = East.WinCore.Win32Api.SetTimer(() => 45 { 46 //總共6個植物欄地址 每次疊加50(十六進位制的偏移) 對應十進位制為80 47 EastDrive.DriverWrite.WriteMemoryInteger(proId, GetCoolingMemoryAddr(), 1); //寫入1 無冷卻。 48 EastDrive.DriverWrite.WriteMemoryInteger(proId, GetCoolingMemoryAddr() + 80, 1); 49 EastDrive.DriverWrite.WriteMemoryInteger(proId, GetCoolingMemoryAddr() + 80 * 2, 1); 50 EastDrive.DriverWrite.WriteMemoryInteger(proId, GetCoolingMemoryAddr() + 80 * 3, 1); 51 EastDrive.DriverWrite.WriteMemoryInteger(proId, GetCoolingMemoryAddr() + 80 * 4, 1); 52 EastDrive.DriverWrite.WriteMemoryInteger(proId, GetCoolingMemoryAddr() + 80 * 5, 1); 53 }, 100); 54 }
現在開啟功能,我們就會發現,即使拿起植物,它也不會進入冷卻狀態。
下一章:實現豌豆射手秒殺殭屍的功能。