Android 通过读取本地Arp表获取当前局域网内其他设备信息
来源:互联网 发布:引用另外一个表格数据 编辑:程序博客网 时间:2024/05/16 06:31
目的:获取当前局域网内其他连接设备的IP 和MAC信息。
步骤:
1. 获取本机wifi ip信息;
2. 根据ip 去发送ARP请求
3. 读取本地ARP 表;
1. 获取本机WiFi 下 ip :参考另一篇文章
Android 获取设备IP
2. ARP 简介
- 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
- ARP 缓存
ARP缓存是个用来储存IP地址和MAC地址的缓冲区,其本质就是一个IP地址–>MAC地址的对应表,表中每一个条目分别记录了网络上其他主机的IP地址和对应的MAC地址。每一个以太网或令牌环网络适配器都有自己单独的表。当地址解析协议被询问一个已知IP地址节点的MAC地址时,先在ARP缓存中查看,若存在,就直接返回与之对应的MAC地址,若不存在,才发送ARP请求向局域网查询。
为使广播量最小,ARP维护IP地址到MAC地址映射的缓存以便将来使用。ARP缓存可以包含动态和静态项目。动态项目随时间推移自动添加和删除。每个动态ARP缓存项的潜在生命周期是10分钟。新加到缓存中的项目带有时间戳,如果某个项目添加后2分钟内没有再使用,则此项目过期并从ARP缓存中删除;如果某个项目已在使用,则又收到2分钟的生命周期;如果某个项目始终在使用,则会另外收到2分钟的生命周期,一直到10分钟的最长生命周期。静态项目一直保留在缓存中,直到重新启动计算机为止.
- 在使用cmd arp -a 命令查看 windows 下arp 表内容
3 在局域网内发送广播
普通的 arp 请求A要和B 建立连接,则 在局域网内发送一个广播 ,发送源A的IP和MAC,目的ip 为B的IP,MAC 信息为 FF:FF:FF:FF:FF:FF(表示广播),但是现在我们不知道局域网内其他设备的ip 信息,因此,只能去逐个发送请求。
// 根据ip 网段去 发送arp 请求private void discover(String ip) { String newip = ""; if (!ip.equals("")) { String ipseg = ip.substring(0, ip.lastIndexOf(".")+1); for (int i=2; i<255; i++) { newip = ipseg+String.valueOf(i); if (newip.equals(ip)) continue; Thread ut = new UDPThread(newip); ut.start(); } } }
// UDPThread public class UDPThread extends Thread { private String target_ip = ""; public static final byte[] NBREQ = { (byte) 0x82, (byte) 0x28, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x1, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x20, (byte) 0x43, (byte) 0x4B, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x41, (byte) 0x0, (byte) 0x0, (byte) 0x21, (byte) 0x0, (byte) 0x1 }; public static final short NBUDPP = 137; public UDPThread(String target_ip) { this.target_ip = target_ip; } @Override public synchronized void run() { if (target_ip == null || target_ip.equals("")) return; DatagramSocket socket = null; InetAddress address = null; DatagramPacket packet = null; try { address = InetAddress.getByName(target_ip); packet = new DatagramPacket(NBREQ, NBREQ.length, address, NBUDPP); socket = new DatagramSocket(); socket.setSoTimeout(200); socket.send(packet); socket.close(); } catch (SocketException se) { } catch (UnknownHostException e) { } catch (IOException e) { } finally { if (socket != null) { socket.close(); } } }}
4 . 读取 ARP 表
private void readArp() { try { BufferedReader br = new BufferedReader( new FileReader("/proc/net/arp")); String line = ""; String ip = ""; String flag = ""; String mac = ""; while ((line = br.readLine()) != null) { try { line = line.trim(); if (line.length() < 63) continue; if (line.toUpperCase(Locale.US).contains("IP")) continue; ip = line.substring(0, 17).trim(); flag = line.substring(29, 32).trim(); mac = line.substring(41, 63).trim(); if (mac.contains("00:00:00:00:00:00")) continue; Log.e("scanner", "readArp: mac= "+mac+" ; ip= "+ip+" ;flag= "+flag); } catch (Exception e) { } } br.close(); } catch(Exception e) { } }
- demo 已上传github打开连接
- 参考 普通ARP请求及回应
阅读全文
1 0
- Android 通过读取本地Arp表获取当前局域网内其他设备信息
- mac工具--通过 arp 欺骗抓取局域网内设备数据包
- 通过广播发现局域网内的其他设备
- android 获取局域网内其他手机的ip
- 通过 ARP 协议获取局域网内指定 IP 地址的机器的 MAC 地址
- 局域网内arp攻击
- 基于ARP协议获取局域网内主机MAC地址
- 基于ARP协议获取局域网内主机MAC地址
- js 判断当前设备(Android IOS)和版本号或其他对应设备信息
- android获取当前手机设备信息工具类
- Android利用Build类获取当前设备信息
- java获取局域网内所有ip信息
- 允许局域网内其他主机访问本地MySql数据库
- SS代理分享给局域网内其他设备
- WebStorm设置手机测试服务器-局域网内其他设备访问
- linux ettercap+wireshark抓取局域网内其他设备的数据包
- 局域网内android设备发现及通讯
- 局域网内通过机器名访问其他机器
- MIT6.828 LAB6: Network Driver
- 一张图理解Android事件传递机制
- Java实训第3天(Java语言基础)
- 关于如何配置java环境变量
- mybatis常用jdbcType数据类型
- Android 通过读取本地Arp表获取当前局域网内其他设备信息
- JS 产生随机数
- 机器学习笔记之简化成本函数和梯度下降
- 2017.07.13回顾 MIC
- 使用dd命令快速生成大文件或者小文件的方法
- jdbc连接Oracle数据库实现学生管理系统
- 算法设计期末作业07-8.16
- 笔记
- OC语言学习06-字典对象