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

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

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

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

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

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

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

  • 值得顺便一提的是,一般编译器在编译整个程序的时候,会把字符串常量都安排到了一起。所以在紧随其后的内存里(图-3),甚者还能看到“CryptAquireContext failed: %d” 等字样。

图-4 断点1 Procmon截图1

图-5 断点1 Procmon截图2

Procmon 记录的内容:

如上【图-4】和【图-5】,此断点区间记录到的事件主要为加载实例主程序 exe 文件和 Windows 操作系统内的诸多核心系统库、扩展库和安全库,以及相关注册表键值,比如:

  • 【ntdll.dllkernel32.dllkernelbase.dll】 都是 Windows 操作系统的核心库,它们提供了操作系统级别的功能和服务,由开发人员间接使用,因为更高级别的 API 和库会在其基础上构建。
  • 【wow64.dll,wow64win.dll,wow64log.dll,wow64cpu.dll】,这几个DLL,看名字应该大致就可以猜出来是为了确保32位应用程序能够在64位系统上顺利运行。
  • 【advapi32.dll】 包含了一系列的函数和服务,用于处理操作系统的安全性、认证、授权、加密、注册表、事件日志、服务控制和其他系统管理任务。
  • 【msvcrt.dll】 是 Microsoft C Runtime Library 的一部分,它是 Microsoft Visual C/C++ 运行时库的动态链接库文件(DLL),其中 rt 就是 Runtime 的缩写。这个库提供了一系列的C语言运行时函数和宏,用于支持C/C++编程语言的基本功能。包括最常用的输入输出(I/O)、内存管理、字符串处理、数学运算、时间和日期函数等。
  • 【sechost.dll】 是 Windows 安全主机服务(Security Host Service),负责管理和支持操作系统的安全功能,包括身份验证、授权、加密、凭据管理和安全策略等。
  • 【rpcrt4.dll】 这个库提供了与远程过程调用(RPC,Remote Procedure Call)相关的函数和服务。
  • 【vcruntime140d.dll 和 ucrtbased.dll】 都是 【Visual Studio 2015 的 Microsoft Visual C++ 可再发行组件】的一部分。这些 DLL 文件包含了与 Visual C++ 2015 相关的运行时库函数和支持。其名称最后部分字母 d,或者 based,都表明了其是被用于 debug 版本可执行文件加载的。

此外还记录到例程读取了一些相关注册表配置用于初始化,比如:

  • 【HKLM\System\CurrentControlSet\Control\Session Manager】 是注册表中的一个关键路径,包含了一系列与系统启动、进程管理、服务控制和系统设置等相关的配置信息。下图-6 就是存储系统环境变量的路径。看到后是不是有种豁然开悟的感觉?

图-6 注册表存储系统环境变量的路径

  • 【HKLM\SOFTWARE\Policies\Microsoft\Windows】 路径下存储了 Windows 操作系统的一些策略设置。这些策略设置可以用于配置和管理计算机上的各种行为和功能,以增强系统的安全性、隐私性和管理性。

图-7 HKLM下的 Windows 策略设置及其子项

综合以上内容,可以看出在此区间,应用程序主要涉及到系统初始化、配置、远程过程调用、C/C++ 编程支持、系统安全性和权限管理等方面的操作。

断点2: 执行到 CryptGenKey 之前

图-8 断点2 堆栈截图

在程序堆栈层面,

可以观察到 CSP 句柄已经被成功赋值。

图-9 断点2 Procmon截图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 执行完加密函数的堆栈截图

在程序堆栈层面:

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
img

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

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-vsHf3dF8-1713660283336)]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值