news 2026/9/24 12:34:56

门禁卡复制实战:从M1卡解密到PM3与NFC手机模拟全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
门禁卡复制实战:从M1卡解密到PM3与NFC手机模拟全流程

说到NFC卡片,大多数人第一反应是刷门禁、刷公交、刷饭卡。但你有没有想过,这些天天揣在兜里的IC卡,其实是可以被完整复制出一张来的?我前后折腾过不少门禁卡,从小区单元门到公司工卡,绝大多数都是M1卡(也叫Mifare Classic 1K)。配合一台几百块的PM3读写器,加上手机自带的NFC功能,就能实现读卡、解密、复制甚至写进UID/CUID空白卡里。这篇文章会从原理讲到实操,用最接地气的方式,把复制/破解自家门禁卡的全部流程拆给你看。不管你是手上有卡想备份一张的普通用户,还是想入门RFID/NFC技术的爱好者,这篇都能给你一些实在的东西。

1. 先把卡看明白:M1卡的结构与复制原理

1.1 M1卡的“户口本”:扇区、区块和密钥

很多人第一次接触M1卡,看到dump文件里一堆十六进制数据就头皮发麻。其实把这东西看明白并不难,我用“小区一楼住户”来类比你就懂了。

M1卡(Mifare Classic 1K)内部有1KB的EEPROM存储空间,这1KB被分成了16个扇区(Sector),编号是0到15。每个扇区又分成4个块(Block),每块16字节。其中,每个扇区的最后一个块叫“尾部块”(Trailer),它专门用来存放该扇区的密钥A、密钥B和访问控制位。而扇区0的第一个块,也就是整个卡片的第0块,比较特殊,它存的是厂商信息,包括4字节的UID(卡片唯一序列号)、厂商代码等。

我常用的一个类比是:整个卡片像一栋16层的公寓楼,每层4户,其中每层最后一户是“物业办公室”,负责保管这层楼的门禁密码。密钥A就是单元门钥匙,密钥B是防火门钥匙,访问控制位则告诉系统“这两把钥匙分别能开哪几扇门”。你手里的门禁卡能不能被复制,核心就看你这栋楼的“物业办公室”用的是不是默认密码。

1.2 为什么绝大多数门禁卡都能复制成功

在RFID/NFC技术圈里,M1卡的安全问题早就是公开的秘密了。它用的是CRYPTO1加密算法,这套算法在2008年前后就被学术界全面破解,市面上几乎所有密钥都能在几秒内被暴力枚举出来。更要命的是,大量门禁系统在发卡时根本就不会去修改默认密钥。

我在实际读卡过程中统计过,小区门禁、老旧写字楼、甚至某些酒店的房卡,有相当高比例还在用出厂默认密钥。常见的默认密钥就那么几个:全F(FFFFFFFFFFFF)、全0(000000000000)、以及A0A1A2A3A4A5、AABBCCDDEEFF、4D494B...等等。有些厂家偷懒,所有扇区都用一个密钥;有的稍微好点,A密钥用默认值,B密钥也用默认值,等于没设防。

如果说卡片物理结构是“楼”,那密钥就是“门锁”。绝大多数门禁卡片的问题不是锁太差,而是压根没锁——十个扇区有八个扇区用的是出厂钥匙,你说复制它难不难?这也是为什么我始终强调:这篇文章教的复制换卡方法,仅适用于你自己名下、有使用授权的门禁卡,本质上是给自己做一把备用钥匙,而不是去搞什么旁门左道。

2. 工具清单:PM3选型、手机NFC和空白卡

2.1 Proxmark3设备与冰人固件建议

想做门禁卡的深度读写,PM3是这个圈子绕不开的利器。Proxmark3(简称PM3)是一块开源的RFID研究开发板,支持从低频125kHz到高频13.56MHz的几乎所有非接触式卡。编程器版本从最早的原版、到后来各种魔改版、再到现在的易碎瑞(Easy)版,价格在一两百到上千元不等。

