- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[C#] Vì Mẹ anh bắt phải Fake địa chỉ MacAddress
Xin chào các bạn, bài viết hôm nay mình chia sẻ các bạn source code cách thay đổi địa chỉ MacAddress trên C#, Winform.
[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 MacAddres
s 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.
P/s: Nếu bạn nào đang có mua hay sử dụng phần mềm nào mà phần mềm đó đang sử dụng MacAddress để định danh, các bạn cẩn thận khi thay đổi, không thì có thể không login vào được phần mềm đó nữa.
Source code C#:
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.
Thanks for watching!