轻松看懂的加解密系列(1)番外篇I:用Procmon监视一次AES加解密全过程(1)

Procmon 记录的内容:

Cryptographic Service Provider (CSP) 是用于提供加密和解密功能的组件,cryptsp.dll 是其一部分。可以看到程序在执行 CryptAcquireContext 的时候,首先尝试在其执行目录中搜索cryptsp.dll。如果此时恰好有名称为 cryptsp.dll 的文件在此,它将首先被加载。本例实际执行当中,由于 cryptsp.dll 是 Windows 操作系统的一个核心系统文件,一般不会位于应用程序执行目录,所以 Result 为 NAME NOT FOUND,接着程序按照默认的动态链接库加载顺序,顺位到系统目录继续搜索。由于例程是一个运行在64位系统上的32位程序,所以顺利地在 【C:\Windows\SysWOW64\cryptsp.dll】 下完成了加载。

在这里特别要说明,很多恶意软件正是利用了默认的动态链接库加载顺序,将篡改过的同名DLL设法置于应用程序的执行目录,让应用程序误加载,从而代替真正的系统文件来执行其恶意代码。

接下来可以观察到程序开始尝试访问【HKLM\SOFTWARE\WOW6432Node\Microsoft\Cryptography\Defaults\Provider Types\Type 024】

图-10 CSP类型相关注册表键值

之所以目标明确地直接访问 Type 024,是因为我们在源程序里调用 CryptAcquireContext 时选择的 CSP提供类型参数是 PROV_RSA_AES,其被定义在 wincrypt.h 里的序列号正是 24。

// certenrolld_begin – PROV_RSA_*
#define PROV_RSA_FULL 1
#define PROV_RSA_SIG 2
#define PROV_DSS 3
#define PROV_FORTEZZA 4
#define PROV_MS_EXCHANGE 5
#define PROV_SSL 6
#define PROV_RSA_SCHANNEL 12
#define PROV_DSS_DH 13
#define PROV_EC_ECDSA_SIG 14
#define PROV_EC_ECNRA_SIG 15
#define PROV_EC_ECDSA_FULL 16
#define PROV_EC_ECNRA_FULL 17
#define PROV_DH_SCHANNEL 18
#define PROV_SPYRUS_LYNKS 20
#define PROV_RNG 21
#define PROV_INTEL_SEC 22
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define PROV_REPLACE_OWF 23
#define PROV_RSA_AES 24
#endif //(NTDDI_VERSION >= NTDDI_WINXP)

图-11 CSP名称相关注册表键值

由 Type 024 接着映射到了 【Name】 “Microsoft Enhanced RSA and AES Cryptographic Provider”,最后从 【HKLM\SOFTWARE\WOW6432Node\Microsoft\Cryptography\Defaults\Provider\Microsoft Enhanced RSA and AES Cryptographic Provider\Image Path】 取到了能提供对应 CSP 的动态链接库文件 rsaenh.dll。又由于当前运行的系统是64位的,所以重定向的最终目录是 【C:\Windows\SysWOW64\rsaenh.dll,而不是%SystemRoot%\system32\rsaenh.dll】。

这里还有一处细节会是大家日后阅读 Procmon 日志经常遇到的,就是 【Result】 “BUFFER OVERFLOW”,从【图-9】可以看到程序在读取 【Name】 和 【Image Path】 的时候都出现了几次 “BUFFER OVERFLOW”,这一般是因为程序在不知道读取目标字符串长度的情况下,先会尝试设置较短长度缓冲区,如果失败就继续尝试申请更长的缓冲区直至成功读取。并不是程序真正造成了“缓冲区溢出”这样严重的错误。所以我们虽然看不到微软操作系统核心文件的源代码,但根据其行为结果可以大致猜想到其逻辑步骤,并且这也是VC程序常见的一种写法。

【rsaenh.dll】(也称为 Microsoft Enhanced Cryptographic Provider)它提供了加密和解密功能,是 Windows Cryptographic API 的一部分。这个库包括了对称加密、非对称加密、散列算法、数字签名等密码学功能的支持。其中就包括了对 AES 算法的支持。

【bcrypt.dll】 提供了密码学相关的功能和安全服务。包括加密、散列、随机数生成、密钥管理等。

