Sunday, March 19, 2006
[Programming] winsock API攔截的心得
在版上看到這標題"winsock API攔截的心得",感覺挺有趣的...而且他又是以Warcraft為例子,更加引起我的興趣,先收藏起來,下次有空來研究一下。重點是他還公佈他的Source Code真是太偉大了,拜一下...值得效法。
<轉錄自 PTT C_and_CPP版 ccbruce網友文章> 原文如下:
在Win32底下,winsock.dll負責掌管對應於ISO OSI Model中的L4~L5的實作,所以許多許多的網路應用程式,都會與此dll產生關係。
在winsock2尚未推出前,winsock.dll就是實作socket的最底層實作品。它負責與更底層的NDIS驅動程式進行溝通。但在winsock2推出後,winsock.dll就不是socket的最底層實作品,最底層的實作品改成了ws2_32.dll。而winsock.dll就只是跨接到ws2_32.dll而已。
winsock體系實際上分成非常多層,詳情可看
http://msdn.microsoft.com/library/en-us/winsock/winsock/
windows_sockets_2_architecture_2.asp?frame=true
但可以簡單地分割成兩部份,一個稱為API;另一個叫作SPI。API就不用說了,至於SPI就是與NDIS互連的那一頭,它負責提供服務給API。而我們所寫的程式,大部份都是在API那一頭。
由於winsock是高於L3的實作品,所以我們不能用winsock來做出任何低於L3的功能,像是使用arp、rip、ospf等等協定,如果要用這種較低層次的協定,就要另找函式庫,或是自己去寫NDIS方面的程式。
OK,有了一些對於winsock的背景瞭解,我們可以來討論關於winsock API的攔截。攔截winsock API有何好處呢?最大的好處之一,就是可以寫出許多奇奇怪怪的程式。從流量計算到遊戲外掛,都可以用這手段來達成。
API攔截有很多方法可以實作,最最普遍的,不外乎是Hooking或是直接寫個假的winsock.dll來騙程式。這兩種方法各有利弊,Hooking的好處是想要就要,不要就可以關掉,而且可以只針對想到的程式,所以大部份的遊戲外掛都是用Hooking達成;但它的壞處,就是難寫,因為要直接插接想要Hooking的程式,如果不了解對象的行為,常會以失敗收場。而且要動到虛擬記體的內容,所以很麻煩。寫假的winsock.dll就容易多了,只要偽造winsock.dll的內容,就可以騙程式來呼叫自己,但是缺點就是Hooking的優點。所以這個比較少人用。
我以魔獸來當例子,說明如何寫個假的winsock.dll讓魔獸可以跨區網連線。
1.魔獸的區網遊戲,就真的只是區網遊戲,它不能跨越兩個網段來加入。也就是說,若你在A網段,則你開的遊戲,B網段的同學看不到,就不能加入。這時候,強者我同學就會去偷拔大學部的網路線,讓自己跟對方同網段。
2.為了要解決這個問題,我們可以先思考一下,魔獸是如何進行區網連線的。透過etter cap的觀察,我們可以發現魔獸在開遊戲時,會把自己開遊戲的通告,以廣播的方式丟到整個網段上,但是router是不會forward廣播封包的,所以當然別的網段的人不能看到自己網段的遊戲。
3.思考解決方法:最直接的方法,想辦法去管router,或是色誘(?)管理員讓router會去forward廣播封包?但這不在本文討論之列。既然魔獸會用廣播的方式做通告,那麼我們只要強迫魔獸送通告的封包給同學的IP就好了嘛。
4.首先使用vc++附的dumpbin來看看魔獸主程式用了啥dll,我們可以發現,它是用winsock.dll,因此較快的方法就是寫假的winsock.dll給魔獸吃。
5.一樣用dumpbin看看魔獸呼叫了哪些winsock的函式,注意魔獸是用Oridinal ID來呼叫它們的,所以你會看不到它呼叫的函式名。不過一樣把Oridinal ID抄下來,我們一樣用dumpbin去看winsock.dll的函式Oridinal ID就行了。
6.再來寫出檔名,函數名及calling conversion跟winsock.dll一樣的新winsock.dll就行了。記得Oridinal ID也要跟winsock.dll一樣。
以上就是一種思考模式,從概念到實作的所有步驟。至於詳細的實作品,可參考我的網站 http://phpweb.yuntech.edu.tw/g9223704
這種東西實作有一堆要注意的地方。但說穿了沒什麼,我也只是騙騙P幣而已。只是令人吐血的是,寫好了這東西,我同學卻說要趕論文反而找不到腳來湊...Orz。此程式曾經在魔獸版上PO過,現在放上src。
歡迎大家討論。
2 Comments:
When: August 18, 2008 12:39 PM
在http://phpweb.yuntech.edu.tw/g9223704內的source code下載不到, 請問可否修整一下, 很想學習如何寫假wsock.dll. 謝謝.
When: August 19, 2008 1:18 PM
To Anonymous:
這篇文章是轉載的,我也幫不了你的,你只好直接尋求原作者的協助吧,不好意思..囧!
Plz Post a Comment / 拜託你留個言啦...^^"