接上一篇,PANDA同样是一个开源的基于qemu的动态二进制分析平台,提供指令记录和回放、执行LLVM等强大功能,方便编写各种插件。记录一下安装PANDA的过程。
PANDA安装
我是手动按照官方文档安装的。1
2
3
4
5
6
7
8sudo add-apt-repository ppa:phulin/panda
sudo apt-get update
sudo apt-get build-dep qemu
sudo apt-get install git python-pip libc++-dev libelf-dev libdwarf-dev
sudo apt-get install libelf-dev libdwarf-dev libwiretap-dev wireshark-dev python-pycparser
sudo apt-get install llvm-3.3 clang-3.3
sudo apt-get install protobuf-compiler protobuf-c-compiler python-protobuf
sudo apt-get install libprotoc-dev libprotobuf-dev libprotobuf-c-dev
然后下载和安装panda:1
2
3
4git clone https://github.com/panda-re/panda
mkdir -p build-panda
cd build-panda
../panda/build.sh
或者直接使用install_ubuntu.sh这个脚本安装。我的情况是使用git clone服务器的网速太慢了,一直下载不下来,十几kb也是很醉啊,手动下载会出现错误2,但能找到解决方法。
遇到的错误
错误1:
1 | chen@ubuntu:~$ sudo apt-get install libprotobuf-c-dev |
可以手动下载libprotobuf-c-dev,64位安装包下载地址在这里。安装命令:1
sudo dpkg -i libprotobuf-c1_1.2.1-1_amd64.deb
错误2:
1 | chen@ubuntu:~/build-panda$ ../panda/build.sh |
这是因为我的libfdt版本是1.4.0,手动安装高版本的libfdt,由于高版本的libfdt还要高版本的libfdt1,下载libfdt-1.4.5和libfdt1-1.4.5,然后安装:1
2sudo dpkg -i libfdt-dev_1.4.5-3_amd64.deb
sudo dpkg -i libfdt1_1.4.5-3_amd64.deb
PANDA使用
首先制作虚拟磁盘文件:1
qemu-img create -f qcow2 win7_64.qcow2 60G
然后安装操作系统,这里我用64位的win7,还是在另外一台机器上安装,然后再返回PANDA所在的系统中启动镜像,但是我64位的win7可能是因为操作系统镜像的问题,无法安装,还是记录一下命令。1
2qemu-system-x86_64 -m 2048 win7_64.qcow2 -cdrom Win7_64.iso -show-cursor -usbdevice tablet
qemu-img amend -f qcow2 -o compat=0.10 win7_64.qcow2
因此我选择直接在PANDA里启动和安装操作系统,可以启动成功,安装时间比较久,应该不会出什么问题。1
2cd build-panda/x86_64_softmmu/
./panda-system-x86_64 -drive file=../../image/x64/win7_64.qcow2,if=ide,cache=writeback -m 2048M -cdrom ../../image/x64/win7_64.iso -show-cursor -usbdevice tablet
安装好之后,再次启动就可以去掉iso镜像文件,启动命令如下:1
2cd build-panda/x86_64_softmmu/
./panda-system-x86_64 -monitor stdio -m 1024 -show-cursor -usbdevice tablet netdev user,id=mynet -device rtl8139,netdev=mynet ../../image/x64/win7_64.qcow2
32位的镜像可以用之前decaf做好的镜像,启动命令类似decaf:1
2cd build-panda/i386_softmmu/
./panda-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet netdev user,id=mynet -device rtl8139,netdev=mynet ../../image/x86/win7_full.qcow2
同样,可以先使用vmware制作镜像,然后转换为qemu支持的格式。命令如下:1
2qemu-img convert win7_64.vmdk -O qcow win7_64.img
./panda-system-x86_64 -monitor stdio -m 1024 -show-cursor -usbdevice tablet netdev user,id=mynet -device rtl8139,netdev=mynet ../../image/x64/win7_64.img
使用感受就是PANDA比DECAF在qemu里的响应时间要短。但两个平台的功能侧重点不同,有时间再去读一下这两个工具的论文。
panda快照和插件
快照存储和重放
首选启动panda:1
2cd /home/chen/build-panda/i386-softmmu
./panda-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet ../../image/x64/win7_64.qcow2
在qemu终端中开始,快照命名为calc,启动和结束快照记录:1
2begin_record calc
end_record
生成两个文件,快照和日志记录文件,分别命名为 1
calc-rr-snp calc-rr-nondet.log
快照重放是在panda启动命令中加 -replay 1
2cd /home/chen/build-panda/i386-softmmu
./panda-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet -replay calc
执行后进行指令重放,当重放完成后,会显示是否重放是否成功。
osi、osi_test和win7x86intro
利用这三个可以识别操作系统,列出在快照重放过程中的系统上执行的所有进程、当前运行进程、内核模块以及它们加载的动态链接库,对于Windows系统只支持32位,创建32位系统的快照,重放快照并加载插件:1
2cd /home/chen/build-panda/i386-softmmu
./panda-system-i386 -monitor stdio -m 1024 -show-cursor -usbdevice tablet -replay /home/chen/project/calc -panda osi -panda osi_test -panda win7x86intro -os windows-32-7
这样运行后输出文件很大,因为每次进行进程的上下文切换时状态都会发生变化,至少当前运行进程和加载的动态链接库会发生变化。
增加新的插件
在panda的plugins目录下,我的是/home/chen/panda/panda/plugins/创建新的文件夹,以插件的名字命名,例如创建一个ins_test的文件夹,ins_test是我自己的插件。然后在plugins目录下的config.panda文件中转增加ins_test。可以使用c/c++来编写插件,插件要创建一个Makefile文件,最简单形式的Makefile文件如下:1
2
3
4
5
6
7
8PLUGIN_NAME = ins_test
# If you need custom CFLAGS or LIBS, set them up here
# CFLAGS+=
# LIBS+=
# The main rule for your plugin. List all object-file dependencies.
$(PLUGIN_TARGET_DIR)/panda_$(PLUGIN_NAME).so: \
$(PLUGIN_OBJ_DIR)/$(PLUGIN_NAME).o
编写完成后,panda支持的平台很多,如果想要节省时间,只编译某个平台,因为到了自己写插件这一步,我们目标平台是已经确定了的,可以修改panda根目录下的build.sh文件,第128行有target-list,比如我只想编译适用于Windows 32位的插件,那么target-list就只保留i386-softmmu。1
--target-list=x86_64-softmmu,i386-softmmu,arm-softmmu,ppc-softmmu \
返回build-panda目录下,我的是/home/chen/build-panda,执行build.sh脚本:1
2cd /home/chen/build-panda
../panda/build.sh
之前已经编译好的,在重新build时不会重复编译,所以这次只会编译我们自己的插件,所以时间很快。开始我是把build-panda清空再编译的,还到处找单独编译插件的方法….
参考
[手动安装官方文档]https://github.com/panda-re/panda/blob/master/panda/docs/build_ubuntu.md
https://www.freebuf.com/sectool/76665.html