1. 程式人生 > 其它 >C# 植物大戰殭屍逆向之---實現植物無冷卻 (編寫植物大戰殭屍輔助 一)

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         }

 

 

 

現在開啟功能,我們就會發現,即使拿起植物,它也不會進入冷卻狀態。

 

 

 

 

 

下一章:實現豌豆射手秒殺殭屍的功能。