You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

206 lines
5.3 KiB

# Zapret eBPF Makefile
# eBPF implementation for DPI evasion
# Compiler and tools
CC := clang
LLC := llc
OPT := opt
DIS := llvm-dis
OBJDUMP := llvm-objdump
STRIP := llvm-strip
# Directories
SRC_DIR := src
LOADER_DIR := loader
INCLUDE_DIR := include
LIBBPF_DIR := libbpf
BUILD_DIR := build
OBJ_DIR := $(BUILD_DIR)/obj
BIN_DIR := $(BUILD_DIR)/bin
# Platform detection
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
PLATFORM := linux
EBPF_SUPPORTED := yes
CFLAGS := -O2 -g -Wall -Wextra
EBPF_CFLAGS := -O2 -g -target bpf -D__TARGET_ARCH_x86_64 -D__KERNEL__ -D__ASM_SYSREG_H
INCLUDES := -I$(INCLUDE_DIR) -I$(LIBBPF_DIR)/src -I/usr/include
LDFLAGS := -L$(LIBBPF_DIR)/src -lbpf -lelf -lz
else ifeq ($(UNAME_S),Darwin)
PLATFORM := macos
EBPF_SUPPORTED := no
CFLAGS := -O2 -g -Wall -Wextra -D__APPLE__ -D__MACH__ -DMACOS_BUILD
EBPF_CFLAGS := -O2 -g -D__APPLE__ -D__MACH__ -DMACOS_BUILD
INCLUDES := -I$(INCLUDE_DIR) -I/usr/local/include
LDFLAGS := -L/usr/local/lib
else
PLATFORM := unknown
EBPF_SUPPORTED := no
CFLAGS := -O2 -g -Wall -Wextra
EBPF_CFLAGS := -O2 -g
INCLUDES := -I$(INCLUDE_DIR)
LDFLAGS :=
endif
# Legacy compatibility
LLVM_STRIP ?= $(STRIP)
CLANG ?= $(CC)
LIBBPF_OBJ = $(LIBBPF_DIR)/src/libbpf.a
BPF_CFLAGS = $(EBPF_CFLAGS)
# eBPF program sources
EBPF_SRCS = src/zapret_filter.bpf.c \
src/tls_fingerprint.bpf.c \
src/quic_filter.bpf.c \
src/packet_fragment.bpf.c \
src/sni_encrypt.bpf.c
# eBPF object files
EBPF_OBJS = $(EBPF_SRCS:.bpf.c=.bpf.o)
# User-space loader sources
LOADER_SRCS = loader/zapret_loader.c \
loader/ebpf_manager.c \
loader/performance_monitor.c
# User-space loader objects
LOADER_OBJS = $(LOADER_SRCS:.c=.o)
# Target executables
TARGETS = zapret_ebpf_loader
.PHONY: all clean install libbpf ebpf_programs user_space
ifeq ($(EBPF_SUPPORTED),yes)
all: libbpf $(TARGETS)
@echo "Build complete for $(PLATFORM) platform with eBPF support"
else
all: user_space
@echo "Build complete for $(PLATFORM) platform"
endif
# Build libbpf (Linux only)
ifeq ($(EBPF_SUPPORTED),yes)
libbpf: $(LIBBPF_OBJ)
$(LIBBPF_OBJ):
@if [ ! -d "$(LIBBPF_DIR)" ]; then \
echo "Cloning libbpf..."; \
git clone --depth 1 https://github.com/libbpf/libbpf.git $(LIBBPF_DIR); \
fi
$(MAKE) -C $(LIBBPF_DIR)/src
else
libbpf:
@echo "SKIP libbpf (not supported on $(PLATFORM))"
$(LIBBPF_OBJ):
@touch $@
endif
# Compile eBPF programs (Linux only)
ifeq ($(EBPF_SUPPORTED),yes)
%.bpf.o: %.bpf.c
$(CLANG) $(BPF_CFLAGS) $(INCLUDES) -c $< -o $@
$(LLVM_STRIP) -g $@
else
%.bpf.o: %.bpf.c
@echo "SKIP $@ (eBPF not supported on $(PLATFORM))"
@touch $@
endif
# Compile user-space loader
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
# Link the main loader
ifeq ($(EBPF_SUPPORTED),yes)
zapret_ebpf_loader: $(EBPF_OBJS) $(LOADER_OBJS) $(LIBBPF_OBJ)
$(CC) $(CFLAGS) $(LOADER_OBJS) $(LIBBPF_OBJ) -lelf -lz -o $@
else
zapret_ebpf_loader: $(LOADER_OBJS)
$(CC) $(CFLAGS) $(LOADER_OBJS) $(LDFLAGS) -o $@
endif
install: all
cp $(TARGETS) /usr/local/bin/
cp $(EBPF_OBJS) /usr/local/share/zapret/ebpf/
clean:
rm -f $(EBPF_OBJS) $(LOADER_OBJS) $(TARGETS)
@if [ -d "$(LIBBPF_DIR)" ]; then \
$(MAKE) -C $(LIBBPF_DIR)/src clean; \
fi
distclean: clean
rm -rf $(LIBBPF_DIR)
# Development targets
format:
@echo "Formatting source code..."
@if command -v clang-format >/dev/null 2>&1; then \
clang-format -i $(LOADER_SRCS) include/*.h src/*.c; \
echo "Code formatting completed"; \
else \
echo "clang-format not found, skipping formatting"; \
fi
check:
@echo "Checking eBPF programs and source code..."
@echo "Checking syntax with clang..."
@for src in $(LOADER_SRCS); do \
echo "Checking $$src"; \
$(CC) $(CFLAGS) $(INCLUDES) -fsyntax-only $$src || exit 1; \
done
ifeq ($(EBPF_SUPPORTED),yes)
@echo "Verifying eBPF programs..."
@for prog in $(EBPF_OBJS); do \
if [ -f "$$prog" ]; then \
echo "Verifying $$prog"; \
if command -v bpftool >/dev/null 2>&1; then \
bpftool prog load $$prog /sys/fs/bpf/test_$$prog 2>/dev/null && \
bpftool prog del pinned /sys/fs/bpf/test_$$prog || true; \
else \
echo "bpftool not found, skipping eBPF verification"; \
fi; \
fi; \
done
else
@echo "eBPF verification skipped (not supported on $(PLATFORM))"
endif
@echo "All checks completed"
# macOS target
mac: user_space
@echo "macOS build completed"
# Help target
help:
@echo "Zapret eBPF Build System"
@echo "========================"
@echo "Platform: $(PLATFORM)"
@echo "eBPF Support: $(EBPF_SUPPORTED)"
@echo ""
@echo "Available targets:"
@echo " all - Build all eBPF programs and loader"
@echo " mac - Build for macOS"
@echo " libbpf - Build libbpf dependency (Linux only)"
@echo " install - Install binaries to system directories"
@echo " clean - Clean build artifacts"
@echo " distclean - Clean everything including dependencies"
@echo " format - Format source code with clang-format"
@echo " check - Verify eBPF programs and check syntax"
@echo " help - Show this help message"
@echo ""
@echo "Build Configuration:"
@echo " CC = $(CC)"
@echo " CFLAGS = $(CFLAGS)"
@echo " INCLUDES = $(INCLUDES)"
@echo " LDFLAGS = $(LDFLAGS)"
@echo ""
@echo "Source Files:"
@echo " eBPF Programs: $(EBPF_SRCS)"
@echo " Loader Sources: $(LOADER_SRCS)"
@echo " Target: $(TARGETS)"