[閒聊] 很久以前寫winsock API攔截的心得

看板C_and_CPP作者 (萬年好人)時間18年前 (2006/03/18 17:13), 編輯推噓4(403)
留言7則, 5人參與, 最新討論串1/3 (看更多)
在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,我們可以發現,它是用winso ck.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。 歡迎大家討論。 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.202.151 ※ 編輯: ccbruce 來自: 218.166.202.151 (03/18 18:05)

03/18 18:06, , 1F
cool
03/18 18:06, 1F

03/18 18:17, , 2F
收錄精華:) 我等一下慢慢看~
03/18 18:17, 2F

03/18 19:24, , 3F
滿有趣的,不過在這個例子中,為了 hook 兩個 API,而製
03/18 19:24, 3F

03/18 19:25, , 4F
作一個仿造的 DLL,應該是比單純 API hook 麻煩了一點吧?
03/18 19:25, 4F

03/18 19:53, , 5F
幸好 winsock DLL 輸出的 API 不多..XD
03/18 19:53, 5F

03/18 20:07, , 6F
推薦這篇文章
03/18 20:07, 6F

03/18 20:34, , 7F
只是因為懶,仿造只要用copy/paste就好了
03/18 20:34, 7F
文章代碼(AID): #146yzGgA (C_and_CPP)
文章代碼(AID): #146yzGgA (C_and_CPP)