Covenant C2源码调试分析-Grunt
在上篇Covenant创建Launcher时,我们就获取到了Grunt的源码。本篇我们来调试一下Grunt的源码,了解其工作过程。
Grunt工作流程
经过我前期的调试大概了解了一下Grunt的主要工作内容,因为Covenant使用的是非堆成加密,所以Grunt的主要工作就是先进行密钥的交换进行身份验证,然后加载ExecuteStage。
通信过程如下图:
源码分析
Grunt身份验证密钥交换过程分为Stage0、Stage1、Stage2三个步骤。三个步骤的通信内容如下:
- Stage0:Client提交Rsa密钥,Server使用Rsa密钥加密下发协商密钥
- Stage1:Client使用协商密钥加密挑战密钥C1发起身份验证请求,Server使用协商密钥加密返回挑战密钥C1+C2
- Stage2:Client使用协商密钥加密挑战密钥C2,Server解密后验证C2一致则完成认证,返回ExecuteStage
Stage0:
将预设的共享密钥是作为AESKEY
使用共享密钥加密RSA密钥,发送给服务器
揭秘获得RSA密钥,并创建协商密钥
使用RSA密钥加密协商密钥,发送给客户端
客户端收到后解密,获取协商密钥将其作为AES加密密钥
Stage1:
客户端使用协商密钥加密4位挑战密钥发送给服务器
服务器收到挑战密钥1后新增挑战密钥2,将1、2密钥拼接发送客户端,进行身份认证
Stage2:
客户端收到回复后解密信息,验证密钥1是否一致,将挑战密钥2发送给服务器,进行身份认证
服务器收到客户端挑战密钥2后进行验证,如果通过,则调用编译ExecuteStageAPI返回ExecuteStage代码
客户端收到ExecuteStage后进行内存加载
总结
本次的源码分析只给出了最核心的密钥交换、身份验证、ExecuteSatge加载过程。其实在分析的过程中还牵扯到框架内互相调用的过程、API的调用、code是如何替换编译的等等,等后期分析完源码后我会写一个Convnant的架构图,可以更清晰的快速了解架构调用逻辑。本人也没有系统的学习的C#在分析代码的过程中,花了一些力气才完全弄懂,心情舒畅了很多。