Cuckoo架构

cuckoo在部署阶段,只在Guest系统里塞了一个agent,这个agent在运行阶段负责与Host端程序进行通信,从Host端接收sample, 整个客户端程序,以及配置文件。

 

在Host端主要的源文件为:

./lib/cuckoo/core/scheduler.py
class AnalysisManager(Thread):
    def acquire_machine(self):
// 获得虚拟机    
    def build_options(self):
//生成.conf配置文件
    def launch_analysis(self):
//启动分析过程
    def process_results(self):
//生成分析结果报告

 

launch_analysis会调用:

agent/agent.py
    def add_malware(self, data, name):
    def add_config(self, options):
    def add_analyzer(self, data):
    def execute(self):

 

执行analyser.py,由Host上传到Guest上的分析程序包含如下结构:

.
└── windows
    ├── analyzer.py
    ├── bin
    │   └── execsc.exe
    ├── dll
    │   ├── cuckoomon_bson.dll
    │   ├── cuckoomon.dll
    │   └── cuckoomon_netlog.dll
    ├── lib
    │   ├── api
    │   │   ├── __init__.py
    │   │   ├── process.py
    │   │   └── screenshot.py
    │   ├── common
    │   │   ├── abstracts.py
    │   │   ├── constants.py
    │   │   ├── defines.py
    │   │   ├── errors.py
    │   │   ├── exceptions.py
    │   │   ├── __init__.py
    │   │   ├── rand.py
    │   │   └── results.py
    │   ├── core
    │   │   ├── config.py
    │   │   ├── __init__.py
    │   │   ├── packages.py
    │   │   ├── privileges.py
    │   │   └── startup.py
    │   └── __init__.py
    └── modules
        ├── auxiliary
        │   ├── disguise.py
        │   ├── human.py
        │   ├── __init__.py
        │   └── screenshots.py
        ├── __init__.py
        └── packages
            ├── applet.py
            ├── bin.py
            ├── cpl.py
            ├── dll.py
            ├── doc.py
            ├── exe.py
            ├── generic.py
            ├── html.py
            ├── ie.py
            ├── __init__.py
            ├── jar.py
            ├── pdf.py
            ├── vbs.py
            ├── xls.py
            └── zip.py

具体的inject方法在该包的api/process.py下面

def inject(self, dll=None, apc=False):

inject方法支持两种注入方式:

QueueUserAPC
CreateRemoteThread

这两种方式的原理都是一样的,都是用LoadLibrary来替换回调函数,同时将需要加载的dll名称作为回调的参数传递给回调函数,这样回调函数一执行,相应的dll就被加载到了进行的地址空间中。

 

在./analyser/windows/modules/packages/下面有对于各个文件格式的sample的启动代码,基本上都是:

p = Process()
p.execute()
p.inject(dll)
p.resume()
p.close()

基本上就是,先找到启动某一类型文件的程序,然后启动它,并且注入dll进行监控。

对于shellcode,使用execsc.exe执行这段shellcode。

execsc.exe的主要源码为:

// jump into shellcode
int (*func)();
func = (int (*)()) buf;
(int)(*func)();
posted @ 2014-03-16 17:29  Daniel King  阅读(1005)  评论(0编辑  收藏  举报