在Android中访问没有root的ARP表

Posted

技术标签:

【中文标题】在Android中访问没有root的ARP表【英文标题】:access ARP table without root in Android 【发布时间】:2017-07-28 08:29:41 【问题描述】:

我最近正在处理一个需要访问 ARP 表的 android 项目。要求之一是避免任何需要根设备的方法。所以,我的问题是: 有什么方法可以在不root设备的情况下访问android中的ARP表?

目前我发现大多数方法都是使用/proc/net/arp来访问需要root权限的ARP表,我不确定这是否是唯一的方法。

【问题讨论】:

您是否找到了访问 ARP 表的其他方法? 【参考方案1】:

我可以在没有 root 的情况下访问 ARP 表。这是我的代码:

string GetMACAddressviaIP(string ipAddr)

    string result = "";
    ostringstream ss;
    ss << "/proc/net/arp";
    string loc = ss.str();

    ifstream in(loc);
    if(!in)
    
        printf("open %s failed\n",loc.c_str());
        return result;
    

    string line;
    while(getline(in, line))
        if(strstr(line.c_str(), ipAddr.c_str()))
        
            const char *buf = strstr(line.c_str(), ":") - 2;
            int counter = 0;
            stringstream ss;
            while(counter < 17)
            
                ss << buf[counter];
                counter++;
            
            result = ss.str();
        
    

    return result;

【讨论】:

请提供更多详细信息...这是什么语言?你如何在android上执行它? ...... 这种语言是 C++。我在开发 Android 项目时使用了 NDK。 JNI 允许访问 C/C++ 代码。 @RobinDavies 是否有任何替代解决方案我卡住了,无法找到从 android 10 开始访问 arp 文件的方法, 我最终使用了与网络上除路由器以外的设备关联的 UUID 来识别网络。 @RobinDavies 你能提供更多细节吗?【参考方案2】:

为了更好的理解,使用Java语言,可以在android中检索ARP表为:

    BufferedReader br = null;
    ArrayList<ClientScanResult> result = new ArrayList<ClientScanResult>();

    try 
        br = new BufferedReader(new FileReader("/proc/net/arp"));
        String line;
        while ((line = br.readLine()) != null) 
           System.out.println(line);
    
    Catch(Exception e)
    finally 
        try 
            br.close();
         catch (IOException e) 

        
    

【讨论】:

【参考方案3】:

作为先前答案的替代方案,“无编码”解决方案是在您的设备上安装 linux 终端仿真器并使用 arp -a 命令查看 arp 表。

【讨论】:

您好,欢迎来到 SO!请阅读tour 和How do I write a good answer? 例如,您可以将完整的命令分隔到代码块中的另一行,并添加如何安装该模拟器的指导。【参考方案4】:

我为 Java 推荐如下内容。这结合了其他两个的答案。它尚未经过测试,因此可能需要进行一些调整,但您明白了。

public String getMacAddressForIp(final String ipAddress) 
    try (BufferedReader br = new BufferedReader(new FileReader("/proc/net/arp"))) 
        String line;
        while ((line = br.readLine()) != null) 
            if (line.contains(ipAddress)) 
                final int macStartIndex = line.indexOf(":") - 2;
                final int macEndPos = macStartIndex + 17;
                if (macStartIndex >= 0 && macEndPos < line.length()) 
                    return line.substring(macStartIndex, macEndPos);
                 else 
                    Log.w("MyClass", "Found ip address line, but mac address was invalid.");
                
            
        
     catch(Exception e)
        Log.e("MyClass", "Exception reading the arp table.", e);
    
    return null;

【讨论】:

以上是关于在Android中访问没有root的ARP表的主要内容,如果未能解决你的问题,请参考以下文章

应用程序如何在没有 root 的情况下访问 Android 6.0(API 级别 23)中 USB OTG 存储上的文件?

android中怎么对没有root权限的手机, 进行数据库表的增删改查。

弱弱的问下linux如何清理arp缓存

windows下arp缓存刷新间隔为多久

Android ADB无需root即可访问应用数据库

Wireshark Ethernet and ARP 实验—Wireshark Lab: Ethernet and ARP v7.0