1. 程式人生 > 其它 >C# 植物大戰殭屍逆向之---Hook技術實現殭屍快速進攻的效果 (五)

C# 植物大戰殭屍逆向之---Hook技術實現殭屍快速進攻的效果 (五)

C# 植物大戰殭屍逆向之---Hook技術實現殭屍快速進攻的效果 (五)

本章說明:

  當然要實現殭屍快速進攻的效果有很幾種實現方式,我們本章用Hook來實現該功能。

  利用Hook技術,可以不用找到殭屍進攻倒計時的基址,直接修改到殭屍出現倒計時的資料,從而達到殭屍快速進攻的效果。

  天上落陽光、向日葵生成陽光原理是一樣的,都是有一個倒計時,我們都可以通過Hook來實現遊戲中不停的落陽光效果。

前言:

  首先解釋下什麼是Hook(鉤子), 通俗簡單來講,就是給目標程序的程式在記憶體中執行某段程式碼的時候,改變他的執行流程,就是Hook,利用該技術一般可以實現:

  1.通過Hook來回調目標程序的資料到本程式當中來,(說白了就是監聽)

  2.可以給目標程序置入自己的程式碼去執行。

  

  簡單畫個圖說明下吧:

  1. 程式正常是在記憶體中是按順序依次去執行程式碼。

  

  2.舉個例子,我們可以在目標程式程式碼B中置入個鉤子,讓目標程式在執行到程式碼B處時將這個程式的某個資料傳給我們自己的程式。

  

  3.也可以改變目標程式的程式碼的執行流程。

  

   簡單這樣解釋下基本就差不多了,更詳細的可以網上看下其他文章。  接下來就開始操作

一、進入遊戲,CE附加上游戲程序,開始搜尋資料。

  1.首次搜尋

  

  2.回到遊戲後繼續遊戲,馬上又切出來搜尋減少的資料。來回往復

  

  3.最後,發現這條資料在一直減少,直到減少直0的時候,殭屍就出來了

   

  為了驗證,你可以把它拉下來,然後鎖定,你發現殭屍一直都不出來,就是對的地址

  4.右鍵這個地址,找出是誰寫入這個地址。

  

  5.等到殭屍再次出現的時候,就會出現兩條mov的操作。

  

   6.選中它,點選右側顯示反彙編程式,來到反彙編視窗。  對應程式碼處的地址就是記憶體地址了,這個地址只要程式不更新編譯,是不會變的。

 

   7.在這句程式碼處右鍵  設定個斷點。然後回到遊戲,等待它再次執行

  

  8.當殭屍出現後,會發現程式已經斷點攔截到了。我們可以看到eax暫存器的值是:B0B

  

   9.用計算器可以換算為10進位制看看。 對應過來就是2827

   

  10.我們往下面執行一句。 會發現殭屍倒計時的時間又開始重新計算了

  

  也就是說,殭屍出現的時間是從這個eax暫存器的值放到殭屍出現倒計時的記憶體中的。   

    那麼我們就可以從這兒下手了,我們可以將這個記憶體的倒計時給它每次都改為10毫秒,那麼基本上這一批殭屍都會同時一起出現來進攻我們了。

      實現方式可以也像之前的文章去找到這個殭屍出現的基址+偏移定位到這個記憶體中,定時頻繁的修改這個數值為10毫秒,就可以實現這一批殭屍同時進攻出現。

      但我們本章用Hook來實現這個功能。

  

二、Hook思路

  1.從上面看到殭屍出現倒計時的時間來自於eax暫存器, 那麼我們可以可以給這個記憶體地址這兒植入Hook來修改eax暫存器的值。

  我們可以編寫彙編程式碼為:

  mov eax,0x10

  mov [ebp+0x55b8],eax

  可以通過將這個程式碼置換到4201C9這個記憶體中,就可以實現每次都只需要16毫秒就重新整理殭屍,幾乎就是同時出現了。

  

  但是我們發現,它這段記憶體中,只有6個位元組,我們自己的程式碼不夠放到這兒。強行寫入會替換掉程式下面的程式碼的對應的位元組,從而影響程式本身的執行

  

   為了保持堆疊平衡,我們只能在這個遊戲程序中申請一塊新記憶體,植入我們的程式碼,執行後直接跳回到當前的下一句,就搞定了。

  2.將彙編程式碼轉為機器碼位元組。

  

  3.封裝Hook類

  

  4.編寫C#程式安裝Hook。    SuperHook這個類是我上面封裝好的。後面在單獨講解。

 1         public static HookData Hookattack = null; //殭屍進攻加速Hook資料
 2 
 3         /// <summary>
 4         /// 殭屍進攻加速
 5         /// </summary>
 6         /// <param name="sender"></param>
 7         /// <param name="e"></param>
 8         private void check_attack_CheckedChanged(object sender, EventArgs e)
 9         {
10             if (check_attack.Checked)
11             {
12                 byte[] code = new byte[] { 184, 16, 0, 0, 0, 137, 133, 180, 85, 0, 0 };
13 
14                 SuperHook.PutHook(proId, "004201B1", CallBackattack, out HookJattack, 6, 2, code, false); //植入Hook
15             }
16             else
17             {
18                 SuperHook.SuspendHook(proId, "004201B1", Hookattack.SourceCodeData);  //暫停復原
19             }
20         }

  

   5.看下實現好的效果,我將陽光也給封裝好了,原理是一樣的 

     這時殭屍就是直接一群一起出來了。