前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何从Windows注册表中提取证书

如何从Windows注册表中提取证书

作者头像
FB客服
发布2021-10-11 16:06:50
1.6K0
发布2021-10-11 16:06:50
举报
文章被收录于专栏:FreeBuf

Windows 注册表中包含有二进制块(Blob),有些二进制块用于存储证书,如下所示:

以下的注册表位置都存储证书:

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates
HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates

证书通过 DER格式进行编码,总是以 0x30 为开始。但可以发现,在注册表中找到的二进制块并非以 0x30 开头,这是因为证书前缀存储了一些元数据。搜索 0x30 即可找到证书的位置:

并非所有以 0x30 开头的字节序列都是有效的证书。从 0x30 8 开始搜索,提取该字节序列直到二进制块的结尾找到了该证书。

该方法并不精确,通过查看几个二进制块可以发现:每个证书都以 4 字节为前缀,这些字节对证书的长度进行编码(小端序),然后此长度字段以不变的 8 字节为前缀:20 00 00 00 01 00 00 00。

看起来像是 TLV的格式,每个证书的类型都是 20 00 00 00 01 00 00 00。工具 format-bytes.py是解析二进制数据的工具,可用于解析 TLV 记录,如下所示:

<QI<表示小端序,Q表示 unsigned long long(8 字节),I表示 unsigned int(4字节)。t:0意味着类型字段是第一个字段。l:1意味着长度字段是第二个字段。

可以看出,该二进制块包含 11 个 TLV 记录,最后一个长度为 1239,并且包含证书类型 0x100000020L。

进一步的研究表明,类型字段实际上由两个字段组成:属性标识符字段与保留字段,均为四个字节。属性标识符的可能值可以在 Windows 开发中心和 wincrypt.h 头文件中找到。

这意味着二进制块内的 TLV 记录可以使用 format-bytes.py -f “tlv=f:<III,t:0,l:2” blob.bin进行解析:

例如,记录 5 的类型为 0x0b 代表是 CERT_FRIENDLY_NAME_PROP_ID

如上图所示,包含 UTF16 编码的发行者名称。如下所示,证书本身位于记录 11 内(类型为 0x20):

要提取证书请使用 -d执行二进制 dump 并写入本地文件:

结论

二进制数据块中经常出现 TLV 记录,如果想要识别二进制块中的数据,请多比较几个示例可能就会发现定义的模式。证书与元数据一起存储在注册表中,元数据结构为 TrLV 记录。证书本身存储在记录内部,类型为 0x20。

参考来源:

https://blog.nviso.eu/2019/08/28/extracting-certificates-from-the-windows-registry/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结论
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档