能否抓取指定ip的数据包?

bear234 2015-02-04 10:40:45
最近在学socket,觉得特别有意思~~~

有个问题特来求教,听上去有点像黑客不过我不是坏人也不会做坏事,只是学习socket的时候产生的一些问题


我知道有抓包软件,可以抓取外面发送到自己pc上的数据包

我也知道可以嗅探,也就是可以抓取所有路过自己网卡的数据包

于是乎我产生了一个问题:能不能抓取某个指定的ip发出的数据包呢?
网上查了查,有一些黑客的非法手段,可以做会话劫持或者欺骗,可以让某个ip把数据包主动发过来,我不要这样,只是简单地抓包 就好比:我看着某个ip,它发出个数据包,我就抓过来看看,再给它放回去 请问有办法做到这样吗?


另外想问问搞网络的骨灰级大神,关于网络我现在只学过socket,也了解过tcp/ip协议,请问如果想继续深入的话需要学什么?看什么书?编程语言我已经没问题了,只是想深入学习一下网络方面的知识~~
...全文
2990 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
LouisScola 2015-02-09
  • 打赏
  • 举报
回复
有线通信基本都是点对点通信的,你要抓取不经自己网卡的其他指定IP的数据包,伪装目的地址应该可以,要不然hack到路由器抓取
bear234 2015-02-09
  • 打赏
  • 举报
回复
引用 12 楼 LouisScola 的回复:
有线通信基本都是点对点通信的,你要抓取不经自己网卡的其他指定IP的数据包,伪装目的地址应该可以,要不然hack到路由器抓取
也就是说用正常的手段是抓不到不经过自己网卡的数据包的 是吧?
bear234 2015-02-06
  • 打赏
  • 举报
回复
引用 10 楼 q191201771 的回复:
抓别人的包 你需要在源地址和目标地址或者其中某个结点上抓才行
恩 那可以这样吗? 比如,我知道百度的地址或者你的ip地址,我能随便到你这里抓你和外界交流时产生的数据包吗?
就想叫yoko 2015-02-06
  • 打赏
  • 举报
回复
抓别人的包 你需要在源地址和目标地址或者其中某个结点上抓才行
奔跑的路 2015-02-06
  • 打赏
  • 举报
回复
引用 8 楼 zhxianbin 的回复:
http://www.6san.com/630/ 这里面不是都有吗,试试就知道了
网卡要先打开或者支持接收所有包的功能,这些过滤规程才有效的,一般要使用这些规则时,会将网卡先设置成混杂模式
奔跑的路 2015-02-05
  • 打赏
  • 举报