如果你是纯为了复制自家门禁卡,建议直接买最常见的“PM3 Easy”版本,也就是那款蓝色或者黑色的板子,配一个高频天线。到手后第一件事就是刷固件。圈内最流行的是“冰人固件”(Iceman Firmware),它把大量的命令行操作封装成了自动化脚本,尤其是autopwn这类功能,对新手极其友好。你搜“pm3 256k 冰人固件”时看到那个“256k”指的是板载Flash容量,一般买256KB Flash版本的够了,不用追求512KB。

说实话,PM3的入门门槛不在硬件,而在命令行操作。刚拿到手你会发现,这东西不像家电一样插上就亮。它需要依赖电脑驱动、连接客户端、选择设备类型,所有操作都靠敲命令完成。但这条学习曲线是值得的,因为PM3能干的事远不止复制一张M1卡,低频ID卡、身份证件的信息读取、各种逻辑加密卡的研究,它都能做。

2.2 手机NFC与读卡App怎么选

手机NFC在这里有两个角色:一是当读卡器,二是当模拟卡。先说读卡器。Android手机因为NFC权限开放,基本都能直接当读卡器用,配合App就能读取M1卡的扇区数据。iOS这边就比较尴尬,系统对NFC的限制比较多,虽然iOS 14以后开放了标签读取,但完整的M1扇区读写、特别是写卡功能,在原生iOS上几乎做不到,一般要配合特定硬件或者越狱环境。

Android端我常用的App有两个。第一个是Mifare Classic Tool(简称MCT),它轻量、专注、能把密钥字典跑一遍然后读出扇区数据,直接生成dump文件。第二个是NFC Reader Tool,这个App功能更全面,能读能写还能模拟,不少做门禁卡备份的人都用它。网上有“nfc reader tool电脑版”的说法,其实那个所谓电脑版,大多是Android模拟器跑同一个App,真要在电脑上干活,还是得靠PM3的Windows客户端来得利索,手机App更适合外出时快速应急。

还要提醒一点:手机读卡能力受限于NFC天线位置。绝大多数手机NFC线圈在摄像头附近,如果你发现App一直扫不到卡,把卡贴着手机背部上半部分旋转一下位置,再慢慢移动,通常能找到一个信号最强的点。别刚贴上去两秒就急着挪走,读M1卡是个持续通信的过程,手一抖就断开了。

2.3 空白卡买哪种:UID/CUID/UFUID的区别

工具备齐后,还得准备几张可写卡。这地方特别容易买错,我见过不少人买了普通M1空白卡,结果发现0扇区改不了,只能对着数据干瞪眼。按复制需求,市面上可写卡主要分三类。

第一类是UID卡,也叫“可写UID卡”。它允许你修改0扇区0块的UID,这是最早期的破解卡。缺点是它的UID修改通过特殊命令完成,跟原厂M1卡存在一些底层行为差异,有些高级门禁系统能识别出来。

第二类是CUID卡,这是我用得最多的一种。它同样可以修改UID,但对M1标准读写的兼容性好,你可以像写普通M1卡一样直接访问0扇区,不需要额外命令。复制成功率比UID卡高不少,价格也就贵几毛钱一张,性价比极高。

第三类是UFUID卡,严格说它是一款带“锁”的可写卡。出厂时它是一张CUID卡,可以自由读写;当你用特定指令把“锁死位”处理掉之后,它就变成一张无法再改动UID的普通M1卡,用来模拟原厂卡的行为特性。但要注意,这个锁死动作是不可逆的,操作前一定要确认数据已写对。

3. PM3实战:快速解密和完整读卡

3.1 连接PM3与卡型探测

拿到PM3后的第一件事,把设备插进电脑USB口,装上驱动。Windows下如果设备管理器里显示的是未知设备,一般需要手动装一遍Zadig的WinUSB驱动。Linux或macOS下通常直接识别,但可能要给设备添加一个udev规则。装好驱动后,打开客户端界面,你会看到一个命令行终端。连接板子的操作是执行hw connect,如果返回类似“Connected”的提示说明板子握手成功,然后执行hw tune测试天线。正常情况下,把卡放到天线感应区,执行hw detecthf search,客户端会自动识别出卡片的型号和协议类型。

这个探测步骤很重要,别跳过。因为门禁卡不一定都是M1卡,有的老小区用的是125kHz的低频ID卡,有的是T5577卡,还有的是二代身份证那种CPU卡。PM3做得好的地方就是它一张板子通吃低频和高频,但你得先知道对面是什么卡才能选对操作命令。hf search跑完,如果看到“MIFARE Classic 1K”这一行,恭喜你,这就是最经典的M1卡,后面所有操作都顺畅了。

3.2 自动破解:autopwn的简便用法

冰人固件最让人上瘾的功能就是hf mf autopwn这条命令。以前读一张加密M1卡,你要先一个一个扇区试密钥,还要处理嵌套认证,流程繁琐得能劝退新手。而现在,一条命令基本全自动搞定。

执行命令前,把卡放在天线感应区,输入hf mf autopwn,回车。随后客户端会自动进行密钥枚举、嵌套攻击、密钥解析,把16个扇区中所有能拿到密钥的扇区逐个破解,最后自动保存一个dump文件。整个流程快的话几秒钟,慢的话十几秒,取决于卡里有多少个扇区设了非默认密钥。

我实测过一张小区门禁卡,默认密钥覆盖了12个扇区,剩下4个扇区用的密钥也很快被嵌套攻击挖了出来。autopwn跑完后,终端会打印出每个扇区的密钥情况,以及一个保存的dump文件路径。你可以用hf mf dump这条命令更规范地把全卡数据以dump格式保存下来,生成的文件名一般类似hf-mf-BD123456-dump.bin,其中BD123456就是这张卡的UID。

很多资料会教你手动执行“破解密钥-读数据-保存转储”三步教学,但既然固件提供了自动功能,我建议新手先把这条命令用顺,再去研究背后的嵌套攻击原理。

3.3 密钥库与密钥字典:keys文件起什么作用

autopwn之所以能高效破解M1卡,除了算法本身有漏洞,还因为圈内积累了庞大的密钥字典。冰人固件里通常附带一份keys字典文件,保存在客户端目录下的hf-mf-...keys文件里。它本质是一个文本文件,每一行放一个16进制密钥,比如FFFFFFFFFFFFA0A1A2A3A4A5等。每次autopwn发起攻击时,会先拿这份字典里的密钥尝试认证所有扇区,命中了就不需要再做暴力破解。

所以你可以手动往keys文件里添加自己收集到的密钥,扩充字典。有些门禁系统特别喜欢用卡号反推出来的密钥,或者用一些厂商默认密钥,这些靠人工枚举很难想到,但字典里往往早就收录了。你如果经常帮朋友处理不同小区的卡,把自己见过的每个密钥都追加到keys文件里,后续再遇到类似的卡破解速度会快得离谱。

我在网上也见过有人分享体积特别大的keys库,几千甚至几万条密钥都有。但说实话,M1卡每个扇区通常就两个密钥,对于一个标准门禁应用,默认密钥加上几个常见厂家的密钥基本就够了,没必要追求几百MB的字典,纯属浪费CPU时间。关键是理解密钥库的逻辑:它是用来减少暴力破解范围的,不是看数字大。

3.4 备份dump:数据完整保存的重要性

读卡操作完成后,你手里有了一份完整的dump文件。这里面不仅包含门禁系统的扇区数据,还可能记录了卡号、楼层权限、有效期等关键信息。我建议你立刻把这份dump文件多做几个备份,分别存在电脑和云盘里。原因很简单:空白卡有概率损坏,写卡操作可能失败,一旦卡搞废了,你还能靠这份备份再写一张新卡,不用再把原卡掏出来重新读。

