我正在尝试欺骗执行程序的计算机的MAC地址。现在我通过cmd使用'getmac'命令获取机器的当前MAC地址,然后我想通过'RegistryKey'类(windows.system32)更改它。
问题是我不知道要传递给OpenSubKey
方法的字符串。
例如,这是使用注册表项读取当前MAC的方法:
private string readMAC()
{
RegistryKey rkey;
string MAC;
rkey = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\0012", true); //--->this is the string to change
MAC = (string)rkey.GetValue("NetworkAddress");
rkey.Close();
return MAC;
}
答案 0 :(得分:5)
我很好奇所以我拉了MadMACs的来源。事实证明将核心逻辑移植到C#非常简单,所以如果有人对此感兴趣的话。
private const string baseReg =
@"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\";
public static bool SetMAC(string nicid, string newmac)
{
bool ret = false;
using (RegistryKey bkey = GetBaseKey())
using (RegistryKey key = bkey.OpenSubKey(baseReg + nicid))
{
if (key != null)
{
key.SetValue("NetworkAddress", newmac, RegistryValueKind.String);
ManagementObjectSearcher mos = new ManagementObjectSearcher(
new SelectQuery("SELECT * FROM Win32_NetworkAdapter WHERE Index = " + nicid));
foreach (ManagementObject o in mos.Get().OfType<ManagementObject>())
{
o.InvokeMethod("Disable", null);
o.InvokeMethod("Enable", null);
ret = true;
}
}
}
return ret;
}
public static IEnumerable<string> GetNicIds()
{
using (RegistryKey bkey = GetBaseKey())
using (RegistryKey key = bkey.OpenSubKey(baseReg))
{
if (key != null)
{
foreach (string name in key.GetSubKeyNames().Where(n => n != "Properties"))
{
using (RegistryKey sub = key.OpenSubKey(name))
{
if (sub != null)
{
object busType = sub.GetValue("BusType");
string busStr = busType != null ? busType.ToString() : string.Empty;
if (busStr != string.Empty)
{
yield return name;
}
}
}
}
}
}
}
public static RegistryKey GetBaseKey()
{
return RegistryKey.OpenBaseKey(
RegistryHive.LocalMachine,
InternalCheckIsWow64() ? RegistryView.Registry64 : RegistryView.Registry32);
}
为了简洁起见,我忽略了InternalCheckIsWow64()
的实施,但可以找到here。没有这个,由于32位和64位操作系统之间的结构差异,我遇到了没有找到我想要的注册表的问题。
强制性免责声明 - 在您自己的危险中与注册表一起玩。
答案 1 :(得分:2)
这应该指向正确的方向,但你必须弄清楚代码:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\
,您将看到与“网络连接”控制面板中的接口对应的几个子键。可能只有一个会有一个有效的IP,其他的将有0.0.0.0你需要做一些模式匹配来找出哪一个是正确的。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}
并检查每个NetCfgInstanceId
值(或搜索)的GUID界面。答案 2 :(得分:0)
Windows 10
HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \控制\类{4D36E972-E325-11CE-BFC1-08002BE10318} \ 0004 \ NetworkAddress的