給網遊寫乙個掛吧(三) 啟動外掛程式下

2021-07-14 04:16:40 字數 2977 閱讀 1653

前面的文章

給網遊寫乙個掛吧

啟動外掛程式上

介紹了輸入法注入的方法,本文解釋第二種方法。

有的遊戲限制比較多,可能會將輸入法注入也禁用掉……這個時候就需要另想方法了。其實我們的目的很簡單,就是要讓不知道我們掛存在的遊戲,在某個時刻將掛作為遊戲的乙個元件載入進來。輸入法注入是作業系統強制塞給遊戲的,當然遊戲有權利選擇不要。那麼我們可以用暴力解決,強制遊戲載入外掛程式: 1.

比如利用緩衝區溢位漏洞(參考文章

如何利用緩衝區溢位的程式錯誤來執行黑客程式

和如何利用緩衝區溢位的程式錯誤來執行黑客程式(續))。

2.還有就是在遊戲每次都會執行的函式上掛個鉤子

,但是一般的windows鉤子都會被遊戲禁用掉……而本文的方法是hook directx endscene函式,即遊戲在繪圖結束後呼叫的函式,而且遊戲會在一秒內經常呼叫這個函式,簡直就是把它當訊息佇列使!

wow – 使用directx endscene注入技術

這個方法可以用在wow 3.3.5.13930上,現在已經不行了,有興趣的朋友可以自己搭乙個3.3.5.13930的私服試試。據說有很多方法可以注入(directx endscene函式在d3d9.dll檔案中):

1、 在遊戲資料夾裡放乙個d3d9.dll,因為windows是先搜尋遊戲的工作目錄再查詢system32資料夾的,所以會載入到自定義的d3d9.dll。

2、 直接在遊戲啟動前把system32資料夾中的d3d9.dll換成自己的。

3、 使用ida直接獲取endscene的位址,並且在遊戲啟動後,修改這個位址的彙編碼,使其先呼叫我們的函式,再由我們的函式將控制權交還給真實的endscene程式。

4、 在外掛程式裡啟動遊戲,啟動時先將遊戲程序暫停,執行一系列hook操作: a)

先hook loadlibrary以便在遊戲載入d3d9.dll的時候; b)

再hook d3d9.dll裡的direct3dcreate9函式, c)

再通過hook過的direct3dcreate9函式獲取d3d9的指標, d)

從d3d9指標處hook d3d9->createdevice函式,以獲取指向裝置的指標device。 e)

再從device指標處hook device->endscene函式。

5、 在windows作業系統裡建立乙個自己的device。

6、 或者就是使用setwindowshookex api安裝乙個系統級別的hook,然後我們的外掛程式就會被載入進每乙個程序!參考文件:

這裡我只用過第4種方法,因此本文也只介紹第4種方法,這裡我們用到easyhook這個庫,這個庫允許我們使用c#**hook系統api。easyhook的用法很簡單:

1、 在包含hook函式的託管dll裡,建立乙個類,實現了easyhook.ientrypoint這個介面。

2、 在類的建構函式裡建立與宿主程序的連線。

3、 然後在ientrypoint.run函式裡,註冊你的hook,下面是以createfile這個系統api為例:

1、    public

void run(remotehooking.icontext incontext, string inchannelname)

2、    );

9、    }

在第5行裡,那個dcreatefile就是createfile在c#中的委託表現方式,因為是通過函式指標的方式執行的,因此會宣告成乙個委託。

4、 最後在外掛程式裡,使用下面的**註冊hook:

1、 static

void main(

string args)

2、  

5、 **裡,還有乙個關鍵的地方,就是hook後獲取的指標是乙個com介面,即拿到的是乙個虛函式表,因此在hook endscene方法的時候,就是把這個com介面的endscene的虛函式指標換成我們自己的,如下表的介面定義和替換方法:

1、    

public

unsafe

class d3d9

2、    

8、    }

9、    

public idirect3ddevice9(d3d9.idirect3d9* innativeidirect3d9, 

10、    d3d9.idirect3ddevice9* innativeidirect3ddevice9)

11、    

16、    

public d3d9.idirect3d9* nativeidirect3d9 

17、    

20、    

public d3d9.idirect3ddevice9* nativeidirect3ddevice9 

21、    

24、    

private

void overridefunctions()

25、    

34、    

public

uint endscene(d3d9.idirect3ddevice9 device)

35、    

42、    } 

比如在第37行 – 41行,就是在endscene呼叫的時候,先做我們的事情,然後再把控制權交給真正的endscene。而第26行,endscene函式idirect3ddevice9的第42個函式,因為在第3行,**已經將idirect3ddevice9介面(實際就是乙個虛函式表)當成乙個普通的c/c++結構體處理 – 而且是32位機上的結構體(如果要支援64位改一下就可以了),而第6行**,就是把這個虛函式表當作乙個普通的陣列處理。不過據說在directx10裡已經把endscene去掉了……

而easyhook的使用方式和詳細原理,請參考文件:

最後如果大家對除錯技術感興趣的話,可以考慮購買我的新書: 

未完待續……

給網遊寫乙個掛吧(三) 啟動外掛程式下

前面的文章 給網遊寫乙個掛吧 啟動外掛程式上 介紹了輸入法注入的方法,本文解釋第二種方法。有的遊戲限制比較多,可能會將輸入法注入也禁用掉 這個時候就需要另想方法了。其實我們的目的很簡單,就是要讓不知道我們掛存在的遊戲,在某個時刻將掛作為遊戲的乙個元件載入進來。輸入法注入是作業系統強制塞給遊戲的,當然...

js寫乙個外掛程式

分號開頭,用於防止 壓縮合併時與其它 混在一起造成語法錯誤 而事實證明,uglify壓縮工具會將無意義的前置分號去掉,我只是習慣了這麼寫 function 立即執行函式,閉包,避免汙染全域性變數 通常乙個外掛程式只暴露乙個變數給全域性供其它程式呼叫 還有其它寫法,運算子 函式體 括號 例 funct...

VB寫乙個IE外掛程式

用vb編寫ie外掛程式 實現方法如下 首先需要獲得iobjectwithsite介面的定義,你下載個olelib.tlb,包含了介面定義。然後建立乙個 activex dll工程,在工程中引用這個tlb檔案,並且引用microsoft html object library mshtml.dll 和...