DECAF安装及使用记录

准备研究一下qemu,毕设可能会用到,先把工具选好,环境搭好。DECAF是一个二进制动态分析平台,基于qemu,有动态污点分析、二进制插桩等动态分析功能。DECAF++是DECAF升级版本,污点分析速度比DECAF快了两倍多。折腾了三四天,基本把DECAF装好了,有两个插件没有编译好,应该也用不到那两个,搭环境太难了,而且qemu太慢了,本来pin就已经够慢了,简直忍不了啊。有时间再试一下PANDA。记录一下安装过程,看到网上的教程大都是根据官方文档来的,但是只依据官方文档并不能安装好。

decaf安装

系统版本如下,在16.04上出的错误比较多,于是就换了更低版本的14.04。

1
Linux ubuntu 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

安装所需的库

安装qemu:

1
2
sudo apt-get install qemu
sudo apt-get build-dep qemu

第二条命令报错:

1
2
3
chen@ubuntu:~/DECAF/decaf$ sudo apt-get build-dep qemu
Reading package lists... Done
E: You must put some 'source' URIs in your sources.list

ubuntu的软件源我使用的是清华源,看到一条解决方案是将其换为ubuntu的官方源,还好我有备份。
更换源之后卸载qemu重新安装qemu:

1
2
sudo apt-get remove --purge qemu
sudo apt-get install qemu

在System Settings – Software&Updates中勾选source code,然后再执行第二条命令,即可成功安装和build-dep。

1
sudo apt-get build-dep qemu

安装BFD library:

1
sudo apt-get install binutils-dev

安装其他库,为了避免后面报错:

1
2
3
4
sudo apt-get install zlib1g-dev
sudo apt-get install libglib2.0-dev
sudo apt-get install libtsk-dev
sudo apt-get install libboost-dev

下载DECAF源码:

1
https://github.com/decaf-project/DECAF/archive/v1.91.tar.gz

这里将源码根文件夹名称重命名为DECAF。

编译DECAF

说明一下,后面提到的root directory of decaf都指的是decaf的路径,不是DECAF的根目录,我的系统上是/home/chen/DECAF/decaf,因为DECAF的目录组成如下:

1
2
chen@ubuntu:~/DECAF$ ls
decaf docker docs image LICENSE README.md

decaf默认编译是如下:

1
VMI is enabled and TCG tainting and TCG IR logging is disabled

开始我是使用一条命令配置各个功能然后编译的,但是后面在编译插件时出现了错误,为了避免错误,我又选择遵从官方文档,先执行默认配置和编译:

1
2
3
cd DECAF/decaf
./configure
make

出现错误如下:

1
2
3
4
chen@ubuntu:~/DECAF/decaf$ make
Building Sleuthkit, please wait...
GEN Sleuthkit
make: *** [/home/chen/DECAF/decaf/shared/sleuthkit/lib/libtsk.so] Error 2

因为sleuthkit没有编译,先编译sleuthkit:

1
2
cd shared/sleuthkit
./configure

又出现了错误,官方文档说只有Sleuthkit编译没有错误之后,decaf才能正确编译。

1
2
3
4
5
sed: can't read config/ltmain.sh: No such file or directory
mv: cannot stat 'libtoolT': No such file or directory
cp: cannot stat 'libtoolT': No such file or directory
chmod: cannot access 'libtool': No such file or directory
config.status: executing tsk/tsk_incs.h commands

解决方法:

1
2
3
sudo apt-get install autoconf libtool
make distclean
autoreconf -fiv

然后重新配置和编译Sleuthkit:

1
2
./configure
make

返回decaf源码目录,重新配置和编译:

1
2
3
cd DECAF/decaf
./configure
make

开启TCG tainting和TCG IR logging功能,重新编译:

1
2
./configure --enable-tcg-taint --enable-tcg-ir-log
make

在编译插件时,开启了TCG IR logging之后插件编译报错,出现错误,提示找不到tcg-target.h,没有找到解决方案,因此就选择关闭了TCG IR logging功能。只开启TCG tainting。

