精易论坛

标题: 使用 RawSocket 捕获网卡/指定程序/指定端口/指定IP 数据包 [打印本页]

作者: 小白熊    时间: 2015-8-31 00:54
标题: 使用 RawSocket 捕获网卡/指定程序/指定端口/指定IP 数据包
本帖最后由 幻云 于 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端口占用情况来自萧阳天的模块,感谢!

e程序由 易语言5.3生成。调用了一个我自己写的模块(为了方便)但具体的还是在源码中。此模块源码无法提供,因为我也丢失了,蛋疼。
欢迎加入QQ群交流:433247057






作者: Microseor    时间: 2015-8-31 00:59
支持一下  最好是支持完成类接口 易语言这方面资料比较少 要用到套接字 在搭配完成接口 就完美了
作者: 1171707139    时间: 2015-8-31 01:00
支持幻云大神不解释
作者: Seven3in    时间: 2015-8-31 01:09
好东西收下了!
作者: 小白熊    时间: 2015-8-31 01:10
@半夏时光  是时候睡觉了,文章加源码共11个半小时。而且不含休息时间。
作者: oldlee    时间: 2015-8-31 01:29
此模块源码无法提供,因为我也丢失了,蛋疼。
作者: oldlee    时间: 2015-8-31 01:30
https无法解密内心是崩溃的。。
作者: 寻找星空    时间: 2015-8-31 01:30
支持开源。
作者: oldlee    时间: 2015-8-31 01:31
好作品收藏了~谢谢大神
作者: 小白熊    时间: 2015-8-31 01:32
oldlee 发表于 2015-8-31 01:30
https无法解密内心是崩溃的。。

你真的认为HTTPS很好解?至今为止https无人能破。
作者: oldlee    时间: 2015-8-31 01:33
幻云 发表于 2015-8-31 01:32
你真的认为HTTPS很好解?至今为止https无人能破。

我知道https要有证书才能解。。

虽然不是很懂这方面。。但还是想问下像httpwatch跟chrome的F12那些是怎么能分析HTTPS的数据包的
作者: Mamba    时间: 2015-8-31 02:18
最后 HTTP数据包
作者: q97012791    时间: 2015-8-31 03:08
值得研究!! 感谢楼主分享精神!!
作者: 兔子君    时间: 2015-8-31 03:13
话说我一直用的就是抓网卡的工具
作者: 含笑饮砒S    时间: 2015-8-31 03:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: 流氓丶R    时间: 2015-8-31 03:43
好东西,谢谢。。
作者: heyouxing    时间: 2015-8-31 06:18
谢谢楼主的经常分享@@@@

作者: 扣扣    时间: 2015-8-31 07:05
支持开源~!感谢分享
作者: adamcode    时间: 2015-8-31 07:17
说的不错蛮好

作者: 酷易自绘    时间: 2015-8-31 07:20
优秀文章,你神马都是浮云

作者: qq1064987807    时间: 2015-8-31 07:27
可以看看啊
作者: 十万个为什么    时间: 2015-8-31 07:36
牛就是牛{:soso_e179:}

作者: 609063131    时间: 2015-8-31 07:37
支持一个 不错哦

作者: 萌萌嗒的小白    时间: 2015-8-31 07:42
好东西必须收,用得着。
作者: 0o嘉嘉o0    时间: 2015-8-31 08:01
膜拜Lz,有相关的教程吗?
作者: zzzzzzzz88    时间: 2015-8-31 08:07
这个好,支持!!!

作者: 元芳    时间: 2015-8-31 08:08
下载来看看
作者: LXP    时间: 2015-8-31 08:09
支持、、、、、、、
作者: 伸伸党    时间: 2015-8-31 08:26
标题: aaaa

作者: 网络注册网员    时间: 2015-8-31 08:31
楼主你好强大
作者: NeverLoveAgain    时间: 2015-8-31 08:42
精品 支持咯

作者: xanxus    时间: 2015-8-31 08:43
好腻害  牛庄

作者: 1173029975    时间: 2015-8-31 08:43
我只是灌水的。麻痹。赶紧下载
作者: PPZ的梦想    时间: 2015-8-31 08:47
这个东西有什么作用呢

作者: 已注销184143    时间: 2015-8-31 08:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: 衰而不爱    时间: 2015-8-31 09:00
十分感谢幻云大大的分享,十二分感谢
作者: zt8152070    时间: 2015-8-31 09:06
谢谢分享,学习下

作者: 内个打杂滴    时间: 2015-8-31 09:07
这个不错。。
作者: hzzq2015    时间: 2015-8-31 09:07
下载学习啊

作者: supermanO07    时间: 2015-8-31 09:11
NB !!!!!!!!!!!!!!!!!!!!!
作者: TBit    时间: 2015-8-31 09:11
又一神器  感谢楼主
作者: incwin    时间: 2015-8-31 09:12
下载学习啊
作者: supermanO07    时间: 2015-8-31 09:14
正在编译现行程序
正在检查重复名称...
正在预处理现行程序
正在进行名称连接...
正在统计需要编译的子程序
错误(10064): 发现死循环代码。








怎么破
作者: 那一夜的你    时间: 2015-8-31 09:15
听着都牛叉,收藏了
作者: asfor78    时间: 2015-8-31 09:18
        很不错的拦截工具
