xref: /aosp_15_r20/external/AFLplusplus/afl-wine-trace (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
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