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)();