[提問] CE裡的autoassembler怎麼寫?

1. [enable]
2. registersymbol(KiKiVac) //註冊變數
3. alloc(KiKiVac,256) //宣告所佔記憶體容量
4. label(KiKiReturn) //標記
5.

6. KiKiVac: // 533b7d
7. mov edx,[7cd55c] //把[7cd55c]位址的內容複製到edx
8. lea edx,[edx+35c] //把[edx+35c]的地址給edx
9. mov ecx,[edx] //把edx位址的內容複製到ecx
10. mov edx,[7cd55c]
11. lea edx,[edx+358]
12. lea eax,[edx] //把[edx]的地址給eax
13. mov eax,[eax]
14. jmp KiKiReturn //跳到 KiKiReturn 執行
15. KiKiReturn:
16. jmp 53B852 //跳到 53B852 執行
17. [disable]
18. unregistersymbol(KiKiVac) //註銷變數
19. dealloc(KiKiVac) //釋放記憶體
//mov 傳遞變數數值
//lea 傳遞變數地址

基本上來說, 這段程式碼是作一個Detour Hook. 有許多外掛的核心運作原理就是Hook.

一般來說, 如果需要更改一個程式的行為, 我們可以有兩種主要的方法來達成, 一種就是更改那個程式運行時候的變數. ( CE 裡面加入地址跟值的那種 ) 另一種就是改變程式的程式碼.

有時候, 我們需要改變一段程式碼, 例如說, 程式碼原本是 0xAA 0xBB 0xCC 0xDD 0x11 0x22, 那我們要把他改成0xAA 0xBB 0xFF 0xDD 0x11 0x22, 原本的0xCC變成0xFF, 程式的行為就改變了. 但是, 時常出現的問題是, 我們要改的東西比原本的大, 例如說, 我們要把0xCC改成0x77 0x88 0x99, 那空間不夠, 怎麼辦呢? 我們就再取得一塊記憶體( alloc(KiKiVac,256) ), 然後寫我們要的程式碼進去, 然後, 再將原本的地方改成跳至我們取得的那塊記憶體執行即可, 這種方式就是Hook. 那特別是使用jmp的方法改變執行順序的Hook方式, 我們叫他Detour Hook.

—————————————————–

如果想要真正了解這段程式碼, 我建議你一定要熟讀x86的指令集, 這是最基本的, 然後在了解CE的Auto assembly的指令( [enable], [disable], alloc, dealloc, registersymbol, unregistersymbol, label ), 最後要了解遊戲程序裡面, 靠近你Hook的程式碼附近是什麼意義, 那就可以了解這段程式碼真正的意義.

參考: x86 指令集官方參考資料 http://www.intel.com/products/processor/manuals/ ( 詳見Volumn 2 )

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s


%d 位部落客按了讚: