首页
社区
课程
招聘
[原创]利用内存搜索针对WMI查询硬件信息修改内核内存中的序列号、UID
发表于: 11小时前 205

[原创]利用内存搜索针对WMI查询硬件信息修改内核内存中的序列号、UID

11小时前
205

论坛前辈的文章:
获得并修改硬件序列号--CPU、主板、内存、硬盘等(有源码)
关于硬盘部分,通过Hook派遣函数或者直接修改内核中序列号所在的地址的值。应用层查询时,对于访问了被修改地址的查询语句的效果是会显示随机序列号。如使用:

进行查询时:

硬盘序列号确实变为随机序列号了,但是对于使用下列语句进行查询:

或者等效语句进行查询时:


查询结果依然是我们原本的硬盘序列号,因为下方查询语句并没有访问驱动中修改了序列号的内存地址,下方查询语句的序列号访问的是wchar_t* 类型的地址,UID访问的是char* 类型的地址。UID的结构为eui.固定字符串加上序列号去掉下划线组成。所以可以使用序列号与UID相互校验,或者不同查询语句获取到的序列号结果相互校验。本文并不解析该查询语句是通过内核中的哪个全局变量哪个结构获取到的序列号和UID,毕竟没有必要去定位那么多全局变量和结构偏移。

在虚拟机中,直接使用CE搜索硬盘原序列号,注意切换UTF-16选项,不管是char* 类型的地址还是wchar_t* 类型的地址都可以搜索到比较多的结果。


我们查询到的序列号肯定来源于其中某一个内存地址,我们只需要获取到所有保存了序列号的内存地址,再进行序列号修改即可。因为在有独显的物理机中,用CE直接搜索硬盘序列号都会导致D3D11设备被移除,显卡驱动崩溃,具体现象就是搜索到MiVaSystemPtes所在区域时电脑短暂黑屏。经过测试我们只需要搜索[MiVaSystemCache, MiVaNonPagedPool, MiVaPagedPool]即可修改针对前述语句的查询结果,修改序列号切记除char* 类型外还需要拓展为wchar_t* 类型进行搜索。所以千万不要想着直接搜索整个内核内存,针对内核分区进行搜索是必要的。建议先采用虚拟机进行测试。
所以我们只需要写一个内核内存搜索函数就行。参考论坛前辈的文章:
win10 1909逆向(反向计算windows内核内存布局及代码实现)
我们就得到了当前虚拟机的内存分区:


为了搜索的效率,MiVaUnused的内存块我们就不需要搜索了,当然你也可以根据CE搜索到的结果,看对应内核内存地址分别在哪几个内存区域,然后只搜索对应的几个区域即可。你可以申请一片中转内存,使用MmCopyMemory函数,函数自带异常处理可以应对被搜索的内存没有物理页的问题,另外还需要处理内存跨页的问题。方法不止一种你可以自己测试效率后择优选择。


驱动修改完搜索到的地址后,不同语句查询的序列号一致,可以与UID相互校验。
需要注意的是如果使用了:

或类似语句重启了WMI服务,部分查询语句短时间内会无查询结果,通常十分钟左右才会恢复。
上述需求AI都可以给出较为完善的代码。
这里只说明了硬盘序列号与UID,其余硬件信息都可以用同样的方式进行动态修改,卸载驱动后还原。

# powershell
Get-WmiObject -Class Win32_DiskDrive | Select-Object Model, SerialNumber, Signature
# powershell
Get-WmiObject -Class Win32_DiskDrive | Select-Object Model, SerialNumber, Signature
# powershell
Get-PhysicalDisk | Select-Object FriendlyName, SerialNumber, UniqueId
# powershell

传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 9
支持
分享
最新回复 (4)
雪    币: 221
活跃值: (3171)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
谢谢分享!!!
10小时前
0
雪    币: 2748
活跃值: (6258)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
牛逼牛逼牛逼
9小时前
0
雪    币: 11667
活跃值: (3379)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
严重学习
9小时前
0
雪    币: 121
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
mark
3小时前
0
游客
登录 | 注册 方可回帖
返回