打开dump文件你看到的是4KB的纯hex数据,没有规律,但这不代表它没意义。以我部门某张门禁卡为例,数据区块里有个扇区存的就是进门权限码,另一个扇区存的是部门编号和姓名编码。某些系统只校验UID,那就是最简单的场景;有些系统连扇区里的业务数据一并校验,那就必须保证写入的数据和原卡一致,差一个字节都不行。所以对于dump文件,原则就是:完整保留,不要自作聪明修改任何数据。

如果你感兴趣,可以用MCT这类App把dump文件导到手机里,随时在小区楼下读取原卡比对一下,看有没有变化。有些系统会在后台定期改写卡里某个字段,这个字段一变,你的复制卡可能就失效了。

4. 手机NFC实战:读卡与一键模拟

4.1 用手机直接读M1卡:MCT快速上手

不是所有场景都需要掏PM3。当你只是想把一张M1卡数据读出来看看,或者临时确认某个卡片的扇区结构,手机App就够了。Android上装好MCT,把卡贴到手机背面,App会自动识别到卡片并弹出“是否读取标签”的提示。点击读取后,MCT会先用它内置的密钥字典尝试逐个扇区解密,解密成功的扇区会显示为绿色,失败的显示为红色。

这里有个技巧:MCT默认只带了几组常见密钥,如果你发现某些扇区是红色,别以为卡就加密得很厉害。你可以在设置里导入一份更大的密钥字典,或者用“暴力破解”模式,配合卡上已知的某个扇区密钥,继续做嵌套攻击。很多人在手机上折腾很久破解不了的卡,其实密钥也是简单得很,只是字典里没有而已。

MCT读取成功后,点击保存,它会生成一个.mct格式的转储文件。这个文件本质上就是dump数据,PM3或其它工具都能识别。所以如果你在外面出差,手头没带PM3,完全可以靠一部Android手机先把卡数据读出来,回家再导入PM3里写卡。

4.2 用PM3把存档写入UID/CUID卡

读取数据是为了写卡。当你手里有一份完整dump文件,和一张CUID空白卡后,写卡操作就很简单了。把空白卡放到PM3天线区,先执行hf mf restore命令,它会提示你输入dump文件路径。回车后,PM3会自动把dump里的所有扇区数据写入空白卡。这个过程包括写入UID、数据和密钥,一步到位。

如果你用的是CUID卡,可能会遇到写入0扇区失败的情况。不用慌,这是正常现象——0扇区0块中包含UID,普通M1写命令是不允许修改UID的。CUID卡额外支持一条命令叫hf mf csetuid,用法是先指定一个4字节UID,再带上对应的dump数据文件。执行后,CUID卡会被设置成新的UID,然后你再执行hf mf restore,把它余下的扇区数据写完。整个过程如果提示全部扇区写入成功,这张复制卡就算是做成了。

还有一种是hf mf cwipe,用于清空CUID卡,把卡恢复成出厂状态。建议每张新卡到手后先做一次cwipe,再写数据,避免卡里残留一些莫名其妙的数据干扰写入。

4.3 把门禁卡模拟进手机:HCE与软卡方案

既然手机有NFC功能,很多人就会问:能不能干脆别带卡了,直接刷手机?答案是可以,但附带条件。

Android上最常见的方案是用NFC Card Emulator这类App,加载你的dump文件,把手机模拟成一张M1卡。它使用的是HCE(Host-based Card Emulation,主机卡模拟)机制。你打开App,选择对应的dump文件,开启模拟,然后把手机NFC区域贴近门禁读卡器,门禁就有概率成功开锁。

但这里有个残酷的真相:门禁读卡器和手机NFC之间的通信,本质上走的还是ISO 14443协议,但HCE模式在射频层面的响应时序和硬件卡有差异,尤其是M1卡这种带加密认证的卡,手机HCE的表现并不稳定。我实测过几台不同品牌手机,有的手机能顺利模拟,有的手机响应延迟太高,门禁一直提示“认证失败”。

如果你的手机是旗舰阵营里NFC做得好的那几款,并且门禁系统不挑时序,这个方案可以当备用。但我不建议彻底扔掉物理卡。更靠谱的折中方案是买一个NFC卡贴,把CUID卡的数据写进卡贴,贴在手机壳里,既有了手机的便携性,又保留了实体卡的射频性能。