1
2
3
4
5
6
7
8
9
10
11
12
13
chen@ubuntu:~/DECAF/decaf/plugins/callbacktests$ ./configure --decaf-path=/home/chen/DECAF/decaf
plugin path is /home/chen/DECAF/decaf/plugins/callbacktests
path to DECAF is /home/chen/DECAF/decaf
chen@ubuntu:~/DECAF/decaf/plugins/callbacktests$ make
gcc -Wall -O2 -g -fPIC -MMD -I. -I/home/chen/DECAF/decaf -I/home/chen/DECAF/decaf/plugins -I/home/chen/DECAF/decaf/fpu -I/home/chen/DECAF/decaf/shared -I/home/chen/DECAF/decaf/target-i386 -I/home/chen/DECAF/decaf/i386-softmmu -I/home/chen/DECAF/decaf/slirp -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE -DNEED_CPU_H -I-pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -c -o callbacktests.o callbacktests.c
In file included from /home/chen/DECAF/decaf/target-i386/cpu.h:1044:0,
from /home/chen/DECAF/decaf/qemu-common.h:110,
from /home/chen/DECAF/decaf/shared/DECAF_types.h:29,
from callbacktests.c:21:
/home/chen/DECAF/decaf/exec-all.h:25:60: fatal error: tcg-target.h: No such file or directory
compilation terminated.
Makefile:31: recipe for target 'callbacktests.o' failed
make: *** [callbacktests.o] Error 1

至此,decaf成功编译,但是没有开启TCG IR logging功能。

编译插件

插件的编译都是进入插件目录下,配置好decaf的源码目录,然后进行编译。成功编译好callbacktests、keylogger 、hookapitests、min_apitracer、tracecap,system_cfi和unpacker编译报错。

1
2
3
cd DECAF/decaf/plugins/callbacktests
./configure --decaf-path=/home/chen/DECAF/decaf
make

错误如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
unpacker.c: In function ‘unregister_callbacks’:
unpacker.c:293:29: error: ‘DECAF_MEM_WRITE_CB’ undeclared (first use in this function)
DECAF_unregister_callback(DECAF_MEM_WRITE_CB,mem_write_cb_handle);
^
unpacker.c:293:29: note: each undeclared identifier is reported only once for each function it appears in
unpacker.c: In function ‘unpacker_loadmainmodule_notify’:
unpacker.c:330:5: warning: implicit declaration of function ‘VMI_find_cr3_by_pid_c’ [-Wimplicit-function-declaration]
unpack_cr3 = VMI_find_cr3_by_pid_c(pid);
^
unpacker.c:336:50: error: ‘DECAF_MEM_WRITE_CB’ undeclared (first use in this function)
mem_write_cb_handle=DECAF_register_callback(DECAF_MEM_WRITE_CB,unpacker_mem_write,NULL);
^
make: *** [unpacker.o] Error 1

DECAF使用

首先制作镜像,decaf只支持32位的客户机操作系统,我选择的是Windows 7 32位系统,首先使用vmware制作类型为vmdk类型的镜像,初步理解是使用vmware安装一个虚拟机,然后把那个vmdk文件拷贝出来,好在我分析的软件在32位系统上可以运行。win7.vmdk是我使用vmware生成的镜像文件,将其转化为 QCOW2 image Format。有一个注意事项是把vmware tools给卸载了,然后转化的格式一定是qcow2,不能是qcow或其他格式。

1
qemu-img convert win7.vmdk -O qcow2 win7.img

启动虚拟机,可以正常启动,不过好慢啊:

1
2
cd DECAF/decaf/i386-softmmu
./qemu-system-i386 -monitor stdio -m 1024 ­netdev user,id=mynet -device rtl8139,netdev=mynet ../../image/win7.img

使用官方文档里指定的参数启动时,在qemu里客户机的鼠标会乱窜,找了半天,下午找到了解决方法,启动的参数改成下面这样:

1
./qemu-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet ­netdev user,id=mynet -device rtl8139,netdev=mynet ../../image/win7.img

想直接使用qemu制作镜像,下面两个方法可以直接pass,应该是decaf自己的问题,导致qemu无法安装操作系统,于是我换了一台ubuntu,想着把镜像制作好,到时候直接启动就好了,我简直太机智了。具体方法如下,鼠标的参数要加上,因为安装的过程要选择一些选项。过程比较慢,但可以成功安装。

1
2
3
4
//换一个ubuntu
sudo apt-get install qemu
qemu-img create -f qcow2 win7.qcow2 60G
qemu-system-i386 -m 2048 win7.qcow2 -cdrom /home/chen/image/Windows_7.iso -show-cursor -usbdevice tablet

在启动镜像之前,需要进行一个操作,应该版本不兼容的问题,然后再启动镜像,镜像名称我改成了win7_full.qcow2,然后成功启动。比较了一下,我感觉直接使用qemu生成的镜像启动速度好像快了这么一点点。

1
2
qemu-img amend -f qcow2 -o compat=0.10 win7_full.qcow2
./qemu-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet ­netdev user,id=mynet -device rtl8139,netdev=mynet ../../image/win7_full.qcow2

接下来会再研究一下PANDA,然后对比一下,慎重选择。本来选择DECAF是因为它的污点分析的速度最快,但是目前decaf++那个功能编译没有成功,就很难受,而且decaf不支持64位的架构。

