這一篇介紹外掛程式的工作原理。如果對外掛程式是怎麼工作的沒有乙個大概的了解的話,那這一系列文章只能當故事看了。
如下圖所示,大方框表示diablo ii.exe的程序空間,框內左側的虛線表示遊戲的主線程迴圈。遊戲主線程迴圈所做的工作大約有:繪製客戶端畫面、響應伺服器端的命令,以及接收玩家的滑鼠鍵盤輸入等。框內右側的小方框就是所謂的外掛程式(injected dll)。
外掛程式要工作首先要載入到遊戲程序空間,最常用的方法一般是通過dll的遠端注入,比如在nt/2k/xp下可以用createremotethread/loadlibrary方法,9x平台稍微麻煩一點兒。也有做成和遊戲程式一起啟動的,比如利用d2loader的plugin載入功能。外掛程式要發揮作用,就要在必要的時刻感知遊戲的狀態,這個可以通過在遊戲本身**中設定旁路點(detour patch)改變原有程式的流程做到。因此外掛程式載入以後首先要做的就是設定旁路點(一般是乙個跳轉指令,有hook api經驗的同學比較容易理解,但和hook api不同的是,旁路點不一定在函式的入口處)。由於設定旁路點需要修改原有遊戲**,而如果修改的同時主線程正好執行到那兒就會導致遊戲崩潰,因此設定旁路點的**最好在遊戲主線程的上下文環境中執行(可以通過setwindowlong設定訊息鉤子,用sendmessage觸發主線程呼叫視窗過程,然後在視窗過程中進行設定)。
圖中的黃色方框就是乙個旁路點。通過旁路點,在適當的時刻遊戲的主線程就會跳轉到外掛程式中,此時外掛程式就取得了控制權,它做完處理後,再跳轉回旁路點的後面繼續執行-這是乙個典型的外掛程式**執行流程。舉個例子來說,diablo中有好幾種天氣效果:晴天、雨天、雪天等。可以想象遊戲中肯定有一段負責繪製天氣**,如果在這段**附近合適的地方插入乙個旁路點,就可以控制天氣的繪製,始終讓遊戲處於晴天。maphack設定的旁路點有上百個。
其次,外掛程式要做更多的事情,就要充分利用遊戲原有的函式、**,比如diablo的程式內部有乙個函式可以往遊戲畫面的左上角輸出文字。因此外掛程式載入後要做的另外一件事是定位一些遊戲內部函式的入口點。maphack中用到的內部函式有一百多個。
diablo ii中流行的大部分外掛程式,如d2maphack, d2hackmap, d2jsp, d2hackit等,都是基於這種原理工作。
注:本是在
hacking wow中的基礎上修改而成。
uWSGI django nginx的工作原理流程
wsgi 一種實現python解析的通用介面標準 協議,是一種通用的介面標準或者介面協議,實現了python web程式與伺服器之間互動的通用性。利用它,web.py或bottle或者django等等的python web開發框架,就可以輕鬆地部署在不同的web server上了 uwsgi 同ws...
Write Ahead Log(WAL)的工作原理
在儲存系統的執行過程中,每時每刻都發生著資料的更新,背後意味著諸如建立,刪除,修改檔案等資料的操作。拋開物理檔案資料的改變,對於中心控制節點而言,這些都會涉及到元資料的更新操作。而為了保持系統元資料和物理資料間的狀態一致性,系統所有的資料操作對應的元資料變更都需要持久化到元資料db內,但其實這裡有乙...
webpack loader和外掛程式的編寫原理
webpack自定義loader和外掛程式的api 點選頂部api,看左側api 1.如何編寫乙個loader 實現的功能是 把js 中的lee改成delllee this.query 獲取options的name 如果loader中有非同步 這裡注意 1 使用this.async 告訴有非同步 2...