作者ccbruce (万年好人)
看板C_and_CPP
标题[闲聊] 分享一下winsock API拦截的心得
时间Sat Mar 18 18:04:12 2006
在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)
1F:推 H45:cool 03/18 18:06
2F:推 drkkimo:收录精华:) 我等一下慢慢看~ 03/18 18:17
3F:推 UNARYvvv:满有趣的,不过在这个例子中,为了 hook 两个 API,而制 03/18 19:24
4F:→ UNARYvvv:作一个仿造的 DLL,应该是比单纯 API hook 麻烦了一点吧? 03/18 19:25
5F:→ UNARYvvv:幸好 winsock DLL 输出的 API 不多..XD 03/18 19:53
6F:推 lightspeed:推荐这篇文章 03/18 20:07
7F:→ ccbruce:只是因为懒,仿造只要用copy/paste就好了 03/18 20:34