回复
windows下网卡没有什么混杂模式不混杂模式,在于应用程序本身,如使用Wireshark抓包的时候可以通过设置为在混杂模式下抓包。[喝小酒的网摘]http://blog.const.net.cn/a/17681.htm 点击菜单栏上的” Capture” > “Options”可以看到制定抓包规则的界面,可以看到Caputre packets in promiscuous mode,默认是选中的,表示Wireshark默认在混杂模式下抓包。 在应用程序中设置socket支持混杂模式的操作设置SIO_RCVALL标志即可。 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag); //设置 IP 头操作选项 bind(sockRaw, (PSOCKADDR)&addrLocal, sizeof(addrLocal); //把 sockRaw 绑定到本地网卡上 DWORD dwValue = 1; ioctlsocket(sockRaw, SIO_RCVALL, &dwValue); //让 sockRaw 接受所有的数据 flag 标志是用来设置 IP 头操作的, 也就是说要亲自处理 IP 头: bool flag = ture; addrLocal 为本地地址: SOCKADDR_IN addrLocal; dwValue 为输入输出参数, 为 1 时执行, 0 时取消: Windows下操作网卡混杂模式封装好的函数: // Function name : SetAdapterReceiveAll // Description : 设置网卡可以接收所有IP的数据(混杂模式) // Return type : void bool SetAdapterReceiveAll() { //检查Winsock版本 WORD ver=MAKEWORD(2,2); WSADATA wsaData; int err=WSAStartup(ver,&wsaData); if(err!=0) { _RPT2( _CRT_ERROR,"启动WinSocket version %d.%d 错误!",2,2); return false; } //创建原始套接字 s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW); //设置为对IP头亲自操 BOOL bFlag=TRUE; err=setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&bFlag,sizeof(bFlag)); if(err!=0) return false; //获得本机地址 char hostname[256]; memset(hostname,0,256); err=gethostname(hostname,256); if(err!=0) return false; struct hostent * phost=gethostbyname(hostname); if(!phost) return false; //把原始套接字绑定到本定网卡 struct sockaddr_in addr_in; memset(&addr_in,0,sizeof(addr_in)); addr_in.sin_addr=*(in_addr *)phost->h_addr_list[0]; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(57274);//端口号,可以是任意值,但最好不要和公共端口冲突 bind(s, (PSOCKADDR)&addr_in, sizeof(addr_in)); // dwValue为输入输出参数,为1时执行,0时取消 DWORD dwValue = 1; // 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL // 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) ioctlsocket(s, SIO_RCVALL, &dwValue); return true; } 需要注意的是:RAW SOCKET只能截取为数不多的几种协议包。 tcpdump是基于Unix系统的命令行式的数据包嗅探工具。如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的,点击【http://en.wikipedia.org/wiki/Promiscuous_mode】获取更多有关混杂模式的资料。 tcpdump当然也可以指定抓包过滤器,而且其过滤器语言非常著名,叫做Berkeley包过滤,简称BPF语言。 BPF语言主要有一个标志或者数字和限定词组成,限定词有三种: 第一种:指定类型 host, 定义抓取哪个IP地址(也可以给它mac地址,格式是00:00:00:00:00:00)的数据包,比如我想抓有关192.168.0.148这个IP地址的数据包,那么就写成tcpdump host 192.168.0.148, host是限定词,192.168.0.148就是标志。这条命令会抓取从发出或者向192.168.0.148发送的数据包。 net, 定义抓取某个网络的数据包,给出网络号就行了,它根据给的网络号字节数是1,2,3来判断A类地址,B类地址或者C类地址,比如tcpdump net 10.1.1 ,它就认为这是一个C类地址。 port,指定端口,比如tcpdump host and port 22, 这是抓端口为22的数据包,不管是TCP还是UDP的,这里我稍微早一点的给出了逻辑操作,and J,如果只想抓TCP的,那么可以写tcpdump host 192.168.0.148 and tcp port 22。 portrange,顾名思义,这个是指定端口范围的,用连字符”-”指定范围,比如tcpdump port 1025-8080 第二种:指定方向 我们之前的命令都是说“这条命令会抓取从192.168.0.148发出或者向192.168.0.148发送”,所以,如果指向抓从发出的数据包可以使用限定词src, 命令:tcpdump src host 192.168.0.148,反过来,想抓发向192.168.0.148的数据包,使用限定词dst,命令:tcpdump dst host 192.168.0.148。 第三种:指定协议 我们知道网络协议有N种。。。我列一下常用的几种,其他的可以去google一下J ether和fddi, 以太网协议 tr, TR协议 ip, IP协议 ip6, IPv6协议 arp, ARP协议 好了,最后还需要注意的是逻辑运算,and, or, not(与,或,非)。[喝小酒的网摘]http://blog.const.net.cn/a/17681.htm 转载自 [blog.const.net.cn]喝小酒的网摘 及本文链接地址:http://blog.const.net.cn/a/17681.htm 相关文章 交叉编译sqlite3最新版 下载最新版sqlite3,目前版本为SQLite 3.8.7.3,下载单文件版本。下载地址如下:http://www.sqlite.org/2014/sqlite-amalgamation-3080703.zip 解压缩后在2410上的交叉编译如下: 1、 编译成共享库(动态库) a) &nbs firefox Secure Connection Failed sec_error_ocsp_ol 登录firefox 官方扩展网址时,出现下载错误: Secure Connection Failed An error occurred during a connection to addons.mozilla.org. The OCSP response contains out-of-date wxDesigner 2.14下载地址 因为wxDesigner本身已经关闭了,所以相应的软件就更难下载到了,网上见得多的都是wxDesigner 2.13版本,现提供一个2.14版本的下载链接,建议使用迅雷下载: 原来的官方下载地址:http://www.roebling.de/wxdesign_214.exe 第三方的下载地址:http://www.kaishile.com Windows下使用命令行查看网络端口号所对应进程 主要命令是netstat,查看进程的参数为-o。 -o 显示与每个连接相关的所属进程 ID。 -a 显示所有 TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT头文件 想使用linux socket 的keepllive属性来检测网络连接的状态却发现编译时出现错误,TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT居然未定义。 加上下面的头文件就可以了,其实TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT都是在tcp.h中定义的。 #include <sys/
zhxianbin 2015-02-05
  • 打赏
  • 举报