还有个小众方向叫“中继攻击”,就是拿一个设备在门口读取卡片,另一个设备随身携带模拟响应,实现远距离开门。这个技术方向上有人做研究,但对普通门禁备份场景来说完全没用,而且容易踩到合规红线,咱们知道有这么个概念就行,别真去搞。

5. UID卡、CUID卡、UFUID卡:到底怎么选

5.1 三种卡的核心差异对比

说实话,这个选择问题几乎每周都有人在群里问。我直接放一张对照表,你们看得更明白。

卡片类型是否可改UID与M1标准指令兼容性是否可锁死适合场景
UID卡一般,部分功能依赖特殊命令低成本复制、研究测试
CUID卡好,几乎完全兼容日常备份、门禁复制主力
UFUID卡是(可锁死)需要模拟原厂卡行为的场景

这张表背后藏着的逻辑是:UID卡虽然便宜,但很多门禁读卡器在识别UID卡时会有怪异行为,比如读卡慢、响应异常。原因在于UID卡修改UID的方式是“绕过”标准协议的,它在内部状态机上跟真正的M1卡不太一样。而CUID卡在芯片层面做了兼容处理,直接响应标准读写指令,所以门禁读卡器根本分辨不出它和原卡的区别。UFUID则更像是CUID的“升级款”,多了一个一次性熔断的锁死功能。

5.2 实战选卡建议:不同门禁场景怎么选

我个人的经验是:预算不是问题,直接上CUID卡。一张卡也就一两块钱,多买几张备用完全没压力。如果你要复制的门禁系统比较老旧,对卡片兼容性要求不高,那用UID卡也能跑;但如果你生活在新建小区,门禁读卡器是最近两年装的,我强烈建议用CUID,省得写好了卡到门口刷不开,还要回来重新折腾。

举个我踩过的坑:我最初为了省钱买了一板UID卡,写好后在小区单元门刷,十次有八次没反应,偶尔一两次能开但明显感觉读卡器要“想”很久。后来换了CUID卡,同样的数据写进去,刷一下门就开了,那叫一个利索。自此之后,我再也没买过纯UID卡。

UFUID卡适合那些“担心系统查复制卡”的场景。比如某些单位用的门禁系统会轮询卡片的话,看你手里的卡是不是原厂卡。UFUID锁死后呈现的行为和原厂M1卡几乎没有差异,能有效降低被系统标记的风险。但说实话,普通家庭门禁根本没有这层防护,UFUID有点多余。它更多是给喜欢折腾硬件的玩家准备的。

6. 实战中的坑:常见问题与排查

6.1 手机读不出卡片数据怎么办

这个问题排在求助榜第一位。我的排查顺序是:先确认卡的协议类型。如果这张卡是M1卡,手机读不到大概率是NFC天线位置没对好,或者系统NFC开关没开。打开系统设置确认NFC功能已开启,然后把卡贴着手机背面缓慢移动,找到信号最强的位置。如果还不行,换一个App试试,比如NFC Reader Tool和MCT轮着来,有的App对某些厂商RF芯片适配确实差一些。

另一种情况是卡确实不是M1,而是CPU卡或NFC Type B卡,普通手机读卡器根本读不了。这时候只能靠PM3进一步确认卡型,然后对症下药。

顺带提一下“nfc圆形天线设计工具”这个词。这其实是给设计PCB天线或NFC线圈的工程师用的东西,网上有些App或网页小工具能帮你快速计算圆形天线的电感值和匹配电容。跟普通用户复制门禁卡一点关系没有,如果你在教程里看到这个词,大概率是对方在讲硬件开发,不用管它。

6.2 PM3连不上电脑或读卡失败

PM3连不上电脑多半是驱动问题。Windows下用Zadig重新装一遍WinUSB驱动基本能解决。Linux下如果插上没反应,先执行dmesg | tail看有没有设备挂载日志,没有的话换根数据线试试——PM3的USB口是Mini USB,线材质量差会导致供电不足,进而设备反复掉线。

