# Create a working directory mkdir sandbox_base cd sandbox_base
# Download the disk image from Microsofts' website # (URL from https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/) wget https://az792536.vo.msecnd.net/vms/VMBuild_20150916/VirtualBox/IE8/IE8.Win7.VirtualBox.zip
# Unzip the virtualbox zip unzip IE8.Win7.VirtualBox.zip
# Untar the .ova tar -xvf IE8\ -\ Win7.ova
# Create a qcow image from the .vmdk file. ## First install qemu utils sudo apt-get install qemu-utils
sample-rr-nondet.log 和 sample-rr-snp 是 PANDA 创建的用于重播执行的文件。
sample-rr-snp 文件包含记录开始时的内存快照
sample-rr-nondet.log 文件包含重放执行所需的 CPU 输入。
replay回放
最后,为了回放执行,我们使用 PANDA 的 qemu 命令行参数 -replay NAME。 回放我们刚刚记录的执行的过程如下面的输出所示。
输出:
$ ./panda/build/i386-softmmu/panda-system-i386 -monitor stdio -show-cursor -m 8192 -replay sample QEMU 2.9.1 monitor - type'help'for more information (qemu) loading snapshot ... done. opening nondet logforread : ./sample-rr-nondet.log ./sample-rr-nondet.log: 12257883474 instrs total. sample: 122578839 ( 1.00%) instrs. 3.03 sec. 2.09 GB ram. sample: 245157670 ( 2.00%) instrs. 5.30 sec. 2.16 GB ram. sample: 367736508 ( 3.00%) instrs. 7.08 sec. 2.21 GB ram. sample: 490315339 ( 4.00%) instrs. 8.93 sec. 2.26 GB ram. sample: 612894177 ( 5.00%) instrs. 10.51 sec. 2.28 GB ram. sample: 735473011 ( 6.00%) instrs. 12.59 sec. 2.30 GB ram. sample: 858051847 ( 7.00%) instrs. 14.14 sec. 2.31 GB ram. sample: 980630679 ( 8.00%) instrs. 15.67 sec. 2.32 GB ram. sample: 1103209513 ( 9.00%) instrs. 17.13 sec. 2.35 GB ram. sample: 1225788351 ( 10.00%) instrs. 19.25 sec. 2.36 GB ram. sample: 1348367183 ( 11.00%) instrs. 21.67 sec. 2.39 GB ram. sample: 1470946025 ( 12.00%) instrs. 23.74 sec. 2.42 GB ram. sample: 1593524854 ( 13.00%) instrs. 25.30 sec. 2.43 GB ram. sample: 1716103692 ( 14.00%) instrs. 26.59 sec. 2.44 GB ram. sample: 1838682533 ( 15.00%) instrs. 28.35 sec. 2.48 GB ram. sample: 1961261358 ( 16.00%) instrs. 30.05 sec. 2.49 GB ram. sample: 2083840197 ( 17.00%) instrs. 31.73 sec. 2.50 GB ram. sample: 2206419030 ( 18.00%) instrs. 33.05 sec. 2.50 GB ram. sample: 2328997867 ( 19.00%) instrs. 34.10 sec. 2.51 GB ram. sample: 2451576695 ( 20.00%) instrs. 34.86 sec. 2.51 GB ram. sample: 2574155533 ( 21.00%) instrs. 35.62 sec. 2.51 GB ram. sample: 2696734368 ( 22.00%) instrs. 36.34 sec. 2.51 GB ram. sample: 2819313201 ( 23.00%) instrs. 37.15 sec. 2.51 GB ram. sample: 2941892037 ( 24.00%) instrs. 37.90 sec. 2.51 GB ram. sample: 3064470870 ( 25.00%) instrs. 38.64 sec. 2.51 GB ram. sample: 3187049706 ( 26.00%) instrs. 39.37 sec. 2.51 GB ram. sample: 3309628543 ( 27.00%) instrs. 40.14 sec. 2.53 GB ram. sample: 3432207378 ( 28.00%) instrs. 40.90 sec. 2.53 GB ram. sample: 3554786210 ( 29.00%) instrs. 41.67 sec. 2.53 GB ram. sample: 3677365047 ( 30.00%) instrs. 42.44 sec. 2.53 GB ram. sample: 3799943884 ( 31.00%) instrs. 43.20 sec. 2.53 GB ram. sample: 3922522712 ( 32.00%) instrs. 44.01 sec. 2.53 GB ram. sample: 4045101555 ( 33.00%) instrs. 44.80 sec. 2.53 GB ram. sample: 4167680384 ( 34.00%) instrs. 46.56 sec. 2.54 GB ram. sample: 4290259220 ( 35.00%) instrs. 47.72 sec. 2.54 GB ram. sample: 4412838054 ( 36.00%) instrs. 48.71 sec. 2.54 GB ram. sample: 4535416896 ( 37.00%) instrs. 50.03 sec. 2.55 GB ram. sample: 4657995732 ( 38.00%) instrs. 51.02 sec. 2.55 GB ram. sample: 4780574563 ( 39.00%) instrs. 52.02 sec. 2.55 GB ram. sample: 4903153392 ( 40.00%) instrs. 53.05 sec. 2.56 GB ram. sample: 5025732229 ( 41.00%) instrs. 54.11 sec. 2.56 GB ram. sample: 5148311061 ( 42.00%) instrs. 55.59 sec. 2.57 GB ram. sample: 5270889895 ( 43.00%) instrs. 57.61 sec. 2.58 GB ram. sample: 5393468732 ( 44.00%) instrs. 59.63 sec. 2.58 GB ram. sample: 5516047564 ( 45.00%) instrs. 61.49 sec. 2.60 GB ram. sample: 5638626404 ( 46.00%) instrs. 62.96 sec. 2.62 GB ram. sample: 5761205244 ( 47.00%) instrs. 63.83 sec. 2.66 GB ram. sample: 5883784083 ( 48.00%) instrs. 64.33 sec. 2.66 GB ram. sample: 6006362907 ( 49.00%) instrs. 65.52 sec. 2.66 GB ram. sample: 6128941737 ( 50.00%) instrs. 67.38 sec. 2.67 GB ram. sample: 6251520574 ( 51.00%) instrs. 68.85 sec. 2.67 GB ram. sample: 6374099413 ( 52.00%) instrs. 71.54 sec. 2.68 GB ram. sample: 6496678244 ( 53.00%) instrs. 73.11 sec. 2.70 GB ram. sample: 6619257095 ( 54.00%) instrs. 75.17 sec. 2.72 GB ram. sample: 6741835915 ( 55.00%) instrs. 76.67 sec. 2.75 GB ram. sample: 6864414747 ( 56.00%) instrs. 78.02 sec. 2.77 GB ram. sample: 6986993585 ( 57.00%) instrs. 79.43 sec. 2.78 GB ram. sample: 7109572416 ( 58.00%) instrs. 81.03 sec. 2.79 GB ram. sample: 7232151255 ( 59.00%) instrs. 81.99 sec. 2.79 GB ram. sample: 7354730096 ( 60.00%) instrs. 83.04 sec. 2.79 GB ram. sample: 7477308922 ( 61.00%) instrs. 84.02 sec. 2.79 GB ram. sample: 7599887756 ( 62.00%) instrs. 85.07 sec. 2.82 GB ram. sample: 7722466590 ( 63.00%) instrs. 85.93 sec. 2.91 GB ram. sample: 7845045425 ( 64.00%) instrs. 86.94 sec. 2.92 GB ram. sample: 7967624263 ( 65.00%) instrs. 89.36 sec. 2.92 GB ram. sample: 8090203100 ( 66.00%) instrs. 91.36 sec. 2.92 GB ram. sample: 8212781928 ( 67.00%) instrs. 92.56 sec. 2.93 GB ram. sample: 8335360763 ( 68.00%) instrs. 93.53 sec. 2.93 GB ram. sample: 8457939599 ( 69.00%) instrs. 94.50 sec. 2.93 GB ram. sample: 8580518433 ( 70.00%) instrs. 95.51 sec. 2.93 GB ram. sample: 8703097273 ( 71.00%) instrs. 97.64 sec. 2.96 GB ram. sample: 8825676104 ( 72.00%) instrs. 99.93 sec. 2.98 GB ram. sample: 8948254945 ( 73.00%) instrs. 102.09 sec. 2.98 GB ram. sample: 9070833775 ( 74.00%) instrs. 103.77 sec. 3.00 GB ram. sample: 9193412614 ( 75.00%) instrs. 105.20 sec. 3.00 GB ram. sample: 9315991448 ( 76.00%) instrs. 106.58 sec. 3.00 GB ram. sample: 9438570277 ( 77.00%) instrs. 108.09 sec. 3.01 GB ram. sample: 9561149110 ( 78.00%) instrs. 109.48 sec. 3.02 GB ram. sample: 9683727949 ( 79.00%) instrs. 111.43 sec. 3.03 GB ram. sample: 9806306784 ( 80.00%) instrs. 113.25 sec. 3.03 GB ram. sample: 9928885615 ( 81.00%) instrs. 115.41 sec. 3.04 GB ram. sample: 10051464450 ( 82.00%) instrs. 117.09 sec. 3.06 GB ram. sample: 10174043284 ( 83.00%) instrs. 119.48 sec. 3.08 GB ram. sample: 10296622121 ( 84.00%) instrs. 121.13 sec. 3.09 GB ram. sample: 10419200982 ( 85.00%) instrs. 121.95 sec. 3.09 GB ram. sample: 10541779795 ( 86.00%) instrs. 122.45 sec. 3.10 GB ram. sample: 10664358635 ( 87.00%) instrs. 123.53 sec. 3.13 GB ram. sample: 10786937459 ( 88.00%) instrs. 124.43 sec. 3.14 GB ram. sample: 10909516309 ( 89.00%) instrs. 125.78 sec. 3.15 GB ram. sample: 11032095129 ( 90.00%) instrs. 126.66 sec. 3.15 GB ram. sample: 11154673962 ( 91.00%) instrs. 127.90 sec. 3.16 GB ram. sample: 11277252798 ( 92.00%) instrs. 128.95 sec. 3.16 GB ram. sample: 11399831631 ( 93.00%) instrs. 130.46 sec. 3.16 GB ram. sample: 11522410472 ( 94.00%) instrs. 131.79 sec. 3.17 GB ram. sample: 11644989304 ( 95.00%) instrs. 133.26 sec. 3.19 GB ram. sample: 11767568137 ( 96.00%) instrs. 134.75 sec. 3.19 GB ram. sample: 11890146970 ( 97.00%) instrs. 136.06 sec. 3.20 GB ram. sample: 12012725817 ( 98.00%) instrs. 137.22 sec. 3.20 GB ram. sample: 12135304642 ( 99.00%) instrs. 138.58 sec. 3.20 GB ram. ./sample-rr-nondet.log: log is empty. ./sample-rr-nondet.log: log is empty. Time taken was: 143 seconds. Stats: RR_INPUT_1 number = 0, size = 0 bytes RR_INPUT_2 number = 0, size = 0 bytes RR_INPUT_4 number = 52356, size = 732984 bytes RR_INPUT_8 number = 263807, size = 4748526 bytes RR_INTERRUPT_REQUEST number = 41100, size = 575400 bytes RR_EXIT_REQUEST number = 0, size = 0 bytes RR_SKIPPED_CALL number = 34033, size = 76861370 bytes RR_END_OF_LOG number = 1, size = 10 bytes RR_PENDING_INTERRUPTS number = 0, size = 0 bytes RR_EXCEPTION number = 0, size = 0 bytes max_queue_len = 821 Replay completed successfully Exiting cpu_handle_execption loop
减少分析时间
回放仿真是会消耗许多时间,可以在客户系统内将性能提至最优,以达到提高分析速度的效果。以本实验使用的客户系统win7系统为例,在计算机属性内找到如下选项,选择“Adjust for best performance”并保存,即可提高分析速度。
分析特定样本
此时,我们可以使用 PANDA 记录执行并重放它,但是,我们仍然需要一种机制来允许我们记录目标应用程序的执行。目标是拥有一种灵活的方法,允许我们将应用程序从主机环境转移到客户(guest)环境,然后在客户(guest)环境中启动应用程序的执行。此外,我们希望在客户系统内不部署任何脚本或类似内容的情况下执行此操作。
for c in s: if c in string.ascii_uppercase: key = 'shift-' + c.lower() else: key = keymap.get(c, c) str_sendkey = "sendkey "+"%s"%(key)+"\n" p.stdin.write(str_sendkey.encode()) p.stdin.flush() time.sleep(.5)
defrecord_execution(sample, recording_time): #执行记录程序 log_info("Recording execution %s"%(sample)) log_info("Recording for %d seconds"%(recording_time))
try: subprocess.check_call(cmd) log_info("Made an iso file for the sample") except Exception: print(traceback.format_exc()) print(sys.exc_info()[0]) log_exit("Could not make any iso file for the sample")
#运行Panda cmd = [] cmd.append(PANDA_x86) for flag in PANDA_flags: cmd.append(flag) panda_stdout_path = "panda.stdout" panda_stderr_path = "panda.stderr" panda_stdout = open(panda_stdout_path, 'w+') panda_stderr = open(panda_stderr_path, 'w+')
log_info("Started recording and executed the sample in the guest machine") log_info("Recording for: %d seconds"%(TIME_TO_EXECUTE)) time.sleep(TIME_TO_EXECUTE)
# 结束记录 p.stdin.write(b"end_record\n") p.stdin.flush() # 向qemu发送'q'退出环境 p.stdin.write(b"q\n") p.stdin.flush() log_info("Recording is over, shutting the VM down") p.stdin.write(b"q\n") p.stdin.flush() time.sleep(3)
whileTrue: poll = p.poll() if poll == None: time.sleep(1) else: log_info("VM is shut down") break
log_info("Finished recording the sample execution")
if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument( "-sample", help = "The sample to executed", required = True)
parser.add_argument( "-time", help = "The number of seconds to record an execution", type = int, default = 25)
$ python3 vm_record.py -sample ./sample.exe [+] Recording execution ./sample.exe [+] Recording for 25 seconds Warning: Creating ISO-9660:1999 (version 2) filesystem. Warning: ISO-9660 filenames longer than 31 may cause buffer overflows in the OS. Total translation table size: 0 Total rockridge attributes bytes: 247 Total directory bytes: 0 Path table size(bytes): 10 Max brk space used 0 241 extents written (0 MB) [+] Made an iso file for the sample [+] Executing command: /root/Desktop/panda/build/i386-softmmu/panda-system-i386 -monitor stdio -show-cursor -m 8192 -loadvm 1 /root/Desktop/IE8_win7_disk1.qcow2 [+] VM started [+] Started recording and executed the sample in the guest machine [+] Recording for: 20 seconds [+] Recording is over, shutting the VM down [+] VM is shut down [+] Finished recording the sample execution
重放回放(Replaying a recording)
# -*- coding: utf-8 -*- #vm_replay.py import os import sys import time import subprocess import argparse import string import shutil
if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument( "-recording", help = "The name of the recording to replay", required = True)
if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument( "-recording", help = "The name of the recording to replay", required = True)