Kaie"s Blog 2.0 beta!
Back to "Top"

My Secret Notebook
 Show "Table of Contents"
Contact Me
Subscribe to my Posts feed
Subscribe to my Comments feed
My Flickr
Back to "Top"
My Secret Notebook
 Show "Table of Contents"
Contact Me
Subscribe to my Posts feed
Subscribe to my Comments feed
My Flickr

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:

Who: Anonymous Class:
When: August 18, 2008 12:39 PM  

在http://phpweb.yuntech.edu.tw/g9223704內的source code下載不到, 請問可否修整一下, 很想學習如何寫假wsock.dll. 謝謝.

Who: Tsung-Kai Chen Class:
When: August 19, 2008 1:18 PM  

To Anonymous:
這篇文章是轉載的,我也幫不了你的,你只好直接尋求原作者的協助吧,不好意思..囧!