1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker american fuzzy lop++ - snapshot helpers routines
3*08b48e0bSAndroid Build Coastguard Worker ------------------------------------------------
4*08b48e0bSAndroid Build Coastguard Worker
5*08b48e0bSAndroid Build Coastguard Worker Originally written by Michal Zalewski
6*08b48e0bSAndroid Build Coastguard Worker
7*08b48e0bSAndroid Build Coastguard Worker Forkserver design by Jann Horn <[email protected]>
8*08b48e0bSAndroid Build Coastguard Worker
9*08b48e0bSAndroid Build Coastguard Worker Now maintained by Marc Heuse <[email protected]>,
10*08b48e0bSAndroid Build Coastguard Worker Heiko Eißfeldt <[email protected]>,
11*08b48e0bSAndroid Build Coastguard Worker Andrea Fioraldi <[email protected]>,
12*08b48e0bSAndroid Build Coastguard Worker Dominik Maier <[email protected]>
13*08b48e0bSAndroid Build Coastguard Worker
14*08b48e0bSAndroid Build Coastguard Worker Copyright 2016, 2017 Google Inc. All rights reserved.
15*08b48e0bSAndroid Build Coastguard Worker Copyright 2019-2024 AFLplusplus Project. All rights reserved.
16*08b48e0bSAndroid Build Coastguard Worker
17*08b48e0bSAndroid Build Coastguard Worker Licensed under the Apache License, Version 2.0 (the "License");
18*08b48e0bSAndroid Build Coastguard Worker you may not use this file except in compliance with the License.
19*08b48e0bSAndroid Build Coastguard Worker You may obtain a copy of the License at:
20*08b48e0bSAndroid Build Coastguard Worker
21*08b48e0bSAndroid Build Coastguard Worker https://www.apache.org/licenses/LICENSE-2.0
22*08b48e0bSAndroid Build Coastguard Worker
23*08b48e0bSAndroid Build Coastguard Worker */
24*08b48e0bSAndroid Build Coastguard Worker
25*08b48e0bSAndroid Build Coastguard Worker // From AFL-Snapshot-LKM/include/afl_snapshot.h (must be kept synced)
26*08b48e0bSAndroid Build Coastguard Worker
27*08b48e0bSAndroid Build Coastguard Worker #include <sys/ioctl.h>
28*08b48e0bSAndroid Build Coastguard Worker #include <stdlib.h>
29*08b48e0bSAndroid Build Coastguard Worker #include <fcntl.h>
30*08b48e0bSAndroid Build Coastguard Worker
31*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_FILE_NAME "/dev/afl_snapshot"
32*08b48e0bSAndroid Build Coastguard Worker
33*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_IOCTL_MAGIC 44313
34*08b48e0bSAndroid Build Coastguard Worker
35*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_IOCTL_DO _IO(AFL_SNAPSHOT_IOCTL_MAGIC, 1)
36*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_IOCTL_CLEAN _IO(AFL_SNAPSHOT_IOCTL_MAGIC, 2)
37*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_EXCLUDE_VMRANGE \
38*08b48e0bSAndroid Build Coastguard Worker _IOR(AFL_SNAPSHOT_IOCTL_MAGIC, 3, struct afl_snapshot_vmrange_args *)
39*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_INCLUDE_VMRANGE \
40*08b48e0bSAndroid Build Coastguard Worker _IOR(AFL_SNAPSHOT_IOCTL_MAGIC, 4, struct afl_snapshot_vmrange_args *)
41*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_IOCTL_TAKE _IOR(AFL_SNAPSHOT_IOCTL_MAGIC, 5, int)
42*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_IOCTL_RESTORE _IO(AFL_SNAPSHOT_IOCTL_MAGIC, 6)
43*08b48e0bSAndroid Build Coastguard Worker
44*08b48e0bSAndroid Build Coastguard Worker // Trace new mmaped ares and unmap them on restore.
45*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_MMAP 1
46*08b48e0bSAndroid Build Coastguard Worker // Do not snapshot any page (by default all writeable not-shared pages
47*08b48e0bSAndroid Build Coastguard Worker // are shanpshotted.
48*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_BLOCK 2
49*08b48e0bSAndroid Build Coastguard Worker // Snapshot file descriptor state, close newly opened descriptors
50*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_FDS 4
51*08b48e0bSAndroid Build Coastguard Worker // Snapshot registers state
52*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_REGS 8
53*08b48e0bSAndroid Build Coastguard Worker // Perform a restore when exit_group is invoked
54*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_EXIT 16
55*08b48e0bSAndroid Build Coastguard Worker // TODO(andrea) allow not COW snapshots (high perf on small processes)
56*08b48e0bSAndroid Build Coastguard Worker // Disable COW, restore all the snapshotted pages
57*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_NOCOW 32
58*08b48e0bSAndroid Build Coastguard Worker // Do not snapshot Stack pages
59*08b48e0bSAndroid Build Coastguard Worker #define AFL_SNAPSHOT_NOSTACK 64
60*08b48e0bSAndroid Build Coastguard Worker
61*08b48e0bSAndroid Build Coastguard Worker struct afl_snapshot_vmrange_args {
62*08b48e0bSAndroid Build Coastguard Worker
63*08b48e0bSAndroid Build Coastguard Worker unsigned long start, end;
64*08b48e0bSAndroid Build Coastguard Worker
65*08b48e0bSAndroid Build Coastguard Worker };
66*08b48e0bSAndroid Build Coastguard Worker
67*08b48e0bSAndroid Build Coastguard Worker static int afl_snapshot_dev_fd;
68*08b48e0bSAndroid Build Coastguard Worker
afl_snapshot_init(void)69*08b48e0bSAndroid Build Coastguard Worker static int afl_snapshot_init(void) {
70*08b48e0bSAndroid Build Coastguard Worker
71*08b48e0bSAndroid Build Coastguard Worker afl_snapshot_dev_fd = open(AFL_SNAPSHOT_FILE_NAME, 0);
72*08b48e0bSAndroid Build Coastguard Worker return afl_snapshot_dev_fd;
73*08b48e0bSAndroid Build Coastguard Worker
74*08b48e0bSAndroid Build Coastguard Worker }
75*08b48e0bSAndroid Build Coastguard Worker
afl_snapshot_exclude_vmrange(void * start,void * end)76*08b48e0bSAndroid Build Coastguard Worker static void afl_snapshot_exclude_vmrange(void *start, void *end) {
77*08b48e0bSAndroid Build Coastguard Worker
78*08b48e0bSAndroid Build Coastguard Worker struct afl_snapshot_vmrange_args args = {(unsigned long)start,
79*08b48e0bSAndroid Build Coastguard Worker (unsigned long)end};
80*08b48e0bSAndroid Build Coastguard Worker ioctl(afl_snapshot_dev_fd, AFL_SNAPSHOT_EXCLUDE_VMRANGE, &args);
81*08b48e0bSAndroid Build Coastguard Worker
82*08b48e0bSAndroid Build Coastguard Worker }
83*08b48e0bSAndroid Build Coastguard Worker
afl_snapshot_include_vmrange(void * start,void * end)84*08b48e0bSAndroid Build Coastguard Worker static void afl_snapshot_include_vmrange(void *start, void *end) {
85*08b48e0bSAndroid Build Coastguard Worker
86*08b48e0bSAndroid Build Coastguard Worker struct afl_snapshot_vmrange_args args = {(unsigned long)start,
87*08b48e0bSAndroid Build Coastguard Worker (unsigned long)end};
88*08b48e0bSAndroid Build Coastguard Worker ioctl(afl_snapshot_dev_fd, AFL_SNAPSHOT_INCLUDE_VMRANGE, &args);
89*08b48e0bSAndroid Build Coastguard Worker
90*08b48e0bSAndroid Build Coastguard Worker }
91*08b48e0bSAndroid Build Coastguard Worker
afl_snapshot_take(int config)92*08b48e0bSAndroid Build Coastguard Worker static int afl_snapshot_take(int config) {
93*08b48e0bSAndroid Build Coastguard Worker
94*08b48e0bSAndroid Build Coastguard Worker return ioctl(afl_snapshot_dev_fd, AFL_SNAPSHOT_IOCTL_TAKE, config);
95*08b48e0bSAndroid Build Coastguard Worker
96*08b48e0bSAndroid Build Coastguard Worker }
97*08b48e0bSAndroid Build Coastguard Worker
afl_snapshot_do(void)98*08b48e0bSAndroid Build Coastguard Worker static int afl_snapshot_do(void) {
99*08b48e0bSAndroid Build Coastguard Worker
100*08b48e0bSAndroid Build Coastguard Worker return ioctl(afl_snapshot_dev_fd, AFL_SNAPSHOT_IOCTL_DO);
101*08b48e0bSAndroid Build Coastguard Worker
102*08b48e0bSAndroid Build Coastguard Worker }
103*08b48e0bSAndroid Build Coastguard Worker
afl_snapshot_restore(void)104*08b48e0bSAndroid Build Coastguard Worker static void afl_snapshot_restore(void) {
105*08b48e0bSAndroid Build Coastguard Worker
106*08b48e0bSAndroid Build Coastguard Worker ioctl(afl_snapshot_dev_fd, AFL_SNAPSHOT_IOCTL_RESTORE);
107*08b48e0bSAndroid Build Coastguard Worker
108*08b48e0bSAndroid Build Coastguard Worker }
109*08b48e0bSAndroid Build Coastguard Worker
afl_snapshot_clean(void)110*08b48e0bSAndroid Build Coastguard Worker static void afl_snapshot_clean(void) {
111*08b48e0bSAndroid Build Coastguard Worker
112*08b48e0bSAndroid Build Coastguard Worker ioctl(afl_snapshot_dev_fd, AFL_SNAPSHOT_IOCTL_CLEAN);
113*08b48e0bSAndroid Build Coastguard Worker
114*08b48e0bSAndroid Build Coastguard Worker }
115*08b48e0bSAndroid Build Coastguard Worker
116