大家都知道很多Anti Cheat会封硬件序列号,所以本文探索一下如何get and modify序列号。
这个服务是比较贵的:
于是有了研究一下的想法。
思路:
1. 通过厂商自带的程序刷新固件。
2. 自己写驱动修改。
思路1不讨论,要拿到厂商去修改,很不方便。这里重点讨论思路2。
思路2是通过修改SMBIOS表,有两种方法,一种需要开机自启动,一种不需要,后面会介绍。
SMBIOS:
SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。
而DMI(Desktop Management Interface, DMI) 就是帮助收集电脑系统信息的管理系统。
DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行。
两种方法都需要解析SMBIOS。
一、先介绍不需要重启的方法:
1.从物理内存 0x000F0000-0x000FFFFF 之间寻找关键字 “ _SM_” 。
2.找到后再向后16个字节,看后面5个BYTE是否是关键字“_DMI_”,如果是,EPS表即找到。
EPS表结构中16H以及18H处,得出数据表长度和数据表地址,即可通过地址访问 SMBIOS 数据结构表。
SMBIOS表结构由头和体组成,其中头的结构定义如下:
体的结构由头的TYPE字段决定,如下:
其中TYPE 0结构是BIOS information,TYPE 1结构是SYSTEM Information,其它类型大家查阅我附件里的文档。
总之是依据文档标准去解析。这里给出关键代码:
从而找到EPS和SMBIOS表。然后修改SMBIOS表中的字段。
这样可以修改CPU、主板、内存、硬盘序列号。
由于篇幅关系,先介绍到这里,具体代码见附件:GetSMBiosRing0.zip。
效果如下:
图右侧显示BIOS模式为"传统",代表BIOS,非UEFI。
二、再介绍需要重启的方法:
1.
先是想注册回调来修改,通过NtSetSystemInformation函数的
SystemRegisterFirmwareTableInformationHandler,见下面的WRK代码:
编写代码:
发现ntStatus没有成功,返回STATUS_OBJECT_NAME_EXISTS,对象已经存在。
于是尝试先删除已经存在的,TableHandler.Register设置为FALSE:
发现还是删除不了Raw SMBIOS,第一次funZwSetSystemInfomation返回STATUS_INVALID_PARAMETER,
第二次返回STATUS_OBJECT_NAME_EXISTS。
然后查看上面ZwSetSystemInfomation对SystemRegisterFirmwareTableInformationHandler的处理
代码如下:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2024-8-9 16:53
被yirucandy编辑
,原因: