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.看下實現好的效果,我將陽光也給封裝好了,原理是一樣的
這時殭屍就是直接一群一起出來了。