作者: 陈冠希    时间: 2015-8-31 09:19
很不错的拦截工具,棒
作者: milest    时间: 2015-8-31 09:35
kk看看...............

作者: 讯强文化    时间: 2015-8-31 09:38
你个渣渣
作者: yao84    时间: 2015-8-31 09:45
谢谢分享!!!
作者: Sunnnny    时间: 2015-8-31 09:46
学习了
作者: 河道蟹    时间: 2015-8-31 09:47
很不错的拦截工具,棒
作者: 晓月Am    时间: 2015-8-31 09:47
感谢分享了

作者: 小楊    时间: 2015-8-31 09:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: liangfeng988    时间: 2015-8-31 09:50
看不懂,膜拜一下.


作者: 唐老湿    时间: 2015-8-31 09:51
非常不错的源码,感谢分享
作者: 指尖流淌    时间: 2015-8-31 09:57
好东西,顶起啊!
作者: xp我滴耐    时间: 2015-8-31 10:15
看看是不是又一个神器

作者: 薆要执著    时间: 2015-8-31 10:20
原始套接字在03系统以上无法发送自己构造的IP报头  不知道08 012服务器系统限制没! 我以前用C++写过构造IP报头发送数据  XP下也打了补丁才能发送的 所以吧 现在的原始套接字 我咋感觉没啥大用处 无法发送自己构造的TCP封包  o(︶︿︶)o 唉
作者: Gnay    时间: 2015-8-31 10:22
谢谢分享                 

作者: adoniskinger    时间: 2015-8-31 10:23
大神出手,都是精品
作者: wangguan    时间: 2015-8-31 10:29
感谢!学习学习。。。
作者: 萧阳天    时间: 2015-8-31 10:29
不愧网页方面的大神,利害
作者: 萧然    时间: 2015-8-31 10:29
非常感谢!!!!!!
作者: 萧阳天    时间: 2015-8-31 10:29
不愧网页方面的大神,利害
作者: woabo1984917    时间: 2015-8-31 10:32
不错  值得学习
作者: naozhong    时间: 2015-8-31 10:33
不错。。。。
作者: 改名字好难    时间: 2015-8-31 10:33
看不懂的都是精华·
作者: a643008623    时间: 2015-8-31 10:37
看看,什么好东西
作者: qq94227628    时间: 2015-8-31 10:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: 非典男人    时间: 2015-8-31 10:45
谢谢楼主的无私奉献!!!!!!

作者: 非典男人    时间: 2015-8-31 10:47
老规矩,先回后下!!!!!!!

作者: rongrong520    时间: 2015-8-31 11:05
高手呀 学习一下
作者: 编程唐宋    时间: 2015-8-31 11:14
感谢发布原创作品,精易因你更精彩
作者: 柯南的克星    时间: 2015-8-31 11:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: 欣汝    时间: 2015-8-31 11:25
收下了                     
作者: 帝爵    时间: 2015-8-31 11:38
6B  可以拦截IP的数据通信嘛
作者: 小小小Baby    时间: 2015-8-31 11:40

看不懂的都是精华
作者: Homeless    时间: 2015-8-31 11:42
很强的样子啊!

作者: 活り    时间: 2015-8-31 11:44
好像还不错。。。
作者: 陌落    时间: 2015-8-31 11:49

支持开源。
作者: ziye紫夜    时间: 2015-8-31 11:53
不错啊  顶顶顶顶
作者: ji112315    时间: 2015-8-31 12:00
学习学习了学习学习了学习学习了
作者: 我們還太嫩    时间: 2015-8-31 12:09
支持开源~!感谢分享
作者: huangyuan888    时间: 2015-8-31 12:16
支持楼主.................
作者: zhudequan    时间: 2015-8-31 12:22
是精华呢。哎哟不错哦

作者: ljx111    时间: 2015-8-31 12:35
使用 RawSocket 捕获网卡/指定程序/指定端口/指定IP 数据包

作者: phinex    时间: 2015-8-31 12:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: qq445281    时间: 2015-8-31 12:47
支持楼主。。
作者: 进军易语言    时间: 2015-8-31 12:49
谢谢分享..........
作者: attracting    时间: 2015-8-31 12:54
哥,我深深的支持你,谢谢了,你的无私分享,让我们论坛更人气
作者: zxaf2012    时间: 2015-8-31 12:59
看看神奇多牛

作者: 燃尽的烟灰    时间: 2015-8-31 13:04
下载个看看怎么样

作者: 小虾米TC    时间: 2015-8-31 13:13
膜拜大神的无私奉献
作者: 男朋友    时间: 2015-8-31 13:22
又一大牛作品
作者: 屌叼屌    时间: 2015-8-31 13:32
回复看隐藏        
作者: ltais    时间: 2015-8-31 13:49
看上去很牛的样子,

作者: 田戈    时间: 2015-8-31 13:57
感谢楼主分享

作者: 200562421    时间: 2015-8-31 13:59
好东西 我喜欢
作者: JOKER♂少特    时间: 2015-8-31 14:01
回复看看,电脑问题别的网络嗅探器总是捕获不到.试试这个

作者: 堕天圣黑猫    时间: 2015-8-31 14:09
好吧,看看。。。。




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4