【sspicli.dll】(Security Support Provider Interface Client Library)是 Windows 操作系统的一个核心系统文件,它是 Windows 安全支持提供程序接口(Security Support Provider Interface,SSPI)的一部分。SSPI 是 Windows 提供的一种安全支持架构,用于实现身份验证、加密和安全通信等安全相关的功能。

图-12 断点2 Procmon截图2

在最终关闭注册表键 【HKLM\SOFTWARE\WOW6432Node\Microsoft\Cryptography\Defaults\Provider\Microsoft Enhanced RSA and AES Cryptographic Provider】,执行到下一个断点之前。程序除了继续加载一些必要的 DLL(包括 crypt32.dll, dpapi.dll, cryptbase.dll)之外,最值得注意的操作就是对文件【C:\Users\jiesu\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-1315148102-856555410-3627708698-1001\663ed5f4fe50a280b70b3badd6c59de5_7914d52b-311e-450f-ad30-0ea710e89468】的访问了,详细解释如下:

【crypt32.dll】 是 Windows 操作系统的一个核心系统文件,它提供了与数字证书和加密相关的功能和服务。这个库是 Windows Cryptographic API 的一部分,用于处理数字证书管理、加密、解密、签名和验证等密码学操作。

【dpapi.dll】 是 Windows 操作系统的一个核心系统文件,它是 Data Protection API(DPAPI)的一部分。DPAPI 是一组密码学功能和接口,用于帮助应用程序和系统组件保护和加密敏感数据。

【cryptbase.dll】 是 Windows 操作系统的一个核心系统文件,它是 Cryptographic Base API 的一部分。这个库提供了密码学相关的基本功能和接口,用于支持高级密码学服务和应用程序。

以【图-12】中的路径【C:\Users\jiesu\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-1315148102-856555410-3627708698-1001】为例,每个用户都有一个类似的目录,用于存放加解密相关的文件,比如默认和自定义的密钥容器文件。其中路径的最后一段正是当前用户在系统中唯一的 SID。而目录下的【663ed5f4fe50a280b70b3badd6c59de5_7914d52b-311e-450f-ad30-0ea710e89468】这一文件,理论上应该是程序在调用获取CSP接口时所用到的默认密钥容器文件。

笔者曾经做过测试,如果强行用管理员权限在执行本测试程序前删除掉此文件,将会因为无法创建目标 CSP 导致程序执行失败。而产品级软件,在面对即使删除了相关文件时,也会自动再次生成。这些软件究竟是如何做到的,后续系列文章会给予更多相关讲解,敬请期待。

断点3:执行到 CryptEncrypt 之前

图-13 执行加密函数之前的堆栈截图

在程序堆栈层面,可以观察到以下几点:
  • 上一步生成的密钥句柄【hKey】将被传入加密函数 CryptEncrypt
  • 【*ppEncryptedData】在加密前指向地址【0x007D9718】,此地址所指向的缓冲区在加密结束后将存入被加密的密文;
  • 【*pEncryptedDataLen】通过计算,首轮设置的长度为30;
Procmon 记录的内容:

图-14 产生密钥过程中 Procmon 所记录的注册表读取

图-15 产生密钥过程中的注册表读取路径

可以看到从产生密钥至加密函数被执行之前,仅有少量的读取 Key Provider 的注册表操作事件被记录到。这从另一个侧面反映了程序在完成一个加密工作所必要的“资源”都已经加载完毕了,包括文件加载、进程和线程创建、配置读取等初始化工作。接下来最主要的就是程序运算执行了,而 Procmon 并不善于监控程序的运算。其中 Result 【REPARSE】是一种系统读取注册表的重定向结果,并不是什么错误。

断点4:执行完加密函数 CryptEncrypt

图-16 执行完加密函数的堆栈截图

在程序堆栈层面:
  • 可以观察到之前存放明文的缓冲区已经被密文替换;
  • 密文的长度为16,所以之前预留的长度30是足够的,所以没有出现 ERROR_MORE_DATA;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

ttps://img-blog.csdnimg.cn/b07abbfab1fd4edc800d7db3eabb956e.png)

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-zJFEmsso-1712652965859)]

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值