1. 程式人生 > 其它 >C# 植物大戰殭屍逆向之---實現豌豆秒殺殭屍 (編寫植物大戰殭屍輔助 三)

C# 植物大戰殭屍逆向之---實現豌豆秒殺殭屍 (編寫植物大戰殭屍輔助 三)

C# 植物大戰殭屍逆向之---實現豌豆秒殺殭屍 (編寫植物大戰殭屍輔助 一)

 

本章說明:

  工具:CE7.3 + ollydbg反彙編工具

  功能:實現植物秒殺殭屍的功能

 

演示:

 

 

 

一、找出植物打殭屍時的給殭屍扣血的地址來源。

    思路是這樣: 要實現秒殺殭屍,那麼我們要先找到這個殭屍的血量,然後根據豌豆每打一次殭屍,殭屍會減血多少,我們也就知道豌豆的攻擊力是多少。

 

  1.上手,開啟CE 新增上植物大戰殭屍的程序。

  然後,我們最開始也是不知道殭屍的血是多少,我們需要選擇為未知的初始值。

  

 

 

  2.在遊戲中種植一顆豌豆射手,來攻擊殭屍,當攻擊到殭屍的一瞬間,我們就暫停遊戲。

    然後切換到CE 選擇為減少的數值,點再次掃描。 過濾出不要的記憶體地址

    

 

 

 

 

 

 

   多往復幾次,知道篩選出資料不夠多的時候,就差不多了。注意別打殭屍打死了。。。

 

 

 

  最後只剩100多條資料了,我們發現這個是最像的。 其他那些數值都是亂七八糟的值,完全不像是殭屍的血量。

 

 

 

我們來實驗一下看,會發現,每次豌豆攻擊到殭屍的時候, 130就會-20.。 那麼就基本上可以確定了。

 

 

   豌豆射手的預設功力為20,  接下來就需要找到豌豆射手這攻擊力20是存在記憶體中哪個地方的, 我們找到存放豌豆射手傷害的記憶體地址,修改它傷害的值,改為9999 那基本上就是秒殺了。

 

二、通過OD來附加植物大戰殭屍程序,通過反彙編來找到豌豆射手的傷害地址。

  找到植物大戰殭屍的程序。點附加

 

 

  然後相關資料就被載入進來了。

  

  1.視窗模組截圖:

 

 

 

  2.在od中下入斷點。  OD 在命令框輸入 hw 2D8A8E80 (殭屍血量的記憶體地址)  然後回車。   

 

  我這兒先通過修改地址修改數值 把殭屍的血量改為9980了,  因為等會還要除錯的,不然給這殭屍打死了,不好測試。

 

  

 

 

 

 

  3.檢視斷點是否成功。

  

 

 

 

   4. 斷點下入成功,我們回到遊戲,繼續讓植物打殭屍。發現OD中斷點已經攔截下來了, 遊戲就會卡主。

  

 

 

   5.確定到程式已經進入到這兒,找對地方後,放開斷點,讓程式繼續走起來。   F9也可

  

 

 

 

 

        6.我們需要往上走,找到這段彙編程式碼的程式頭那兒。

  

 

 

   

  7.在函式開頭那兒下入一個斷點,我們需要重堆疊來分析 這個函式是從哪個地址跳過來的。

 

  點中這一行按F2下入斷點, 下入斷點後 地址會變紅。  

  

 

  切迴游戲,讓植物攻擊殭屍, OD就已經命中斷點了。 

  

 

 

 

   我們這時候檢視堆疊視窗 

  

 

 

   接著對著堆疊視窗的這行,右鍵 跟隨到資料視窗

  

 

 

   就會到相應的記憶體地址去

  

 

 

   8. 從記憶體視窗往上翻,檢視是哪裡在call這個函式。

  

 

 

 

   跟隨到相應的彙編程式碼地址去

  

 

 

  點選確定後,彙編視窗會移動到這個地方來,就是call 我們剛才那個函式的地址。

 

   

 

  在這兒下入斷點,讓植物攻擊殭屍檢視下暫存器的資料。  發現EAX、EDX、EBP暫存器都是00000014 它這是16進位制的,對應10進位制就是20. 

  這20就是豌豆的傷害值。 但是我們不知道到底哪個才是。

  

 

 

 

   9.接下來我們從這繼續往上找,先繼續到這個函式的頭部,檢視下入斷點,讓植物攻擊下殭屍,斷下來看看暫存器的值。

  

 

 

   當程式執行到這個函式的頭部時, 我們發現EDX暫存器的值14 (16進位制)豌豆射手的傷害已經存在了,說明這個傷害值還來自外部,我們還要繼續往外面追溯。  

  程式已經斷點到這兒了,我們直接檢視堆疊視窗。

  

 

 

   照樣在堆疊這條資料右鍵跟隨到資料視窗 ,檢視記憶體中的值。

  往上走會找到一個call,會看到是哪個地方在call當前這個函式。

  

 

 

   

  跳轉到對應的彙編視窗去。

  

 

 

 

  

 

   跳轉到這兒後,我們往上看彙編程式碼, 看有沒有哪裡在給 EDX暫存器賦值的操作。    發現就在跳轉到這裡來上幾句 就在給edx暫存器賦值。  我們在那句下入斷點。

  

 

 

  切迴游戲,讓植物攻擊殭屍。  然後命中給edx賦值這句程式碼的 斷點

  

 

   我們往下執行一句,在看暫存器有什麼變化。

  

 

   好,到這兒我們就能確定了。

  EDX暫存器的值是豌豆射手傷害賦值的最起始地方。

  然後 看這句程式碼 

  0047D483 . 8B148D 18A974>mov edx,dword ptr ds:[ecx*4+0x74A918]

   ECX暫存器的值是0  空的。 *4  那自然也等於0 。  然後 0+0x74A918偏移地址。 從這個記憶體中取的值就是豌豆射手的傷害。

  程式碼中0x74A918是直接寫死的,不是從某個暫存器地址中去獲取的。  那麼這個地址就=基址了。  我們也不需要在往上追了。

  我們拿出0x74A918這個地址到CE去。 手動新增地址,看下是不是20.

  

 

  找對了。是20.  我們點確定,然後把它值修改為9999試下看,

  

 

 

  確定後回到遊戲,種豌豆試試看, 直接瞬秒殭屍

  

 

 

   二、基址也有了。我們開始編寫C#程式碼實現秒殺殭屍。

  

        /// <summary>
        /// 豌豆射手秒殺
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void check_seckill_CheckedChanged(object sender, EventArgs e)
        {
            if (check_seckill.Checked)
            {
                EastDrive.DriverWrite.WriteMemoryInteger(proId, 0x74A918, 9999);
            }
            else
            {
                EastDrive.DriverWrite.WriteMemoryInteger(proId, 0x74A918, 20);  //還原豌豆射手預設20傷害
            }
        }