读卡失败则要分情况。如果hf search没有任何输出,检查天线是否插牢、卡片是否在感应区。有些PM3 Easy版配的天线感应范围很小,卡片必须放在线圈正中央,偏一点都可能读不到。另外就是别把卡放在金属桌面上测试,金属会吸收射频能量,导致信号强度不够。

6.3 写卡成功但门禁不识别

这问题是所有复制门禁卡的人最崩溃的时刻,数据明明全写进去了,门禁就是没反应。我总结经验,90%的情况是UID没写对。很多人用hf mf restore写完发现0扇区是错的,然后又去修改数据,结果改坏了。正确做法是用CUID卡配合hf mf csetuid先把UID设定好,再补写其它扇区。

还有一种常见原因是数据不完整。有些门禁卡的核心数据藏在扇区15里,如果autopwn过程中有扇区破解失败,dump文件里就会留空白或错误数据,写出来的卡自然不好使。这种情况只能回到PM3,针对那几个失败的扇区做嵌套攻击,直到把所有扇区密钥全部拿到,再重新dump一次。

6.4 门禁系统升级后卡被“锁”住了怎么办

有些新建小区门禁系统会定期升级,升级后你会发现之前好用的复制卡突然刷不开了,但原卡还是好的。不必紧张,这不一定是系统识别了你用复制卡,更可能是它在后台改写了卡内某个数据字段。你带上原卡重新读一次,对比之前的dump,找出变化的位置,把新数据写到复制卡里,一般就能恢复。

如果连原卡都被系统禁用,那大概率是物业管理端主动拉黑了这张卡,这种情况外部的复制技术解决不了,只能拿有效证件去找物业登记补卡。所以我也一直强调,复制门禁卡是为了备份自用,不要用它去挑战物业规则,更不要拿去复制别人的门禁卡。

7. 我总结的几条实操心得

折腾NFC门禁卡几年下来,有几个心得想分享给后来人。

第一,PM3和手机App不是二选一的关系。手机NFC方便快捷,适合读卡和简单的卡模拟;PM3功能全面,适合深度破解和高精度写卡。两样都备着,互通有无,才是最佳组合。

第二,CUID卡永远是省心的代名词。虽然它比UID卡贵几毛钱,但省下来的调试时间和心理损耗,远远超过这点差价。以后有人问我买什么卡,我的答案永远是CUID优先。

第三,把数据备份当成习惯。每一张你成功读出来的卡,都在电脑里存一份带日期的dump文件。别看现在卡用得好好的,哪天原卡丢了,你翻出备份就能立刻补一张,那种从从容容的感觉,比什么都踏实。

最后要说的是分寸。NFC和RFID技术本身没有好坏,PM3、M1、CUID这些工具和卡片都是中性的。这篇文章的核心是让你能用技术手段管理好自己名下的门禁凭证,做一张备用卡,省去忘带卡的烦恼。但如果你想靠这套东西去复制别人的卡、逃费进门或者做别的没边的事,那我劝你趁早收手。技术是把工具,拿它来方便自己可以,拿它去钻空子,迟早是要还的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 12:34:54

土壤湿度传感器上位机系统

土壤湿度传感器上位机系统 一、项目概述 本项目是一个基于 C# WinForms 开发的土壤湿度传感器数据采集上位机系统。系统通过串口(SerialPort)与土壤湿度传感器进行通信,采用 Modbus RTU 协议读取传感器保持寄存器中的数据,并将解析…

作者头像 李华
网站建设 2026/9/24 12:34:52

无ST-LINK也能烧录STM32:USB DFU模式详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 12:33:45

用Clang在Windows上交叉编译ARM Linux程序(告别GCC实战)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 12:33:30

从零打造开源游戏掌机:硬件选型、软件栈与端侧AI部署实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 12:31:35

GaN快充批量失效元凶:X电容放电芯片可靠性剖析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 12:30:42

异常断电导致硬盘逻辑崩溃的原理与抢救指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华