Получить доступ к таблице ARP без рута в Android

Я недавно работаю над проектом Android, который требует доступа к таблице ARP. Одно из требований состоит в том, чтобы избегать любых методов, которые требуют корневого устройства. Итак, мой вопрос: есть ли способ получить доступ к таблице ARP в Android без рута устройства?

В настоящее время я обнаружил, что большинство подходов используют /proc/net/arp для доступа к таблице ARP, для которой требуется разрешение root, и я не уверен, является ли это единственным способом.

5 ответов

Я могу получить доступ к таблице 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;
}

Для лучшего понимания, используя язык Java, вы можете получить таблицу ARP в Android как:

    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) {

        }
    }

Я рекомендую что-то вроде следующего для 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;

}

В качестве альтернативы предыдущим ответам решением «без кодирования» является установка эмулятора терминала Linux на вашем устройстве и использование команды arp -a для просмотра таблицы arp.

Похоже, что приложение не могло получить доступ к файлу arp с Android 10. ссылка

Другие вопросы по тегам