[C#] How To Change MacAddress Winform

Vậy MacAddress là gì?

Địa chỉ Mac là viết tắt của cụm từ “Media Access Control” có nghĩa là điều khiển truy nhập môi trường dùng để chỉ địa chỉ vật lý các thiết bị mạng dùng ở tầng liên kết dữ liệu trong mô hình 7 lớp OSI.

Và địa chỉ Mac này thường hay được sử dụng để đinh danh cho một máy tính.

Thường các lập trình viên bảo mật ứng dụng, cũng thường canh theo MacAddress hoặc Serial HDD.

Ở bài viết này, mình sẽ chia sẻ các bạn source code thay đổi Địa chỉ Mac Address bằng cách thay đổi thông tin trong Registry Windows.

Giao diện demo ứng dụng Change MacAddress C#:
Ở hình trên, các bạn thấy địa chỉ MacAddress của mình đã được thay đổi.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Security.Permissions;
using System.Management;
using Microsoft.Win32;
using System.Net.NetworkInformation;
using System.Text.RegularExpressions;


namespace MACAddressTool
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// Represents a Windows network interface. Wrapper around the .NET API for network
        /// interfaces, as well as for the unmanaged device.
        /// </summary>
        public class Adapter
        {
            public ManagementObject adapter;
            public string adaptername;
            public string customname;
            public int devnum;

            public Adapter(ManagementObject a, string aname, string cname, int n)
            {
                this.adapter = a;
                this.adaptername = aname;
                this.customname = cname;
                this.devnum = n;
            }

            public Adapter(NetworkInterface i) : this(i.Description) { }

            public Adapter(string aname)
            {
                this.adaptername = aname;

                var searcher = new ManagementObjectSearcher("select * from win32_networkadapter where Name='" + adaptername + "'");
                var found = searcher.Get();
                this.adapter = found.Cast<ManagementObject>().FirstOrDefault();

                // Extract adapter number; this should correspond to the keys under
                // HKEY_LOCAL_MACHINESYSTEMControlSet001ControlClass{4d36e972-e325-11ce-bfc1-08002be10318}
                try
                {
                    var match = Regex.Match(adapter.Path.RelativePath, ""(d+)"$");
                    this.devnum = int.Parse(match.Groups[1].Value);
                }
                catch
                {
                    return;
                }

                // Find the name the user gave to it in "Network Adapters"
                this.customname = NetworkInterface.GetAllNetworkInterfaces().Where(
                    i => i.Description == adaptername
                ).Select(
                    i => " (" + i.Name + ")"
                ).FirstOrDefault();
            }

            /// <summary>
            /// Get the .NET managed adapter.
            /// </summary>
            public NetworkInterface ManagedAdapter
            {
                get
                {
                    return NetworkInterface.GetAllNetworkInterfaces().Where(
                        nic => nic.Description == this.adaptername
                    ).FirstOrDefault();
                }
            }

            /// <summary>
            /// Get the MAC address as reported by the adapter.
            /// </summary>
            public string Mac
            {
                get
                {
                    try
                    {
                        return BitConverter.ToString(this.ManagedAdapter.GetPhysicalAddress().GetAddressBytes()).Replace("-", "").ToUpper();
                    }
                    catch { return null; }
                }
            }

            /// <summary>
            /// Get the registry key associated to this adapter.
            /// </summary>
            public string RegistryKey
            {
                get
                {
                    return String.Format(@"SYSTEMControlSet001ControlClass{{4D36E972-E325-11CE-BFC1-08002BE10318}}{0:D4}", this.devnum);
                }
            }

            /// <summary>
            /// Get the NetworkAddress registry value of this adapter.
            /// </summary>
            public string RegistryMac {
                get
                {
                    try
                    {
                        using (RegistryKey regkey = Registry.LocalMachine.OpenSubKey(this.RegistryKey, false))
                        {
                            return regkey.GetValue("NetworkAddress").ToString();
                        }
                    }
                    catch
                    {
                        return null;
                    }
                }
            }

            /// <summary>
            /// Sets the NetworkAddress registry value of this adapter.
            /// </summary>
            /// <param name="value">The value. Should be EITHER a string of 12 hexadecimal digits, uppercase, without dashes, dots or anything else, OR an empty string (clears the registry value).</param>
            /// <returns>true if successful, false otherwise</returns>
            public bool SetRegistryMac(string value)
            {
                bool shouldReenable = false;

                try
                {
                    // If the value is not the empty string, we want to set NetworkAddress to it,
                    // so it had better be valid
                    if (value.Length > 0 && !Adapter.IsValidMac(value, false))
                        throw new Exception(value + " is not a valid mac address");

                    using (RegistryKey regkey = Registry.LocalMachine.OpenSubKey(this.RegistryKey, true))
                    {
                        if (regkey == null)
                            throw new Exception("Failed to open the registry key");

                        // Sanity check
                        if (regkey.GetValue("AdapterModel") as string != this.adaptername
                            && regkey.GetValue("DriverDesc") as string != this.adaptername)
                            throw new Exception("Adapter not found in registry");

                        // Ask if we really want to do this
                        string question = value.Length > 0 ?
                            "Changing MAC-adress of adapter {0} from {1} to {2}. Proceed?" :
                            "Clearing custom MAC-address of adapter {0}. Proceed?";
                        DialogResult proceed = MessageBox.Show(
                            String.Format(question, this.ToString(), this.Mac, value),
                            "Change MAC-address?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (proceed != DialogResult.Yes)
                            return false;

                        // Attempt to disable the adepter
                        var result = (uint)adapter.InvokeMethod("Disable", null);
                        if (result != 0)
                            throw new Exception("Failed to disable network adapter.");

                        // If we're here the adapter has been disabled, so we set the flag that will re-enable it in the finally block
                        shouldReenable = true;

                        // If we're here everything is OK; update or clear the registry value
                        if (value.Length > 0)
                            regkey.SetValue("NetworkAddress", value, RegistryValueKind.String);
                        else
                            regkey.DeleteValue("NetworkAddress");
                        

                        return true;
                    }
                }

                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    return false;
                }

                finally
                {
                    if (shouldReenable)
                    {
                        uint result = (uint)adapter.InvokeMethod("Enable", null);
                        if (result != 0)
                            MessageBox.Show("Failed to re-enable network adapter.");
                    }
                }
            }

            public override string ToString()
            {
                return this.adaptername + this.customname;
            }

            /// <summary>
            /// Get a random (locally administered) MAC address.
            /// </summary>
            /// <returns>A MAC address having 01 as the least significant bits of the first byte, but otherwise random.</returns>
            public static string GetNewMac()
            {
                System.Random r = new System.Random();

                byte[] bytes = new byte[6];
                r.NextBytes(bytes);

                // Set second bit to 1
                bytes[0] = (byte)(bytes[0] | 0x02);
                // Set first bit to 0
                bytes[0] = (byte)(bytes[0] & 0xfe);

                return MacToString(bytes);
            }

            /// <summary>
            /// Verifies that a given string is a valid MAC address.
            /// </summary>
            /// <param name="mac">The string.</param>
            /// <param name="actual">false if the address is a locally administered address, true otherwise.</param>
            /// <returns>true if the string is a valid MAC address, false otherwise.</returns>
            public static bool IsValidMac(string mac, bool actual)
            {
                // 6 bytes == 12 hex characters (without dashes/dots/anything else)
                if (mac.Length != 12)
                    return false;

                // Should be uppercase
                if (mac != mac.ToUpper())
                    return false;

                // Should not contain anything other than hexadecimal digits
                if (!Regex.IsMatch(mac, "^[0-9A-F]*$"))
                    return false;

                if (actual)
                    return true;

                // If we're here, then the second character should be a 2, 6, A or E
                char c = mac[1];
                return (c == '2' || c == '6' || c == 'A' || c == 'E');
            }

            /// <summary>
            /// Verifies that a given MAC address is valid.
            /// </summary>
            /// <param name="mac">The address.</param>
            /// <param name="actual">false if the address is a locally administered address, true otherwise.</param>
            /// <returns>true if valid, false otherwise.</returns>
            public static bool IsValidMac(byte[] bytes, bool actual)
            {
                return IsValidMac(Adapter.MacToString(bytes), actual);
            }

            /// <summary>
            /// Converts a byte array of length 6 to a MAC address (i.e. string of hexadecimal digits).
            /// </summary>
            /// <param name="bytes">The bytes to convert.</param>
            /// <returns>The MAC address.</returns>
            public static string MacToString(byte[] bytes)
            {
                return BitConverter.ToString(bytes).Replace("-", "").ToUpper();
            }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            /* Windows generally seems to add a number of non-physical devices, of which
             * we would not want to change the address. Most of them have an impossible
             * MAC address. */
            foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces().Where(
                    a => Adapter.IsValidMac(a.GetPhysicalAddress().GetAddressBytes(), true)
                ).OrderByDescending(a => a.Speed))
            {
                AdaptersComboBox.Items.Add(new Adapter(adapter));
            }
            
            AdaptersComboBox.SelectedIndex = 0;
        }

        /// <summary>
        /// Update the UI to show the current addresses.
        /// </summary>
        private void UpdateAddresses()
        {
            Adapter a = AdaptersComboBox.SelectedItem as Adapter;
            this.CurrentMacTextBox.Text = a.RegistryMac;
            this.ActualMacLabel.Text = a.Mac;
        }

        private void AdaptersComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            UpdateAddresses();
        }

        private void RandomButton_Click(object sender, EventArgs e)
        {
            CurrentMacTextBox.Text = Adapter.GetNewMac();
        }

        private void UpdateButton_Click(object sender, EventArgs e)
        {
            if (!Adapter.IsValidMac(CurrentMacTextBox.Text, false))
            {
                MessageBox.Show("Entered MAC-address is not valid; will not update.", "Invalid MAC-address specified", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            SetRegistryMac(CurrentMacTextBox.Text);
        }

        private void ClearButton_Click(object sender, EventArgs e)
        {
            SetRegistryMac("");
        }

        /// <summary>
        /// Set the address of the selected adapter to the given value and update the UI.
        /// </summary>
        /// <param name="mac">The MAC address to set.</param>
        private void SetRegistryMac(string mac)
        {
            Adapter a = AdaptersComboBox.SelectedItem as Adapter;

            if (a.SetRegistryMac(mac))
            {
                System.Threading.Thread.Sleep(100);
                UpdateAddresses();
                MessageBox.Show("Done!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void RereadButton_Click(object sender, EventArgs e)
        {
            UpdateAddresses();
        }

        private void CurrentMacTextBox_TextChanged(object sender, EventArgs e)
        {
            this.UpdateButton.Enabled = Adapter.IsValidMac(this.CurrentMacTextBox.Text, false);
        }
    }
}
P/s: Bài viết chỉ nhằm mục đích học tập, không nên sử dụng để chỉnh sửa thông tin Windows.
Download Source Code.
DOWNLOAD RADOM MACADRESS

Chúc mọi người thành công với thủ thuật này.
Theo LapTrinhVB.Net
Next Post Previous Post
9 Comments
  • Hoàng Hải
    Hoàng Hải Thứ Ba, 01 tháng 11, 2022

    A thấy không khả thi lắm, change proxy có change đc user agent nữa mới hay kìa :D, để làm mới trình duyệt luôn ấy.

  • Base Alli
    Base Alli Thứ Ba, 01 tháng 11, 2022

    uầy đầu tư host hả e? view source thấy có mấy link này :D host ok đấy https://im.hungqb.com/logo_hungqb-removebg-preview.png

    • Anonymous Hz
      Anonymous Hz Thứ Tư, 02 tháng 11, 2022

      k a, e đang test thử bên bizfly xem vps nó thế nào, a thuê 6 tháng, thấy cũng ok nên e chuyển sang test thử host luôn đó a :D

    • Hung Quang Binh
      Hung Quang Binh Thứ Tư, 02 tháng 11, 2022

      M thấy có phải host đâu, nó rảnh việc nên thuê vps về chơi để lm ứng dụng chát cho ng dùng đó chứ. Mà sao lại trỏ vps về làm hosting. Ai hack đc em host đó là có quyền truy cập vps của nó r, tha hồ phá .haha

  • Hoàng Hải
    Hoàng Hải Thứ Tư, 02 tháng 11, 2022

    E ơi, a có góp ý như thế này, e nên tìm hiểu thủ thuật gì mà khi vào blog nó tự động chuyển sang giao diện tối cho dễ chịu mắt chứ vào thấy trắng tinh muốn tìm gì cũng thấy hơi đau mắt để soi e nhé. (a góp ý, e chuyển sang đc thì tốt, chúc e thành công) :D

    • Anonymous Hz
      Anonymous Hz Thứ Tư, 02 tháng 11, 2022

      E sẽ tìm hiểu và cố gắng phát triển giao diện tốt nhất cho người dùng, do e bận một số công việc đang con dang dỡ nên không chú tâm nhiều đến để phát triển giao diện tốt nhất đó a, rảnh là e vào xem tình hình thế nào và có ai tương tác trợ giúp gì k để e phản hồi a ạh. e sẽ tìm hiểu và làm theo lời a. (y)

    • Hung Quang Binh
      Hung Quang Binh Thứ Tư, 02 tháng 11, 2022

      (y) chuẩn, giao diện tối nhìn dịu mắt hơn

  • Hoàng Đông
    Hoàng Đông Thứ Tư, 02 tháng 11, 2022

    làm chương trình thay user agent đi e :D

    • Hung Quang Binh
      Hung Quang Binh Thứ Tư, 02 tháng 11, 2022

      M cũng đang tìm hiểu, k biết thuật toán thế nào, thay đổi trực tiếp trên ứng dụng hay phải open chorme trên máy tính nữa, hi để m hỏi mấy ac đi trc xem thế nào nhé.

Add Comment
comment url
Tăng traffic miễn phí