#java
#java
Вопрос:
Я использовал этот код, чтобы получить MAC-адрес системы:-
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
public class App{
public static void main(String[] args){
InetAddress ip;
try {
ip = InetAddress.getLocalHost();
//System.out.println("Current IP address : " ip.getHostAddress());
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
byte[] mac = network.getHardwareAddress();
System.out.print("Current MAC address : ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i ) {
sb.append(String.format("X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
}
System.out.println(sb.toString());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e){
e.printStackTrace();
}
}
}
Итак, у меня есть несколько вопросов:-
-
Как сохранить полученный MAC-адрес в текстовый файл?
-
Как использовать этот текстовый файл (т.Е. MAC-адрес) для последующей идентификации устройства?
Заранее спасибо 🙂
Комментарии:
1. Если у вас есть эти два вопроса, ваш код становится неактуальным
2. на самом деле я использую MAC для чего-то вроде борьбы с пиратством… поэтому, пожалуйста, помогите мне…
3. @DavidPostill Предполагается , что они уникальны. Повторное использование MAC-адресов приводит к поломке сетевого оборудования. Это все еще плохое использование для них, но полагаться на них для различения машин для других целей разумно.
4. @chrylis согласен, но, как я сказал выше, использование их для борьбы с пиратством не очень надежно, когда MAC-адрес может быть подделан, чтобы соответствовать тому, который требуется для запуска пиратской копии какого-либо программного обеспечения. Пиратская копия, вероятно, все равно будет запущена в другой сети…
5. Хорошо, я попытаюсь переключиться
Ответ №1:
Как сохранить полученный MAC-адрес в текстовый файл?
У вас уже есть код для этого в вашем вопросе. Все, что вам нужно сделать, это записать в файл, а не стандартный вывод. (И если вы не знаете, как это сделать… прочитайте урок: Базовый ввод-вывод.)
Как использовать этот текстовый файл (т.Е. MAC-адрес) для последующей идентификации устройства?
Прочитайте его в строку (см. Ссылку выше) и сравните строку с другой, которую вы создали таким же образом.
Помните, что большинство систем позволяют системному администратору изменять MAC-адрес сетевой карты. Следовательно, меры по борьбе с пиратством, основанные на проверке MAC-адресов, легко обойти.
Комментарии:
1. пожалуйста, предложите мне какие-либо другие способы борьбы с пиратством
2. @user3773579 Как можно защитить программное обеспечение от пиратства?
3. @user3773579 — Единственная надежная защита от пиратства — раздавать программное обеспечение бесплатно.
Ответ №2:
public class MacAddress
{
public static void Main(string[] argv)
{
int commlength, miblength, datastart, datalength;
string nextmib, value;
SNMP conn = new SNMP();
string mib = "1.3.6.1.2.1.17.4.3.1.1";
int orgmiblength = mib.Length;
byte[] response = new byte[1024];
nextmib = mib;
while (true)
{
response = conn.get("getnext", argv[0], argv[1], nextmib);
commlength = Convert.ToInt16(response[6]);
miblength = Convert.ToInt16(response[23 commlength]);
datalength = Convert.ToInt16(response[25 commlength miblength]);
datastart = 26 commlength miblength;
value = BitConverter.ToString(response, datastart, datalength);
nextmib = conn.getnextMIB(response);
if (!(nextmib.Substring(0, orgmiblength) == mib))
break;
Console.WriteLine("{0} = {1}", nextmib, value);
}
}
}
class SNMP
{
public SNMP()
{
}
public byte[] get(string request, string host, string community, string mibstring)
{
byte[] packet = new byte[1024];
byte[] mib = new byte[1024];
int snmplen;
int comlen = community.Length;
string[] mibvals = mibstring.Split('.');
int miblen = mibvals.Length;
int cnt = 0, temp, i;
int orgmiblen = miblen;
int pos = 0;
// Convert the string MIB into a byte array of integer values
// Unfortunately, values over 128 require multiple bytes
// which also increases the MIB length
for (i = 0; i < orgmiblen; i )
{
temp = Convert.ToInt16(mibvals[i]);
if (temp > 127)
{
mib[cnt] = Convert.ToByte(128 (temp / 128));
mib[cnt 1] = Convert.ToByte(temp - ((temp / 128) * 128));
cnt = 2;
miblen ;
} else
{
mib[cnt] = Convert.ToByte(temp);
cnt ;
}
}
snmplen = 29 comlen miblen - 1; //Length of entire SNMP packet
//The SNMP sequence start
packet[pos ] = 0x30; //Sequence start
packet[pos ] = Convert.ToByte(snmplen - 2); //sequence size
//SNMP version
packet[pos ] = 0x02; //Integer type
packet[pos ] = 0x01; //length
packet[pos ] = 0x00; //SNMP version 1
//Community name
packet[pos ] = 0x04; // String type
packet[pos ] = Convert.ToByte(comlen); //length
//Convert community name to byte array
byte[] data = Encoding.ASCII.GetBytes(community);
for (i = 0; i < data.Length; i )
{
packet[pos ] = data[i];
}
//Add GetRequest or GetNextRequest value
if (request == "get")
packet[pos ] = 0xA0;
else
packet[pos ] = 0xA1;
packet[pos ] = Convert.ToByte(20 miblen - 1); //Size of total MIB
//Request ID
packet[pos ] = 0x02; //Integer type
packet[pos ] = 0x04; //length
packet[pos ] = 0x00; //SNMP request ID
packet[pos ] = 0x00;
packet[pos ] = 0x00;
packet[pos ] = 0x01;
//Error status
packet[pos ] = 0x02; //Integer type
packet[pos ] = 0x01; //length
packet[pos ] = 0x00; //SNMP error status
//Error index
packet[pos ] = 0x02; //Integer type
packet[pos ] = 0x01; //length
packet[pos ] = 0x00; //SNMP error index
//Start of variable bindings
packet[pos ] = 0x30; //Start of variable bindings sequence
packet[pos ] = Convert.ToByte(6 miblen - 1); // Size of variable binding
packet[pos ] = 0x30; //Start of first variable bindings sequence
packet[pos ] = Convert.ToByte(6 miblen - 1 - 2); // size
packet[pos ] = 0x06; //Object type
packet[pos ] = Convert.ToByte(miblen - 1); //length
//Start of MIB
packet[pos ] = 0x2b;
//Place MIB array in packet
for(i = 2; i < miblen; i )
packet[pos ] = Convert.ToByte(mib[i]);
packet[pos ] = 0x05; //Null object value
packet[pos ] = 0x00; //Null
//Send packet to destination
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 5000);
IPHostEntry ihe = Dns.Resolve(host);
IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161);
EndPoint ep = (EndPoint)iep;
sock.SendTo(packet, snmplen, SocketFlags.None, iep);
//Receive response from packet
try
{
int recv = sock.ReceiveFrom(packet, ref ep);
} catch (SocketException)
{
packet[0] = 0xff;
}
return packet;
}
public string getnextMIB(byte[] mibin)
{
string output = "1.3";
int commlength = mibin[6];
int mibstart = 6 commlength 17; //find the start of the mib section
//The MIB length is the length defined in the SNMP packet
// minus 1 to remove the ending .0, which is not used
int miblength = mibin[mibstart] - 1;
mibstart = 2; //skip over the length and 0x2b values
int mibvalue;
for(int i = mibstart; i < mibstart miblength; i )
{
mibvalue = Convert.ToInt16(mibin[i]);
if (mibvalue > 128)
{
mibvalue = (mibvalue/128)*128 Convert.ToInt16(mibin[i 1]);
i ;
}
output = "." mibvalue;
}
return output;
}
}
Комментарии:
1. Я получил это отсюда