回复
http://www.6san.com/630/ 这里面不是都有吗,试试就知道了
bear234 2015-02-05
  • 打赏
  • 举报
回复
引用 4 楼 lee244868149 的回复:
windows下网卡没有什么混杂模式不混杂模式,在于应用程序本身,如使用Wireshark抓包的时候可以通过设置为在混杂模式下抓包。[喝小酒的网摘]http://blog.const.net.cn/a/17681.htm 点击菜单栏上的” Capture” > “Options”可以看到制定抓包规则的界面,可以看到Caputre packets in promiscuous mode,默认是选中的,表示Wireshark默认在混杂模式下抓包。 在应用程序中设置socket支持混杂模式的操作设置SIO_RCVALL标志即可。 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag); //设置 IP 头操作选项 bind(sockRaw, (PSOCKADDR)&addrLocal, sizeof(addrLocal); //把 sockRaw 绑定到本地网卡上 DWORD dwValue = 1; ioctlsocket(sockRaw, SIO_RCVALL, &dwValue); //让 sockRaw 接受所有的数据 flag 标志是用来设置 IP 头操作的, 也就是说要亲自处理 IP 头: bool flag = ture; addrLocal 为本地地址: SOCKADDR_IN addrLocal; dwValue 为输入输出参数, 为 1 时执行, 0 时取消: Windows下操作网卡混杂模式封装好的函数: // Function name : SetAdapterReceiveAll // Description : 设置网卡可以接收所有IP的数据(混杂模式) // Return type : void bool SetAdapterReceiveAll() { //检查Winsock版本 WORD ver=MAKEWORD(2,2); WSADATA wsaData; int err=WSAStartup(ver,&wsaData); if(err!=0) { _RPT2( _CRT_ERROR,"启动WinSocket version %d.%d 错误!",2,2); return false; } //创建原始套接字 s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW); //设置为对IP头亲自操 BOOL bFlag=TRUE; err=setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&bFlag,sizeof(bFlag)); if(err!=0) return false; //获得本机地址 char hostname[256]; memset(hostname,0,256); err=gethostname(hostname,256); if(err!=0) return false; struct hostent * phost=gethostbyname(hostname); if(!phost) return false; //把原始套接字绑定到本定网卡 struct sockaddr_in addr_in; memset(&addr_in,0,sizeof(addr_in)); addr_in.sin_addr=*(in_addr *)phost->h_addr_list[0]; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(57274);//端口号,可以是任意值,但最好不要和公共端口冲突 bind(s, (PSOCKADDR)&addr_in, sizeof(addr_in)); // dwValue为输入输出参数,为1时执行,0时取消 DWORD dwValue = 1; // 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL // 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) ioctlsocket(s, SIO_RCVALL, &dwValue); return true; } 需要注意的是:RAW SOCKET只能截取为数不多的几种协议包。 tcpdump是基于Unix系统的命令行式的数据包嗅探工具。如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的,点击【http://en.wikipedia.org/wiki/Promiscuous_mode】获取更多有关混杂模式的资料。 tcpdump当然也可以指定抓包过滤器,而且其过滤器语言非常著名,叫做Berkeley包过滤,简称BPF语言。 BPF语言主要有一个标志或者数字和限定词组成,限定词有三种: 第一种:指定类型 host, 定义抓取哪个IP地址(也可以给它mac地址,格式是00:00:00:00:00:00)的数据包,比如我想抓有关192.168.0.148这个IP地址的数据包,那么就写成tcpdump host 192.168.0.148, host是限定词,192.168.0.148就是标志。这条命令会抓取从发出或者向192.168.0.148发送的数据包。 net, 定义抓取某个网络的数据包,给出网络号就行了,它根据给的网络号字节数是1,2,3来判断A类地址,B类地址或者C类地址,比如tcpdump net 10.1.1 ,它就认为这是一个C类地址。 port,指定端口,比如tcpdump host and port 22, 这是抓端口为22的数据包,不管是TCP还是UDP的,这里我稍微早一点的给出了逻辑操作,and J,如果只想抓TCP的,那么可以写tcpdump host 192.168.0.148 and tcp port 22。 portrange,顾名思义,这个是指定端口范围的,用连字符”-”指定范围,比如tcpdump port 1025-8080 第二种:指定方向 我们之前的命令都是说“这条命令会抓取从192.168.0.148发出或者向192.168.0.148发送”,所以,如果指向抓从发出的数据包可以使用限定词src, 命令:tcpdump src host 192.168.0.148,反过来,想抓发向192.168.0.148的数据包,使用限定词dst,命令:tcpdump dst host 192.168.0.148。 第三种:指定协议 我们知道网络协议有N种。。。我列一下常用的几种,其他的可以去google一下J ether和fddi, 以太网协议 tr, TR协议 ip, IP协议 ip6, IPv6协议 arp, ARP协议 好了,最后还需要注意的是逻辑运算,and, or, not(与,或,非)。[喝小酒的网摘]http://blog.const.net.cn/a/17681.htm 转载自 [blog.const.net.cn]喝小酒的网摘 及本文链接地址:http://blog.const.net.cn/a/17681.htm 相关文章 交叉编译sqlite3最新版 下载最新版sqlite3,目前版本为SQLite 3.8.7.3,下载单文件版本。下载地址如下:http://www.sqlite.org/2014/sqlite-amalgamation-3080703.zip 解压缩后在2410上的交叉编译如下: 1、 编译成共享库(动态库) a) &nbs firefox Secure Connection Failed sec_error_ocsp_ol 登录firefox 官方扩展网址时,出现下载错误: Secure Connection Failed An error occurred during a connection to addons.mozilla.org. The OCSP response contains out-of-date wxDesigner 2.14下载地址 因为wxDesigner本身已经关闭了,所以相应的软件就更难下载到了,网上见得多的都是wxDesigner 2.13版本,现提供一个2.14版本的下载链接,建议使用迅雷下载: 原来的官方下载地址:http://www.roebling.de/wxdesign_214.exe 第三方的下载地址:http://www.kaishile.com Windows下使用命令行查看网络端口号所对应进程 主要命令是netstat,查看进程的参数为-o。 -o 显示与每个连接相关的所属进程 ID。 -a 显示所有 TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT头文件 想使用linux socket 的keepllive属性来检测网络连接的状态却发现编译时出现错误,TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT居然未定义。 加上下面的头文件就可以了,其实TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT都是在tcp.h中定义的。 #include <sys/
大爱啊!我正好想知道raw socket可以抓哪些包~~~~ 其实是这样的:我用wireshark抓包的时候,我所抓到的包必定有一方是我自己,也就是说,我抓到的包,或许是别人发给我的,或许是我发给别人的~~~~ 我是想问,我能不能抓和我无关的包,比如我的地址是A,而在internet里,还有一个地址是B和C,我能不能抓到B和C之间的数据包
bear234 2015-02-05
  • 打赏
  • 举报
回复
引用 5 楼 zhxianbin 的回复:
http://www.6san.com/630/ http://netsecurity.51cto.com/art/201111/304449.htm
谢谢 很有用! 可能是我太小白了 所以各位都不知道我在问什么 我用wireshark抓包的时候,我所抓到的包必定有一方是我自己,也就是说,我抓到的包,或许是别人发给我的,或许是我发给别人的~~~~ 我是想问,我能不能抓和我无关的包,比如我的地址是A,而在internet里,还有一个地址是B和C,我能不能抓到B和C之间的数据包
奔跑的路 2015-02-05
  • 打赏
  • 举报
回复
《Linux网络技术内幕》
bear234 2015-02-05
  • 打赏
  • 举报
回复
引用 1 楼 zhxianbin 的回复:
wireshark 是可以设置的
我只用wireshark抓过自己电脑上的包 你确定它可以抓任意给定的ip发出来的包?
zhxianbin 2015-02-04
  • 打赏
  • 举报
回复
wireshark 是可以设置的

18,829

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