简介:围绕MAC地址硬刷这一细分需求整理的工具与资料合集,面向需要修改网卡物理地址的网络调试人员、黑群晖玩家与硬件维修者,可用于克隆或伪装MAC、维护虚拟机网卡地址的唯一性、修复因硬件故障而无法识别的地址等场景,属于需要一定动手能力的技术型资源。压缩包共197个文件、约4.52MB,以bin固件、c源码、mac配置、cfg参数、exe刷写程序与txt说明为主,另含bat批处理、eep数据、map与dat等辅助文件,覆盖RTL8168、Intel 82574、Atheros、ULI5263等常见网卡芯片,源码与脚本并存,便于按芯片型号查找对应工具并理解刷写流程。随包文档梳理了操作步骤、参数设置与风险提示,配合可执行程序与配置模板,读者可对照自身网卡型号完成地址检测、写入与验证,并通过源码与日志理解底层机制,为后续排错积累依据。已有2552人学习下载。
1. 先分清软改和硬刷:别把ip link当成 MAC 地址硬刷工具
有个开发者拿着一台换过网卡的机器来找我,说 MAC 地址“改过了”,可系统重装后又变回原样。我让他跑了一条ethtool -P,输出的永久地址纹丝没动——他改的只是操作系统层面的那一层,网卡 NVM 里存的还是出厂值。所谓 MAC 地址硬刷,指的是把新的地址写进网卡自己的存储区,断电、重装、换系统都跟着走;软改只是让驱动在上报时换个数。这两件事的工具、权限、风险完全不在一个量级,装错方向的时间成本比装错版本还高。这份硬刷工具适合要给二手设备重新编号、测试环境里模拟多台终端、或者接入侧按 MAC 做登记的场合,前置条件没核对清楚就动手,轻则白忙,重则网卡从设备管理器里消失。
2. 装之前先做三项自检:网卡、地址格式、落地目录
2.1 网卡到底能不能写:先读一遍 NVM 再谈刷
硬刷能不能成,八成取决于网卡本身,而不是工具。网卡的永久地址存在 NVM 里,介质分三种:可反复擦写的 flash、一次性烧死的 OTP、以及带写保护位的受保护区域。独立 PCIe 网卡多数落在第一种,笔记本板载的、特别是和无线模块共用一块小存储的,经常是后两种。工具能读出来不代表能写回去,所以顺序永远是:先枚举、再读、最后才写。
Windows 上先看清楚自己手里是什么设备:
# 列出所有网络适配器,重点看 InterfaceDescription 和 MacAddress 两列 Get-NetAdapter | Format-Table Name, InterfaceDescription, MacAddress, Status -AutoSize # 拿到 PCI 位置信息,多网卡机器靠这个区分谁是谁 Get-NetAdapterHardwareInfo | Format-Table Name, Bus, Device, Function -AutoSizeInterfaceDescription是设备的硬件描述,Bus/Device/Function三元组是它在 PCI 总线上的门牌号,后面刷多网卡机器时全靠这个对号入座,别用“以太网 2”这种随时会变的名称。
Linux 侧对应的是:
# 列出以太网控制器和它的 PCI 地址 lspci -nn | grep -i ethernet # 看驱动名、固件版本、总线位置,driver 字段后面要用来卸载模块 sudo ethtool -i eth0 # 读 NVM 里的永久地址,这一条不改任何东西,纯读 sudo ethtool -P eth0ethtool -P输出的 Permanent address 才是 NVM 里的真实值。如果它和ip link show eth0里的不一样,说明系统之前做过软改,先把软改清掉再谈硬刷,否则你无法判断写入到底成功没有。
注意:
ethtool -P报 “Cannot get permanent address” 时,多半是驱动没实现这个接口,不代表网卡不能写,换用工具自带的读取功能再确认一次。
判断可写性的经验规则:工具能完整 dump 出一段非全 FF 的 NVM 内容,且 dump 的长度和工具说明里的容量一致,就基本可以写;dump 出来全是FF或者直接报错,先停下,很可能碰到 OTP 或者写保护位。
2.2 MAC 地址格式:哪些地址刷上去等于给自己挖坑
MAC 地址是 48 位、6 个字节,写成十六进制。工具对分隔符一般很宽容,02:1A:2B:3C:4D:5E、02-1A-2B-3C-4D-5E、021A2B3C4D5E通常都认,个别工具只吃其中一种,报格式错误时先换分隔符,别急着怀疑工具。
真正要小心的是首字节的两位标志位。第一个字节的最低位是 I/G 位,0 表示单播、1 表示组播,设备地址必须是单播;次低位是 U/L 位,0 表示全球唯一(厂商 OUI 分配),1 表示本地管理。硬刷最稳妥的写法是把 U/L 位置 1,也就是首字节取偶数且带 2 的那种,这样不会和任何厂商的真实 OUI 撞车。
| 首字节示例 | 二进制低两位 | 类型 | 能不能用 |
|---|---|---|---|
02 | 10 | 本地管理、单播 | 推荐,自己编号用这个 |
06、0A、0E | 10 | 本地管理、单播 | 可用,属于同一段 |
00、04、08 | 00 | 全球唯一、单播 | 会占用厂商 OUI,容易冲突 |
01、03、05 | 01 | 组播 | 不能用,交换机不学习 |
FF:FF:FF:FF:FF:FF | — | 广播 | 不能用,网络直接瘫 |
00:00:00:00:00:00 | — | 全零 | 不能用,多数驱动拒绝加载 |
我在给一批机器统一编号时用的规则是:前缀固定02,中间两字节放设备批次,最后三字节放序号,这样一眼能看出这台机器属于哪一批,出问题也好回溯。
注意:不要图省事把同一段地址批量刷给多台机器。MAC 冲突不会立刻报错,表现是交换机 MAC 表反复翻转、两边时通时断,排查起来非常费时间。
2.3 工具包落地:目录、杀软白名单和第一条命令
这类工具包里通常有两套入口:一套 Windows 命令行程序,一套可引导镜像环境用的版本,外加一份说明。落地时有三件事要做。
第一,把整个目录复制到本地磁盘,不要放在 U 盘、网络盘或者同步目录里。写入过程中工具会长时间独占设备句柄,移动介质掉线或者同步进程抢文件,都会让写到一半的 NVM 变成半截数据,这是最典型的变砖原因之一。
第二,给目录加杀软白名单。直接操作 PCI 配置空间和 NVM 的程序,行为特征和底层读写工具高度重合,被拦下来的时候往往不报错、只是静默失败。
第三,先跑只读命令,确认工具能看见设备,再谈别的:
# 进入工具目录后,先只做枚举,不写任何东西 .\macflash.exe -list # 输出一般包含索引、PCI 地址、当前 MAC、NVM 容量四列 # 记下索引号,后面所有读写都靠它定位设备这里说明一下命名:包里的可执行文件名各家不同,下文统一用macflash代指,参数名也按这类工具最常见的写法来讲,你对照自己包里的说明文档改一下大小写和短横线即可,逻辑是通用的。-list这类枚举命令不碰 NVM,跑十遍也不会有风险,装完第一件事就是把它跑通。
3. Windows 侧安装:管理员权限、驱动版本和第一次备份
3.1 三个前置开关:权限、驱动、省电
Windows 下最常见的失败不是工具不行,是三个前置条件没打开。
权限这一项最直白:必须以管理员身份运行终端,普通权限下工具能枚举设备,但一碰 NVM 就返回拒绝访问,报错信息还经常是笼统的 “Access denied”,很容易被误判成写保护。
驱动这一项最容易被忽略。系统自带的通用驱动只保证网络能通,不一定暴露 NVM 访问接口。常见做法是装厂商提供的完整驱动包,装完在设备管理器里确认驱动版本号和厂商页面一致,而不是“Microsoft 基本网络适配器”。驱动不匹配的典型症状是-list能看到设备、-read读出来一堆FF。
省电这一项是隐形的坑。网卡属性里的“允许计算机关闭此设备以节约电源”,会让设备在空闲时进入低功耗状态,写入过程中掉一次电,校验位就废了。动手前把这一项关掉:
# 查当前网卡的电源管理状态 Get-NetAdapterPowerManagement -Name "以太网" | Format-List # 关掉允许关闭设备省电的选项 Disable-NetAdapterPowerManagement -Name "以太网" -NoRestart-NoRestart表示先不重启网卡,改动在下次启用设备时生效。这个命令只影响电源策略,不碰网络配置,批量操作时相对安全。
三项对照检查,齐了再往下走:
| 检查项 | 命令 | 期望结果 |
|---|---|---|
| 管理员权限 | whoami /groups里含 Administrators 且为已启用 | 已启用 |
| 驱动来源 | Get-NetAdapter | Format-Table InterfaceDescription | 显示厂商驱动描述 |
| 省电策略 | Get-NetAdapterPowerManagement | 允许关闭设备为 False |
3.2 把原厂 NVM dump 出来:备份命令与参数
这一步是整个流程里唯一不能省的一步。备份就是后悔药,而且必须是写入之前、设备还正常的时候做的备份。我见过太多人是刷坏了才想起来找备份。
# 建一个带日期的备份目录,别覆盖上一次的备份 New-Item -ItemType Directory -Force -Path .\nvm-backup\20250101 # 按索引把 1 号网卡的 NVM 完整读出来 .\macflash.exe -idx 1 -dump .\nvm-backup\20250101\nic1.bin # 顺手把当前永久 MAC 也记到一个文本里,方便事后比对 .\macflash.exe -idx 1 -read | Tee-Object .\nvm-backup\20250101\nic1.txt-idx是设备索引,来自上一步-list的输出,多网卡机器一定要核对 PCI 地址再填,填错等于把 A 卡的备份当成 B 卡的。-dump输出的是二进制镜像,文件通常只有几 KB 到几十 KB,别嫌小,NVM 就这么大。
备份出来要做两件事:一是立刻复制一份到移动介质或者另一台机器上,本机硬盘坏了备份也跟着没了;二是记录备份文件和设备的对应关系,建议文件名里带 PCI 地址后两位,比如nic_pci03.bin,比nic1.bin可靠得多。
提示:dump 完顺手算个哈希存下来,回写之后比对哈希,能确认写进去的就是当初读出来的那份。
3.3 写入与回读校验:一条命令里的四个参数
真正写入的命令通常长这样:
# 写入:指定设备索引、新地址,写入后立即回读校验 .\macflash.exe -idx 1 -mac 02:1A:2B:3C:4D:5E -write -verify # 断电冷启动之后再读一次,确认写进去的值还在 .\macflash.exe -idx 1 -read四个参数各管一件事:-idx定位设备,-mac是新地址,-write表示真的落盘而不是模拟,-verify让工具写完立刻从 NVM 读回来比对。没有-verify的版本,写完必须自己补一条-read,否则工具只告诉你“命令发送成功”,不代表数据落地成功。
写入过程中有几件事不要做:不要切窗口去点网卡属性、不要插拔任何 USB 设备、不要在这台机器上跑网络扫描。写入是在几百毫秒内完成的,但这几百毫秒里设备被任何上层程序碰一下都可能失败。
写完之后的生效方式有讲究。多数网卡需要真正断电冷启动,重启(软重启)不够,因为 PCI 设备在软重启时可能不复位。做法是关机、拔电源、等三十秒、再开机。开机后先别急着连网,跑一遍读取确认,再进系统看当前生效地址。
# 系统层看到的当前地址 Get-NetAdapter | Select-Object Name, MacAddress, Status # 和 NVM 里的永久地址对比,两个应该一致 .\macflash.exe -idx 1 -read两条命令输出的地址一致,Windows 侧才算真的写成功。只对上一条,说明系统还在用缓存或者软改值。
4. Linux 与可引导环境:卸掉驱动才算真正“硬”刷
4.1 依赖安装与网卡管理权回收
Linux 下的优势是过程透明,每一步都能看到。劣势是网络管理组件会不停地把网卡抢回去,你在刷的时候它去复位设备,结果一样是写入失败。
先把依赖补齐:
# pciutils 提供 lspci,ethtool 用来查驱动和永久地址 sudo apt update sudo apt install -y pciutils ethtool # 确认工具本身可执行,缺库的话这里就会报出来 chmod +x ./macflash ldd ./macflash | grep "not found"ldd那一行是关键,静态编译的工具不会输出任何东西,动态链接的会列出所有依赖库,有not found就先补库,别等到写入时才报错。
然后是收回网卡的管理权。现在主流发行版基本是 NetworkManager 或者 systemd-networkd 在管:
# 停掉网络管理服务,避免它在刷写过程中复位网卡 sudo systemctl stop NetworkManager # 把网卡置为 down,释放上层句柄 sudo ip link set dev eth0 down # 确认现在没有进程占着这块网卡 sudo lsof | grep -i eth0停掉 NetworkManager 意味着这台机器暂时断网,所以要么本地终端操作,要么提前准备好带外管理。远程 SSH 刷网卡是标准的自断后路,连接会随着网卡 down 掉一起消失。
注意:
ip link set dev eth0 down之后ip link show里网卡状态是 DOWN,这是正常的,不代表设备消失,用lspci还能看到它就没事。
4.2 卸载内核驱动,直接访问 PCI 配置空间
到了这一步才是硬刷和软改真正的分界线。只要内核驱动还挂在设备上,工具拿到的就是一个被驱动接管过的视图,写进去的东西可能被驱动缓存覆盖。要让工具直接摸到 NVM,得把驱动卸掉。
# 先查驱动名,输出里的 driver 字段就是要卸载的模块名 sudo ethtool -i eth0 # 卸载驱动模块,把设备从内核手里放出来 sudo modprobe -r <driver_name> # 确认设备仍在 PCI 总线上,这一步是后面能不能救回来的关键 sudo lspci -nn -s 03:00.0 # 用工具枚举,此时应该能直接看到裸设备 sudo ./macflash -list<driver_name>用上一条命令查到的实际模块名替换,不同网卡的模块名差别很大,照抄别人的必翻车。-s 03:00.0里的地址也是示例,换成你自己的 PCI 地址。
卸载驱动之后网卡在网络层面就彻底消失了,ip link里看不到它,这是预期行为。判断设备还活着的唯一依据是lspci还能列出它。这一步的经验是:卸载驱动前先记下 PCI 地址,卸载后用 lspci 对一遍,能对上再往下写,对不上立刻停下来查,不要硬写。
写入命令和 Windows 侧逻辑一致:
# 先备份,备份文件直接写到另一块盘或者挂载的 U 盘上 sudo ./macflash -idx 1 -dump /mnt/backup/nic1.bin # 写入并校验 sudo ./macflash -idx 1 -mac 02:1A:2B:3C:4D:5E -write -verify # 冷启动后重新加载驱动,读回确认 sudo modprobe <driver_name> sudo ethtool -P eth0注意备份路径不要放在即将被卸载驱动的网卡挂载的网络盘上,本地盘或者已挂载的移动介质都行。
4.3 可引导镜像环境:救砖和批量场景的兜底
工具包里的可引导版本不是备胎,在很多场景下它是首选。原因有三个:第一,引导环境里没有完整操作系统,没有任何组件会去抢网卡;第二,部分网卡的写保护位只在特定驱动加载后才生效,引导环境里天然绕开;第三,网卡刷坏之后系统进不去,可引导环境是唯一还能跟设备对话的地方。
制作启动介质用常规的镜像写入方式即可,进系统后先做枚举:
# 引导环境里先确认工具和网卡都在 ./macflash -list # 能列出设备,说明驱动层没问题,可以直接 dump 备份 ./macflash -idx 1 -dump /backup/nic1.bin引导环境的文件系统通常是内存盘,重启就清空,所以备份一定要写到挂载的物理介质上,路径别图省事写在/tmp。
批量刷机器的场景我也建议走引导环境:做一个带工具和地址清单的启动盘,插上、开机、跑一条批量脚本,比在一台台系统里装驱动关省电快得多,而且每台机器的环境完全一致,出问题容易复现。
提示:批量脚本里务必逐台校验写入结果,并在一张表里记录 PCI 地址、写入地址、校验结果三列。刷完不记录,三天后没人说得清哪台机器是哪个地址。
5. 避坑与救砖:五条翻车记录和一套恢复顺序
5.1 五条踩坑记录:现象、原因、解决
第一条:明明是以管理员身份运行,写入还是返回拒绝访问。
现象是-list和-read都正常,一到-write就报权限错误。原因不是权限不够,是驱动仍然占着设备,或者 NVM 的写保护位没有解除。解决办法是先确认驱动版本是厂商完整驱动,再尝试把网卡 down 掉后重试;仍然失败就换到可引导环境,那里没有驱动层拦截,成功率明显更高。
第二条:工具说写成功了,系统里看到的还是老地址。
现象是写入命令返回成功,重启后ip link显示的地址没变。原因有三个常见来源:系统缓存没清、驱动没重新加载、或者之前的软改值优先级更高。解决顺序是先在设备管理器里禁用再启用网卡,然后清一次 ARP 缓存,最后断电冷启动。三步走完还是老地址,就回到工具里-read,读出来是新的说明是系统层问题,读出来是旧的说明压根没写进去。
第三条:刷完网卡在系统里彻底消失了。
现象是设备管理器里看不到这块网卡,lspci里也没有。原因是写入过程中断电或者数据不完整,把 NVM 的校验区写坏了,设备在枚举阶段就自检失败。解决办法只有回写备份:进可引导环境,用-list看还能不能列出设备,能列出就直接-dump出来的那份备份原样写回去;列不出来说明设备在 PCI 层就没起来,基本只能换卡。这条是最贵的坑,也是为什么备份必须做两遍、放两个地方。
第四条:两台机器刷了同一个地址,网络时通时断。
现象是两台机器都能上网,但互相 ping 丢包严重,交换机日志里 MAC 表频繁翻转。原因就是地址冲突,交换机不知道这个地址该往哪个口转发。解决办法是立刻停掉其中一台,重新规划地址段,把序号部分留足位数,别用“先刷了再说”的方式批量操作。
第五条:用ip link set address改完以为刷成功了。
现象是当场生效,重装系统或者换一块硬盘启动后地址又回去了。原因很简单,那是软件层改写,NVM 一动没动。判断方法就一条:ethtool -P看永久地址有没有变,没变就是没刷。
| 现象 | 根因 | 处理 |
|---|---|---|
| 写入报拒绝访问 | 驱动占用或写保护位 | 卸驱动、进引导环境 |
| 系统显示旧地址 | 缓存或软改残留 | 禁用启用设备、冷启动 |
| 设备消失 | NVM 校验区损坏 | 引导环境回写备份 |
| 网络时通时断 | 地址冲突 | 停一台、重新编号 |
| 重装后失效 | 只是软改 | 用ethtool -P复核 |
5.2 刷坏之后的恢复顺序:从冷启动到回写
真刷坏了不要慌,按固定顺序走,别一上来就重装系统。
第一步,完全断电。关机、拔电源线、笔记本还要拔电池或者长按电源键放电,等三十秒。很多“刷坏了”其实只是设备没复位,冷启动之后自己就好了。
第二步,进可引导环境。不要在原系统里折腾,原系统的驱动会干扰判断。
第三步,枚举设备。macflash -list能列出来,说明设备在 PCI 层还活着,恢复希望很大;列不出来,用lspci再确认一次,两处都看不到,基本可以判定需要换卡。
第四步,回写备份。用当初 dump 出来的原始镜像原样写回,写完立刻-read比对,比对通过就冷启动一次,再进系统确认。
第五步,如果回写也失败,检查是不是把备份写到了错误的设备索引上。多网卡机器上这是高频失误,PCI 地址一定要逐一核对。
整个恢复流程里最关键的判断点只有一个:设备还在不在 PCI 总线上。在,就有救;不在,工具再强也没用。这也是为什么每次动手前都要先lspci一眼,把地址记在纸上。
6. 装完怎么验证:三层读回,断电冷启动才算数
验证不是跑一条命令看到新地址就完事。地址可能在三个层面各自为政,只对上一层,等于没验证。我一般按三层走,从下往上,每层都要对得上。
第一层是工具层,直接读 NVM。这一层是真相,其他两层都是它的投影。
# Linux 引导环境或卸载驱动后执行,读的是 NVM 原始值 sudo ./macflash -idx 1 -read第二层是网卡层,看驱动上报的永久地址。这一层能读出值,说明驱动正确识别了 NVM 里的内容。
# Permanent address 应该和工具读出来的一致 sudo ethtool -P eth0 # 系统层当前生效地址,软改过的话这里会和上面不同 ip link show eth0 | head -1第三层是网络侧,从对端确认。这一层最容易被跳过,但它能发现前两层发现不了的问题,比如地址本身合法但和网段里已有设备冲突。
# Windows 侧对端确认:看 ARP 表里记录的是不是新地址 arp -a | Select-String "02-1A-2B" # 交换机侧确认:看 MAC 地址表里这个地址学在了哪个端口 show mac address-table address 021a.2b3c.4d5e三层对照表,逐项打勾再收工:
| 验证层 | 命令 | 判读标准 |
|---|---|---|
| 工具层 | macflash -idx 1 -read | 与写入值完全一致 |
| 网卡层 | ethtool -P eth0 | 与工具层一致 |
| 系统层 | ip link show/Get-NetAdapter | 与网卡层一致 |
| 网络层 | 对端 ARP、交换机 MAC 表 | 地址唯一、端口正确 |
三层之外还有两个动作必须做,而且顺序不能反。
一是断电冷启动。软重启会让部分 PCI 设备跳过复位流程,验证结果不可信。关机、断电、等三十秒、开机,这一轮出来的地址才是真的。
二是换一个环境复核。最硬核的做法是用另一套可引导介质启动,在里面读一次永久地址。如果换了个操作系统还是新地址,那这次硬刷就是彻底成功了,以后重装、换盘都不会打回原形。这一步多花五分钟,能省掉后面反复确认的时间。
还有一件小事,做完顺手把台账补上:设备编号、PCI 地址、旧地址、新地址、备份文件名、操作时间。这东西平时看着多余,等三个月后有人问“这台机器原来是什么地址”,翻一眼就知道,比在聊天记录里搜半天靠谱得多。
从那以后我每次动 NVM 之前,都强制自己走一遍固定动作:先lspci记地址,再 dump 两份备份分两处放,写完必须断电冷启动,最后三层读回逐项打勾。这套动作看着笨,但它把“刷坏了没救”这件事的概率压到了接近零。希望帮到你。
本文还有配套的精品资源,点击获取