没成功的尝试

可以不用看,但是也踩了很多坑…尝试使用qemu来制作镜像,但是一直报一个512的错误。

尝试一

因为运行实在是太慢了,怀疑是不是因为镜像的问题,尝试直接用qemu制作镜像,仍然是32位的win7,首先制作虚拟磁盘文件:

1
qemu-img create -f qcow2 win7.qcow2 60G

然后安装操作系统:

1
qemu-system-i386 -m 2048 win7.qcow2 -cdrom /home/chen/image/Windows_7.iso

出现错误:

1
2
chen@ubuntu:~/DECAF/image$ qemu-system-i386 -m 2048 win7.qcow2 -cdrom /home/chen/image/Windows_7.iso
Could not initialize SDL(No available video device) - exiting

解决方案如下:

1
2
3
sudo apt-get remove libsdl1.2debian
sudo apt-get install libsdl1.2-dev
sudo apt-get install xorg-dev

然后在这里下载SDL-1.2,编译安装:

1
2
3
cd SDL-1.2.15
./configure
make

make又报错了:

1
2
3
4
5
6
7
8
9
10
11
12
./src/video/x11/SDL_x11sym.h:168:17: error: conflicting types for ‘_XData32’
SDL_X11_SYM(int,_XData32,(Display *dpy,register long *data,unsigned len),(dpy,data,len),return)
^
./src/video/x11/SDL_x11dyn.c:95:5: note: in definition of macro ‘SDL_X11_SYM’
rc fn params { ret p##fn args ; }
^
In file included from ./src/video/x11/SDL_x11dyn.h:34:0,
from ./src/video/x11/SDL_x11dyn.c:26:
/usr/include/X11/Xlibint.h:568:12: note: previous declaration of ‘_XData32’ was here
extern int _XData32(
^
make: *** [build/SDL_x11dyn.lo] Error 1

找到了解决方案,修改这一行,将第168行修改成这样:

1
2
3
4
5
vim ./src/video/x11/SDL_x11sym.h
//line 168
SDL_X11_SYM(int,_XData32,(Display *dpy,_Xconst long *data,unsigned len),(dpy,data,len),return)
make
sudo make install

依然是这个错误,佛了佛了….

1
2
chen@ubuntu:~/DECAF/decaf/i386-softmmu$ ./qemu-system-i386 -m 2048 ../../image/win7.qcow2 -cdrom /home/chen/image/Windows_7.iso
qemu-system-i386: /home/chen/DECAF/decaf/shared/tainting/taintcheck_opt.c:105: taintcheck_disk_check: Assertion `offset + size <= 512' failed.

尝试二

因为运行实在是太慢了,怀疑是不是因为镜像的问题,尝试直接用qemu制作镜像,仍然是32位的win7,步骤如下,这部分参考了这篇文章,感谢大佬。

1
2
3
qemu-img create -f qcow2 win7.qcow2 60G
cd DECAF/decaf/i386-softmmu
./qemu-system-i386 -drive file=/home/chen/image/win7.qcow2,if=ide,cache=writeback -m 256M -cdrom /home/chen/image/Windows_7.iso -vnc :5901

第二条命令报错,出现不兼容问题:

1
2
3
chen@ubuntu:~/DECAF/decaf/i386-softmmu$ ./qemu-system-i386 -drive file=/home/chen/image/win7.qcow2,if=ide,cache=writeback -m 256M -cdrom /home/chen/image/Windows_7.iso -vnc :5901
qemu-system-i386: -drive file=/home/chen/image/win7.qcow2,if=ide,cache=writeback: 'ide0-hd0' uses a qcow2 feature which is not supported by this qemu version: QCOW version 3
qemu-system-i386: -drive file=/home/chen/image/win7.qcow2,if=ide,cache=writeback: could not open disk image /home/chen/image/win7.qcow2: Operation not supported

解决方案:

1
qemu-img amend -f qcow2 -o compat=0.10 win7.qcow2

有一个512的check没有通过,难道是磁盘有一个512M的check嘛……

1
2
3
chen@ubuntu:~/DECAF/decaf/i386-softmmu$ ./qemu-system-i386 -drive file=/home/chen/image/win7.qcow2,if=ide,cache=writeback -m 256M -cdrom /home/chen/image/Windows_7.iso -vnc :5901
qemu-system-i386: /home/chen/DECAF/decaf/shared/tainting/taintcheck_opt.c:105: taintcheck_disk_check: Assertion `offset + size <= 512' failed.
Aborted (core dumped)

参考

[官方安装文档] https://github.com/decaf-project/DECAF/wiki/Startup
[遇到错误可以在这里找] https://groups.google.com/forum/#!forum/decaf-platform-discuss