|
分享源码
界面截图: |
|
是否带模块: |
调用了模块 |
备注说明: |
- |
本帖最后由 幻云 于 2015-8-31 21:42 编辑
源码在最下面,推荐看完本文章。
本文章将介绍如何使用RawSocket(原始套接字)开发网络嗅探器:
首先我们得了解什么是套接字,这个我就不多说,自己百度,百度百科比我说的好。
那么什么又是原始套接字呢,常用的套接字分为 SOCK_STREAM(流套接字) 用于TCPXY通讯。 SOCK_DGRAM(数据报套接字) 同于UDPXY通讯。
那么原始呢,他则是和名字一样原始套接字;举例:要想用流套接字进行一次TCP的发包,那么直接连接上对方服务器然后用Send就可以发送指定的内容,但其实发送的数据并不止你的那些内容,有一些东西是流套接字会给你自动补上的。TCP是属于IPXY的一个子XY,那么要发送一个TCP数据包就得加上(以太网XY报头这个先不提),IPXY的报头,和TCPXY报头,这些东西流套接字都会帮你处理,而原始套接字则不会(当然也可以设置让原始套接字构造IP报头)。原始套接字他有更多的用途,但相对来说也比流套接字或数据报套接字麻烦。 原始套接字还可以设置成允许接收本地所有的套接字数据。那么我们就利用这个功能来做嗅探器!
首先:1.使用 WSAStartup (合并短整数 (2, 2), WSADATA) 来初始化Winsocket服务 其参数有2个 第一个 (短整数型/双字节型):wVersionRequired 这个参数表明使用的winsock版本号,高位指定修订版本号,低位指定主版本号。第二个参数 WSADATA类型 用于接收Winsocket细节东西,咱不用管它。
//下面就不说那么详细了,源码里面全是注释,自己看。
2.然后使用socket (#AF_INET, #SOCK_RAW, #IPPROTO_IP) 来创建一个套接字 第一个参数应该是表明Internet地址格式反正只能固定这个,仅仅支持这个 参数2:表明要创建的是一个原始套接字,参数3:指定IPXY IPXY包括其子XY TCP UDP 等。成功返回套接字句柄
3. bind (s, addr, sizeof (addr)) 将套接字绑定至指定网卡,参数1=套接字句柄 参数2为一个addr结构的值,该值表明要绑定的网卡IP及端口号
4. ioctlsocket (Socket, 2550136833, 1) 将套接字的模式改变为允许接收所有数据
顺利完成上面的操作后咱就可以用Recv来接收数据包了,只要不断的调用Recv就OK。
但Recv接收到的数据并非是直观的,我们还需要进行下一步的解析,下面将介绍如何解析报文:
下面注意:一个字节等于8个二进制位
首先,我们得到的数据包是IPXY的 IP报头一般都是20个字节也可能更多,因为有个可选项,但一般都是20字节。首先,前面一个字节的高4位表明版本号,低4位表明IP报文头部的长度(注意:将该4位二进制值偏移4位才能得到真正的报头长度),TTL 表明该报文的生存时间。 其他我也就不一一的诉说了,自己看图片。应该能看懂。我们只需要取出是什么XY和最后面的数据就OK。
1.IP报文结构图片:来源自网络
然后,我们已经成功的从IP报文中取得了XY类型 或是UDP 或是TCP 又或是 ICMP等,但完了么,没有,我们还需要从取出的报文中得到更多的信息。下面介绍TCP报文
TCP报文的报头长度也和IP报文的报头长度差不多,一般都是20个字节或许更多。TCP报文 前16位表明源端口号,即是发送数据包者的端口号,再后面16位表明目标的端口号。 然后是 32位序列号 和32位的确认号TCP是一种可靠通讯XY,它需要3次握手来进行连接。而这两个编号将会起到大作用。后面就是报文头部的长度,同样是 4位 也需要偏移4位。后面的就不说了,有兴趣的自己百度。
2.TCP报文XY结构图片,来源自网络
UDP报文结构就比较简单了,没有TCP那么复杂,但它却没有TCP可靠,也各有各的有点。
3.UDP报文结构图片 来源自网络
报头为 8个字节
那么到现在,我们已经捕获并解析了数据包,那么如何进行过滤呢。
端口过滤/IP过滤我这就不说了,可以从解析出来的东西判断。那么怎样进行指定程序捕获呢。
这里我源码里面用的是一个很简单的方法,也很笨拙,但至少可以用。就是枚举系统的端口占用表,然后得到一个封包后判断端口是否被XY捕获数据包的程序占用如果是就通过,否则丢弃。此方法抓包速度可能有稍微的影响,但绝对不大,最多慢个100毫秒,我这里测试的没啥吊问题。此方法只能捕获程序的TCP和UDP数据包。
最后 HTTP数据包
HTTPXY属于TCP下面的一个子XY。所以可以捕获到。但有些HTTP包太大,TCPXY无法一次传送完成,或者是返回的数据包,这些都没有组合在一起,没有组成像httpwatch那样的显示。只能一段一段的看,这让人苦恼。当然,这也是可以解决的。HTTP每一次发包都会进行TCP连接接收到之后呢就好关闭连接,那么上面说过,TCP是个可靠的通讯XY,他的报文头部所包含了 该包的 ACK(确认号)和 SEQ(包序号),那么我们就可以通过一系列的判断,首先可以在TCP包中寻找是否有HTTPXY相关的字符(比如 “POST”,“GET”,“HTTP 1.1”)等等,来判断是不是一个http包,然后通过ACK和SEQ经过一些判断来组合这些数据包,这个源码中无例程,可自行研究。
关于HTTPS:https是加密一种的XY,数据包发送与接收的全程将会被加密。本源码也无法对https进行解密。
注意:原始套接字必须以管理员权限才能成功创建!若要易语言调试,则把易语言用管理员权限运行即可!。
分享不止是分享,它更是一次超越!
具体请看源码中的注释。
纯手打原创,转载请声明。如有问题,望回帖指出。(文章加源码从下午写到现在,单写文章就2个多小时。)
@萧阳天 枚举UDP及TCP端口占用情况来自萧阳天的模块,感谢!
RawSocketSniffer.rar
(66.41 KB, 下载次数: 2502)
|
评分
-
参与人数 21 | 好评 +15 |
精币 +43 |
收起
理由
|
bianyuan456
| + 1 |
+ 2 |
感谢分享,很给力!~ |
game88288
| |
+ 1 |
Win7 64位,运行后就会停止工作.啥情况 |
哔哔芭比波比i
| + 1 |
+ 2 |
支持开源~!感谢分享 |
大骗子
| |
+ 1 |
奉上小小红包希望笑纳 |
三咲智子
| + 1 |
+ 2 |
听起来好高大上,不过不懂! |
heiyi
| + 1 |
+ 5 |
内容写了2个小时,楼主真是辛苦了 |
狸楚殇
| |
+ 2 |
感谢分享,很给力!~ |
名无所谓
| + 1 |
+ 2 |
感谢分享,很给力!~ |
renchin10025
| + 1 |
+ 1 |
感谢发布原创作品,精易因你更精彩! |
Meself
| + 1 |
|
虽然看不懂您在讲什么。但是看来还是不错的。 |
DreamF
| + 1 |
+ 1 |
发现一处编译死循环。怎么解决啊? 小白看了半天没看出端倪, |
我們還太嫩
| |
+ 1 |
调试编译失败 错误(10064): 发现死循环代码。 |
薆要执著
| |
+ 1 |
同志你想多了原始套接字在2003版本的系统意思便不能发送自己封的TCP协yi和U |
小凡じ亦匿名
| + 1 |
+ 2 |
奉上小小红包希望笑纳 |
精易客服
| + 1 |
+ 5 |
感谢发布原创作品,精易因你更精彩! |
伸伸党
| |
+ 1 |
感谢你的支持,精易有你更精彩 |
LXP
| + 1 |
|
感谢发布原创作品,精易因你更精彩! |
applek
| + 1 |
+ 2 |
很不错的拦截工具,棒 |
十万个为什么
| + 1 |
+ 2 |
支持开源~!感谢分享 |
Seven3in
| + 1 |
+ 5 |
支持开源~!感谢分享 |
半夏时光
| + 1 |
+ 5 |
奉上小小红包希望笑纳 |
查看全部评分
|