Windows Carbon Black edr 逆向分析 第一部分

阅读量    100756 |   稿费 300

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

Carbon Black 结构

基本信息
文件构成:
1.cb.exe 32/64 服务程序

  2. cbstream.sys  32/64     wfp架构网络驱动
 3. cbk7.sys      32/64    minifilter文件驱动

开发工具: vs2005
编译平台:jenkins
使用开源库:
STL 、 google protobuf-2.6.1(存贮message) 、libcurl(网络http发送)
半开源WinPMEM(dump内存)

类结构

  1. 主类

    ClientService当前服务的总服务类,管理这个所有的逻辑。

    下面介绍一些逻辑类
  2. 逻辑类

ClientService内部成员类有:
(1) CbEmetEventLogger事件日志类

CbModuleInfoQueryMgr 模块信息管理类

CbNetConnEventMgr 网络事件连接管理类

CbObfuscationConfig 各种混杂信息配置类

CbDriver 驱动管理类

CbEventLogger 事件信息管理类

CbFileStore 文件存贮类,这个就是目录下的MD5/XXXXXXXX的下的文件管理

CbClient 管理当前客户端的信息的类,比如SersorId、host id,也负责把上面所有的类进行功能开启初始化,也负责管理。CbClient内部成员类CbServer,负责服务端的Response,也负责上传事件到服务器

Client内部的CbHttpComms 负责服务器通讯

CliveResponse 执行response动作的类,下面是这个类的动作函数

上传事件的逻辑,日志上传逻辑是在CbServer类模块里的Synch函数里

第一步会检查判断是否有事件信息到达,等待信号态

上传日志的检查时间差是否超过3600毫秒

接着获取网络Curlhelper

看网络如何初始化的他初始化libcurl库

curl_easy_setopt(v2, 20011, curl_helper::OnDataReceived);// CURLOPT_WRITEFUNCTION
curl_easy_setopt(v1->gap0[270], 20108, curl_helper::OnSSLContextReady);// CURLOPT_SSL_CTX_FUNCTION
curl_easy_setopt(v1->gap0[270], 10109, v1); // CURLOPT_SSL_CTX_FUNCTION
curl_easy_setopt(v1->gap0[270], 10001, &v1->gap0[271]);// CURLOPT_WRITEDATA
curl_easy_setopt(v1->gap0[270], 81, 0); // CURLOPT_SSL_VERIFYHOST
curl_easy_setopt(v1->gap0[270], 64, 1); // CURLOPT_SSL_VERIFYPEER
curl_easy_setopt(v1->gap0[270], 41, 0); // CURLOPT_VERBOSE
curl_easy_setopt(v1->gap0[270], 155, 3600000);// CURLOPT_TIMEOUT_MS
curl_easy_setopt(v1->gap0[270], 43, 0); // CURLOPT_NOPROGRESS
curl_easy_setopt(v1->gap0[270], 20056, sub_47CDC0);// CURLOPT_PROGRESSFUNCTION
curl_easy_setopt(v1->gap0[270], 20079, sub_47CE30);// CURLOPT_HEADERFUNCTION
curl_easy_setopt(v1->gap0[270], 10029, &v1->gap0[285]);// CURLOPT_HEADERDATA

设置了超时3600000,设置了最大的速度

设置完毕下面开始push 原始log

进入PushEventLog函数,首先从内存里获取最新的日志事件

我们可以看到它的单个日志信息结构大小是540个字节
(1) 首先判断是否上传磁盘文件存贮的事件

V7 是总的内存日志size – v8 是old日志size
然后除以540 就是新的日志个数,如果磁盘文件存贮的事件满了,就首先上传磁盘里存贮的事件。
我们接着看 CbServer::_PushSingleOnDiskEventLog函数
常规操作打开磁盘文件文件内存映射CbCreateEventLogFile(a2, &lpBaseAddress, (DWORD *)&v16, &v19);

然后就直接传输这个原始日志,是压缩的文件PostData,就是要发送的数据压缩数据

在PutRawEventLog会填充http协议的数据,首选要填充一些协议

注意它会把这些协议加密起来,它的http填充协议是

X-Cb-Flush: True
x-cb-sensorip: 192.168.0.1 每个人不一样这个IP
x-cb-sensorid: 212827121219212129 每个人的安装id,64位的
x-cb-zip: 1
X-Cb-Flush: True
x-cb-reservemin: 678
x-cb-reservemax: 4333
Content-Type: octet-stream
X-CbVer-8.90980 版本号

这些协议设置加密完毕后就设置Post的数据 post数据是zip压缩的

最后得出:Cb是通过把数据zip加密后,通过POST方式发送出去的,协议参数是加密的,https方式。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多