1*08b48e0bSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*08b48e0bSAndroid Build Coastguard Worker 3*08b48e0bSAndroid Build Coastguard Workerimport os 4*08b48e0bSAndroid Build Coastguard Workerimport sys 5*08b48e0bSAndroid Build Coastguard Workerimport pefile 6*08b48e0bSAndroid Build Coastguard Workerimport shutil 7*08b48e0bSAndroid Build Coastguard Workerimport subprocess 8*08b48e0bSAndroid Build Coastguard Worker 9*08b48e0bSAndroid Build Coastguard Workerif len(sys.argv) < 2: 10*08b48e0bSAndroid Build Coastguard Worker print("[afl-wine-trace] usage: ./afl-wine-trace binary [args...]\n") 11*08b48e0bSAndroid Build Coastguard Worker exit(1) 12*08b48e0bSAndroid Build Coastguard Worker 13*08b48e0bSAndroid Build Coastguard Workerif os.getenv("AFL_PATH"): 14*08b48e0bSAndroid Build Coastguard Worker my_dir = os.getenv("AFL_PATH") 15*08b48e0bSAndroid Build Coastguard Workerelse: 16*08b48e0bSAndroid Build Coastguard Worker my_dir = os.path.dirname(os.path.abspath(__file__)) 17*08b48e0bSAndroid Build Coastguard Worker 18*08b48e0bSAndroid Build Coastguard Workeros.environ["WINELOADERNOEXEC"] = "1" 19*08b48e0bSAndroid Build Coastguard Worker 20*08b48e0bSAndroid Build Coastguard Workerpe = pefile.PE(sys.argv[1]) 21*08b48e0bSAndroid Build Coastguard Worker 22*08b48e0bSAndroid Build Coastguard Workerif "AFL_ENTRYPOINT" not in os.environ: 23*08b48e0bSAndroid Build Coastguard Worker os.environ["AFL_ENTRYPOINT"] = "0x%x" % (pe.OPTIONAL_HEADER.ImageBase + pe.OPTIONAL_HEADER.AddressOfEntryPoint) 24*08b48e0bSAndroid Build Coastguard Workerif not os.getenv("AFL_INST_LIBS"): 25*08b48e0bSAndroid Build Coastguard Worker if "AFL_CODE_START" not in os.environ: 26*08b48e0bSAndroid Build Coastguard Worker os.environ["AFL_CODE_START"] = "0x%x" % (pe.OPTIONAL_HEADER.ImageBase + pe.OPTIONAL_HEADER.BaseOfCode) 27*08b48e0bSAndroid Build Coastguard Worker if "AFL_CODE_END" not in os.environ: 28*08b48e0bSAndroid Build Coastguard Worker os.environ["AFL_CODE_END"] = "0x%x" % (pe.OPTIONAL_HEADER.ImageBase + pe.OPTIONAL_HEADER.BaseOfCode + pe.OPTIONAL_HEADER.SizeOfCode) 29*08b48e0bSAndroid Build Coastguard Worker 30*08b48e0bSAndroid Build Coastguard Workerif pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_AMD64"] or pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_IA64"]: 31*08b48e0bSAndroid Build Coastguard Worker os.environ["QEMU_SET_ENV"] = "LD_PRELOAD=" + os.path.join(my_dir, "qemu_mode/unsigaction/unsigaction64.so") + ",WINEARCH=win64" 32*08b48e0bSAndroid Build Coastguard Workerelse: 33*08b48e0bSAndroid Build Coastguard Worker os.environ["QEMU_SET_ENV"] = "LD_PRELOAD=" + os.path.join(my_dir, "qemu_mode/unsigaction/unsigaction32.so") + ",WINEARCH=win32" 34*08b48e0bSAndroid Build Coastguard Worker 35*08b48e0bSAndroid Build Coastguard Workerif os.getenv("WINECOV_QEMU_PATH"): 36*08b48e0bSAndroid Build Coastguard Worker qemu_path = os.getenv("WINECOV_QEMU_PATH") 37*08b48e0bSAndroid Build Coastguard Workerelif os.path.exists(os.path.join(my_dir, "afl-qemu-trace")): 38*08b48e0bSAndroid Build Coastguard Worker qemu_path = os.path.join(my_dir, "afl-qemu-trace") 39*08b48e0bSAndroid Build Coastguard Workerelse: 40*08b48e0bSAndroid Build Coastguard Worker qemu_path = "qemu-" 41*08b48e0bSAndroid Build Coastguard Worker if pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_AMD64"] or pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_IA64"]: 42*08b48e0bSAndroid Build Coastguard Worker qemu_path += "x86_64" 43*08b48e0bSAndroid Build Coastguard Worker elif pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_I386"]: 44*08b48e0bSAndroid Build Coastguard Worker qemu_path += "i386" 45*08b48e0bSAndroid Build Coastguard Worker else: 46*08b48e0bSAndroid Build Coastguard Worker print ("[afl-wine-trace] unsuppoted architecture\n") 47*08b48e0bSAndroid Build Coastguard Worker exit(1) 48*08b48e0bSAndroid Build Coastguard Worker qemu_path = shutil.which(qemu_path) 49*08b48e0bSAndroid Build Coastguard Worker 50*08b48e0bSAndroid Build Coastguard Workerwine_path = None 51*08b48e0bSAndroid Build Coastguard Workerif os.getenv("AFL_WINE_PATH"): 52*08b48e0bSAndroid Build Coastguard Worker wine_path = os.getenv("AFL_WINE_PATH") 53*08b48e0bSAndroid Build Coastguard Workerelse: 54*08b48e0bSAndroid Build Coastguard Worker if not wine_path and shutil.which("wine"): 55*08b48e0bSAndroid Build Coastguard Worker wine_path = shutil.which("wine") 56*08b48e0bSAndroid Build Coastguard Worker if not wine_path and os.path.exists("/usr/bin/wine"): 57*08b48e0bSAndroid Build Coastguard Worker wine_path = "/usr/bin/wine" 58*08b48e0bSAndroid Build Coastguard Worker if not wine_path and os.path.exists("/usr/lib/wine/wine"): 59*08b48e0bSAndroid Build Coastguard Worker wine_path = "/usr/lib/wine/wine" 60*08b48e0bSAndroid Build Coastguard Worker if pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_AMD64"] or pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_IA64"]: 61*08b48e0bSAndroid Build Coastguard Worker wine_path += "64" 62*08b48e0bSAndroid Build Coastguard Worker elif pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_I386"]: 63*08b48e0bSAndroid Build Coastguard Worker pass 64*08b48e0bSAndroid Build Coastguard Worker else: 65*08b48e0bSAndroid Build Coastguard Worker print ("[afl-wine-trace] unsopported architecture\n") 66*08b48e0bSAndroid Build Coastguard Worker exit(1) 67*08b48e0bSAndroid Build Coastguard Worker 68*08b48e0bSAndroid Build Coastguard Workerargv = sys.argv[1:] 69*08b48e0bSAndroid Build Coastguard Workerfor i in range(len(argv)): 70*08b48e0bSAndroid Build Coastguard Worker if ".cur_input" in argv[i]: 71*08b48e0bSAndroid Build Coastguard Worker # Get the Wine translated path using the winepath tool 72*08b48e0bSAndroid Build Coastguard Worker arg_translated = subprocess.run([os.path.join(os.path.dirname(wine_path), "winepath"), "--windows", argv[i]], universal_newlines=True, stdout=subprocess.PIPE).stdout 73*08b48e0bSAndroid Build Coastguard Worker # Remove the spurious LF at the end of the path 74*08b48e0bSAndroid Build Coastguard Worker if len(arg_translated) > 0 and arg_translated[-1] == '\n': 75*08b48e0bSAndroid Build Coastguard Worker arg_translated = arg_translated[:-1] 76*08b48e0bSAndroid Build Coastguard Worker argv[i] = arg_translated 77*08b48e0bSAndroid Build Coastguard Worker break 78*08b48e0bSAndroid Build Coastguard Worker 79*08b48e0bSAndroid Build Coastguard Workerprint("[afl-wine-trace] exec:", " ".join([qemu_path, wine_path] + argv)) 80*08b48e0bSAndroid Build Coastguard Workeros.execve(qemu_path, [qemu_path, wine_path] + argv, os.environ) 81