Как подделать NetworkInterface.getHardwareAddress () (Java) - PullRequest
0 голосов
/ 24 мая 2019

У меня есть программное обеспечение, работающее в OpenShift (Kubernetes), где лицензия основана на MAC-адресе. При перезапуске приложения MAC-адрес контейнера меняется, и мне нужно подать заявку на новый файл лицензии.

Поскольку в модулях k8s нет статического MAC-адреса, я хочу подделать Java-вызов NetworkInterface.getHardwareAddress (), чтобы заставить программное обеспечение думать, что MAC-адрес все тот же.

Enumeration enumeration = NetworkInterface.getNetworkInterfaces();
while (enumeration.hasMoreElements()) {
    NetworkInterface networkInterface = (NetworkInterface) enumeration.nextElement();
    if (networkInterface.isLoopback() || networkInterface.isPointToPoint() || networkInterface.isVirtual()) {
        continue;
    }
    if (networkInterface.isUp()) {
        byte[] arrayOfByte = networkInterface.getHardwareAddress();
        if (arrayOfByte != null && arrayOfByte.length == 6) {
            StringBuilder stringBuilder = new StringBuilder();
            for (byte b = 0; b < arrayOfByte.length; b++) {
                if (b != 0) {
                    stringBuilder.append(":");
                }
                stringBuilder.append(String.format("%02x", arrayOfByte[b]));
            }
            System.out.println(networkInterface.getName() + ": " + stringBuilder);
        }
    }
}

актуально: eth0: 01: 14: 4d: ec: 01: 42

ожидается: eth0: ee: ee: ee: ee: ee: ee

1 Ответ

1 голос
/ 24 мая 2019

К сожалению, вы не можете сделать это в Java.

Метод NetworkInterface::getNetworkInterfaces() реализован как native, что означает, что он не обращается к какому-либо конкретному полю для получения своих результатов.Если это произойдет, вам, возможно, повезет, взломав что-то с помощью отражения, но вместо этого вам придется управлять им в конфигурации вашей ОС.

РЕДАКТИРОВАТЬ: Что касается решений Kubernetes, вы можете посмотреть здесь

...