Files
2025-08-04 16:16:47 +02:00

946 lines
62 KiB
Makefile

#!/usr/bin/make -f
# GNU General Public License, version 2.0.
#
# Copyright (c) 2025 Tijme Gommers (@tijme).
#
# This source code file is part of Dittobytes. Dittobytes is
# licensed under GNU General Public License, version 2.0, and
# you are free to use, modify, and distribute this file under
# its terms. However, any modified versions of this file must
# include this same license and copyright notice.
##########################################
## Globals ##
##########################################
SOURCE_PATH ?= ./code/beacon.c
BUILD_DIR := ./build
TESTS_DIR := ./ditto/tests
PYTHON_PATH := python3
LLVM_DIR_WIN := /opt/llvm-winlin/bin
LLVM_DIR_LIN := /opt/llvm-winlin/bin
LLVM_DIR_MAC := /usr/bin
ENTRY_FUNCTION ?= shellcode
DEBUG := false
EXPAND_MEMCPY_CALLS ?= true
EXPAND_MEMSET_CALLS ?= true
MOVE_GLOBALS_TO_STACK ?= true
IS_COMPILER_CONTAINER := $(shell if [ "$(IS_COMPILER_CONTAINER)" = "true" ] || [ -f /tmp/.dittobytes-env-all-encompassing ]; then echo "true"; else echo "false"; fi)
##########################################
## Your build(s) ##
##########################################
WIN_AMD64_BEACON_NAME := beacon-win-amd64
EXE_WIN_AMD64_BEACON_NAME := beacon-win-amd64-exe
RAW_WIN_AMD64_BEACON_NAME := beacon-win-amd64-raw
BOF_WIN_AMD64_BEACON_NAME := beacon-win-amd64-bof
WIN_ARM64_BEACON_NAME := beacon-win-arm64
EXE_WIN_ARM64_BEACON_NAME := beacon-win-arm64-exe
RAW_WIN_ARM64_BEACON_NAME := beacon-win-arm64-raw
BOF_WIN_ARM64_BEACON_NAME := beacon-win-arm64-bof
LIN_AMD64_BEACON_NAME := beacon-lin-amd64
EXE_LIN_AMD64_BEACON_NAME := beacon-lin-amd64-exe
RAW_LIN_AMD64_BEACON_NAME := beacon-lin-amd64-raw
BOF_LIN_AMD64_BEACON_NAME := beacon-lin-amd64-bof
LIN_ARM64_BEACON_NAME := beacon-lin-arm64
EXE_LIN_ARM64_BEACON_NAME := beacon-lin-arm64-exe
RAW_LIN_ARM64_BEACON_NAME := beacon-lin-arm64-raw
BOF_LIN_ARM64_BEACON_NAME := beacon-lin-arm64-bof
MAC_AMD64_BEACON_NAME := beacon-mac-amd64
EXE_MAC_AMD64_BEACON_NAME := beacon-mac-amd64-exe
RAW_MAC_AMD64_BEACON_NAME := beacon-mac-amd64-raw
BOF_MAC_AMD64_BEACON_NAME := beacon-mac-amd64-bof
MAC_ARM64_BEACON_NAME := beacon-mac-arm64
EXE_MAC_ARM64_BEACON_NAME := beacon-mac-arm64-exe
RAW_MAC_ARM64_BEACON_NAME := beacon-mac-arm64-raw
BOF_MAC_ARM64_BEACON_NAME := beacon-mac-arm64-bof
##########################################
## Metamorphications ##
##########################################
MM_DEFAULT ?= true
MM_TEST_DEFAULT ?= false
MM_TRANSFORM_REG_MOV_IMMEDIATES ?= $(MM_DEFAULT)
MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES ?= $(MM_TEST_DEFAULT)
MM_TRANSFORM_STACK_MOV_IMMEDIATES ?= $(MM_DEFAULT)
MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES ?= $(MM_TEST_DEFAULT)
MM_TRANSFORM_NULLIFICATIONS ?= $(MM_DEFAULT)
MM_TEST_TRANSFORM_NULLIFICATIONS ?= $(MM_TEST_DEFAULT)
MM_RANDOMIZE_REGISTER_ALLOCATION ?= $(MM_DEFAULT)
MM_TEST_RANDOMIZE_REGISTER_ALLOCATION ?= $(MM_TEST_DEFAULT)
MM_RANDOMIZE_FRAME_INSERTIONS ?= $(MM_DEFAULT)
MM_TEST_RANDOMIZE_FRAME_INSERTIONS ?= $(MM_TEST_DEFAULT)
MM_INSERT_SEMANTIC_NOISE ?= $(MM_DEFAULT)
MM_TEST_INSERT_SEMANTIC_NOISE ?= $(MM_TEST_DEFAULT)
##########################################
## Platform & architecture ##
##########################################
ifeq ($(OS),Windows_NT)
CURRENT_PLATFORM := win
PYTHON_PATH := python
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
CURRENT_ARCHITECTURE := amd64
else ifeq ($(PROCESSOR_ARCHITECTURE),ARM64)
CURRENT_ARCHITECTURE := arm64
else
$(error "Dittobytes does not work on Windows-based platforms with architecture: $(UNAME_M)")
endif
else
UNAME_S := $(shell uname -s)
UNAME_M := $(shell uname -m)
ifeq ($(UNAME_S),Linux)
CURRENT_PLATFORM := lin
else ifeq ($(UNAME_S),Darwin)
CURRENT_PLATFORM := mac
else
$(error "Dittobytes does not recognize platform: $(UNAME_S)")
endif
ifeq ($(UNAME_M),x86_64)
CURRENT_ARCHITECTURE := amd64
else ifeq ($(filter $(UNAME_M),aarch64 arm64),$(UNAME_M))
CURRENT_ARCHITECTURE := arm64
else
$(error "Dittobytes does not work on Unix-based platforms with architecture: $(UNAME_M)")
endif
endif
##########################################
## Default runs ##
##########################################
# By default compile all beacons
all: check_environment beacons
# Alias for all beacons
beacons: check_environment beacon-all-all-all
# All code/beacons
beacon-all-all-all: check_environment \
$(EXE_WIN_AMD64_BEACON_NAME) \
$(RAW_WIN_AMD64_BEACON_NAME) \
$(BOF_WIN_AMD64_BEACON_NAME) \
$(EXE_WIN_ARM64_BEACON_NAME) \
$(RAW_WIN_ARM64_BEACON_NAME) \
$(BOF_WIN_ARM64_BEACON_NAME) \
$(EXE_LIN_AMD64_BEACON_NAME) \
$(RAW_LIN_AMD64_BEACON_NAME) \
$(BOF_LIN_AMD64_BEACON_NAME) \
$(EXE_LIN_ARM64_BEACON_NAME) \
$(RAW_LIN_ARM64_BEACON_NAME) \
$(BOF_LIN_ARM64_BEACON_NAME) \
$(EXE_MAC_AMD64_BEACON_NAME) \
$(RAW_MAC_AMD64_BEACON_NAME) \
$(BOF_MAC_AMD64_BEACON_NAME) \
$(EXE_MAC_ARM64_BEACON_NAME) \
$(RAW_MAC_ARM64_BEACON_NAME) \
$(BOF_MAC_ARM64_BEACON_NAME)
# Format specific code/beacons (compile all code for a specific format)
beacon-all-all-exe: check_environment $(EXE_WIN_AMD64_BEACON_NAME) $(EXE_WIN_ARM64_BEACON_NAME) $(EXE_LIN_AMD64_BEACON_NAME) $(EXE_LIN_ARM64_BEACON_NAME) $(EXE_MAC_AMD64_BEACON_NAME) $(EXE_MAC_ARM64_BEACON_NAME)
beacon-all-all-raw: check_environment $(RAW_WIN_AMD64_BEACON_NAME) $(RAW_WIN_ARM64_BEACON_NAME) $(RAW_LIN_AMD64_BEACON_NAME) $(RAW_LIN_ARM64_BEACON_NAME) $(RAW_MAC_AMD64_BEACON_NAME) $(RAW_MAC_ARM64_BEACON_NAME)
beacon-all-all-bof: check_environment $(BOF_WIN_AMD64_BEACON_NAME) $(BOF_WIN_ARM64_BEACON_NAME) $(BOF_LIN_AMD64_BEACON_NAME) $(BOF_LIN_ARM64_BEACON_NAME) $(BOF_MAC_AMD64_BEACON_NAME) $(BOF_MAC_ARM64_BEACON_NAME)
# Platform specific code/beacons (compile all code for a specific platform)
beacon-win-all-all: check_environment $(EXE_WIN_AMD64_BEACON_NAME) $(EXE_WIN_ARM64_BEACON_NAME) $(RAW_WIN_AMD64_BEACON_NAME) $(RAW_WIN_ARM64_BEACON_NAME) $(BOF_WIN_AMD64_BEACON_NAME) $(BOF_WIN_ARM64_BEACON_NAME)
beacon-lin-all-all: check_environment $(EXE_LIN_AMD64_BEACON_NAME) $(EXE_LIN_ARM64_BEACON_NAME) $(RAW_LIN_AMD64_BEACON_NAME) $(RAW_LIN_ARM64_BEACON_NAME) $(BOF_LIN_AMD64_BEACON_NAME) $(BOF_LIN_ARM64_BEACON_NAME)
beacon-mac-all-all: check_environment $(EXE_MAC_AMD64_BEACON_NAME) $(EXE_MAC_ARM64_BEACON_NAME) $(RAW_MAC_AMD64_BEACON_NAME) $(RAW_MAC_ARM64_BEACON_NAME) $(BOF_MAC_AMD64_BEACON_NAME) $(BOF_MAC_ARM64_BEACON_NAME)
# Architecture specific code/beacons (compile all code for a specific architecture)
beacon-all-amd64-all: check_environment $(EXE_WIN_AMD64_BEACON_NAME) $(RAW_WIN_AMD64_BEACON_NAME) $(BOF_WIN_AMD64_BEACON_NAME) $(EXE_LIN_AMD64_BEACON_NAME) $(RAW_LIN_AMD64_BEACON_NAME) $(BOF_LIN_AMD64_BEACON_NAME) $(EXE_MAC_AMD64_BEACON_NAME) $(RAW_MAC_AMD64_BEACON_NAME) $(BOF_MAC_AMD64_BEACON_NAME)
beacon-all-arm64-all: check_environment $(EXE_WIN_ARM64_BEACON_NAME) $(RAW_WIN_ARM64_BEACON_NAME) $(BOF_WIN_ARM64_BEACON_NAME) $(EXE_LIN_ARM64_BEACON_NAME) $(RAW_LIN_ARM64_BEACON_NAME) $(BOF_LIN_ARM64_BEACON_NAME) $(EXE_MAC_ARM64_BEACON_NAME) $(RAW_MAC_ARM64_BEACON_NAME) $(BOF_MAC_ARM64_BEACON_NAME)
# Format & platform specific code/beacons
beacon-win-all-exe: check_environment $(EXE_WIN_AMD64_BEACON_NAME) $(EXE_WIN_ARM64_BEACON_NAME)
beacon-lin-all-exe: check_environment $(EXE_LIN_AMD64_BEACON_NAME) $(EXE_LIN_ARM64_BEACON_NAME)
beacon-mac-all-exe: check_environment $(EXE_MAC_AMD64_BEACON_NAME) $(EXE_MAC_ARM64_BEACON_NAME)
beacon-win-all-raw: check_environment $(RAW_WIN_AMD64_BEACON_NAME) $(RAW_WIN_ARM64_BEACON_NAME)
beacon-lin-all-raw: check_environment $(RAW_LIN_AMD64_BEACON_NAME) $(RAW_LIN_ARM64_BEACON_NAME)
beacon-mac-all-raw: check_environment $(RAW_MAC_AMD64_BEACON_NAME) $(RAW_MAC_ARM64_BEACON_NAME)
beacon-win-all-bof: check_environment $(BOF_WIN_AMD64_BEACON_NAME) $(BOF_WIN_ARM64_BEACON_NAME)
beacon-lin-all-bof: check_environment $(BOF_LIN_AMD64_BEACON_NAME) $(BOF_LIN_ARM64_BEACON_NAME)
beacon-mac-all-bof: check_environment $(BOF_MAC_AMD64_BEACON_NAME) $(BOF_MAC_ARM64_BEACON_NAME)
# Format & architecture specific code/beacons
beacon-all-amd64-exe: check_environment $(EXE_WIN_AMD64_BEACON_NAME) $(EXE_LIN_AMD64_BEACON_NAME) $(EXE_MAC_AMD64_BEACON_NAME)
beacon-all-arm64-exe: check_environment $(EXE_WIN_ARM64_BEACON_NAME) $(EXE_LIN_ARM64_BEACON_NAME) $(EXE_MAC_ARM64_BEACON_NAME)
beacon-all-amd64-raw: check_environment $(RAW_WIN_AMD64_BEACON_NAME) $(RAW_LIN_AMD64_BEACON_NAME) $(RAW_MAC_AMD64_BEACON_NAME)
beacon-all-arm64-raw: check_environment $(RAW_WIN_ARM64_BEACON_NAME) $(RAW_LIN_ARM64_BEACON_NAME) $(RAW_MAC_ARM64_BEACON_NAME)
beacon-all-amd64-bof: check_environment $(BOF_WIN_AMD64_BEACON_NAME) $(BOF_LIN_AMD64_BEACON_NAME) $(BOF_MAC_AMD64_BEACON_NAME)
beacon-all-arm64-bof: check_environment $(BOF_WIN_ARM64_BEACON_NAME) $(BOF_LIN_ARM64_BEACON_NAME) $(BOF_MAC_ARM64_BEACON_NAME)
# Platform & architecture specific code/beacons
beacon-win-amd64-all: check_environment $(EXE_WIN_AMD64_BEACON_NAME) $(RAW_WIN_AMD64_BEACON_NAME) $(BOF_WIN_AMD64_BEACON_NAME)
beacon-lin-amd64-all: check_environment $(EXE_LIN_AMD64_BEACON_NAME) $(RAW_LIN_AMD64_BEACON_NAME) $(BOF_LIN_AMD64_BEACON_NAME)
beacon-mac-amd64-all: check_environment $(EXE_MAC_AMD64_BEACON_NAME) $(RAW_MAC_AMD64_BEACON_NAME) $(BOF_MAC_AMD64_BEACON_NAME)
beacon-win-arm64-all: check_environment $(EXE_WIN_ARM64_BEACON_NAME) $(RAW_WIN_ARM64_BEACON_NAME) $(BOF_WIN_ARM64_BEACON_NAME)
beacon-lin-arm64-all: check_environment $(EXE_LIN_ARM64_BEACON_NAME) $(RAW_LIN_ARM64_BEACON_NAME) $(BOF_LIN_ARM64_BEACON_NAME)
beacon-mac-arm64-all: check_environment $(EXE_MAC_ARM64_BEACON_NAME) $(RAW_MAC_ARM64_BEACON_NAME) $(BOF_MAC_ARM64_BEACON_NAME)
# Dittobytes loaders
ditto-loaders: check_environment
@echo "[+] Calling \`all\` in loaders makefile."
@$(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) --no-print-directory -C ./ditto/loaders/
# Dittobytes transpilers
ditto-transpilers: check_environment
@echo "[+] Calling \`all\` in intermediate transpiler makefile."
@$(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) --no-print-directory -C ./ditto/transpilers/intermediate/
@echo "[+] Calling \`all\` in machine transpiler makefile."
@$(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) --no-print-directory -C ./ditto/transpilers/machine/
# Everything
extensive: check_environment ditto-transpilers ditto-loaders code
##########################################
## Test suite ##
##########################################
test-suite-build: check_environment
@set -e; \
for AVAILABLE_TEST_OS in $(TESTS_DIR)/*; do \
for AVAILABLE_TEST_ARCH in $$AVAILABLE_TEST_OS/*; do \
for TEST_FILE in $$AVAILABLE_TEST_ARCH/*; do \
[ -f "$$TEST_FILE" ] || continue; \
AVAILABLE_TEST_OS_BASENAME=$$(basename "$$AVAILABLE_TEST_OS"); \
AVAILABLE_TEST_ARCH_BASENAME=$$(basename "$$AVAILABLE_TEST_ARCH"); \
AVAILABLE_TEST_FILE_BASENAME=$$(basename "$$TEST_FILE"); \
[ -n "$(TEST_SOURCE_PATH)" ] && [ "$$(realpath "$$TEST_FILE")" != "$$(realpath $(TEST_SOURCE_PATH))" ] && continue; \
[ -n "$(TEST_OS)" ] && [ "$$AVAILABLE_TEST_OS_BASENAME" != "all" ] && [ "$$AVAILABLE_TEST_OS_BASENAME" != "$(TEST_OS)" ] && continue; \
[ -n "$(TEST_ARCH)" ] && [ "$$AVAILABLE_TEST_ARCH_BASENAME" != "all" ] && [ "$$AVAILABLE_TEST_ARCH_BASENAME" != "$(TEST_ARCH)" ] && continue; \
if [ -n "$(TEST_OS)" ]; then BEACON_OS="$(TEST_OS)"; else BEACON_OS="$$AVAILABLE_TEST_OS_BASENAME"; fi; \
if [ -n "$(TEST_ARCH)" ]; then BEACON_ARCH="$(TEST_ARCH)"; else BEACON_ARCH="$$AVAILABLE_TEST_ARCH_BASENAME"; fi; \
echo "[+] TestSuite building \`$$AVAILABLE_TEST_OS_BASENAME-$$AVAILABLE_TEST_ARCH_BASENAME-$$AVAILABLE_TEST_FILE_BASENAME\` for \`$$BEACON_OS-$$BEACON_ARCH\`."; \
[ -z "$(TEST_METAMORPHICATION)" ] || [ "$(TEST_METAMORPHICATION)" = "original" ] && $(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) SOURCE_PATH="$$TEST_FILE" BEACON_NAME=$(basename $(notdir $(TESTS_DIR)))_$${AVAILABLE_TEST_OS_BASENAME}_$${AVAILABLE_TEST_ARCH_BASENAME}_$${AVAILABLE_TEST_FILE_BASENAME%.*}_original MM_DEFAULT=false MM_TEST_DEFAULT=false --no-print-directory beacon-$$BEACON_OS-$$BEACON_ARCH-all; \
[ -z "$(TEST_METAMORPHICATION)" ] || [ "$(TEST_METAMORPHICATION)" = "transpiled" ] && $(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) SOURCE_PATH="$$TEST_FILE" BEACON_NAME=$(basename $(notdir $(TESTS_DIR)))_$${AVAILABLE_TEST_OS_BASENAME}_$${AVAILABLE_TEST_ARCH_BASENAME}_$${AVAILABLE_TEST_FILE_BASENAME%.*}_transpiled_1 MM_DEFAULT=true MM_TEST_DEFAULT=true --no-print-directory beacon-$$BEACON_OS-$$BEACON_ARCH-all; \
[ -z "$(TEST_METAMORPHICATION)" ] || [ "$(TEST_METAMORPHICATION)" = "transpiled" ] && $(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) SOURCE_PATH="$$TEST_FILE" BEACON_NAME=$(basename $(notdir $(TESTS_DIR)))_$${AVAILABLE_TEST_OS_BASENAME}_$${AVAILABLE_TEST_ARCH_BASENAME}_$${AVAILABLE_TEST_FILE_BASENAME%.*}_transpiled_2 MM_DEFAULT=true MM_TEST_DEFAULT=true --no-print-directory beacon-$$BEACON_OS-$$BEACON_ARCH-all; \
[ -z "$(TEST_METAMORPHICATION)" ] || [ "$(TEST_METAMORPHICATION)" = "transform_reg_mov_immediates" ] && $(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) SOURCE_PATH="$$TEST_FILE" BEACON_NAME=$(basename $(notdir $(TESTS_DIR)))_$${AVAILABLE_TEST_OS_BASENAME}_$${AVAILABLE_TEST_ARCH_BASENAME}_$${AVAILABLE_TEST_FILE_BASENAME%.*}_transform_reg_mov_immediates MM_DEFAULT=false MM_TEST_DEFAULT=false MM_TRANSFORM_REG_MOV_IMMEDIATES=true MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=true --no-print-directory beacon-$$BEACON_OS-$$BEACON_ARCH-all; \
[ -z "$(TEST_METAMORPHICATION)" ] || [ "$(TEST_METAMORPHICATION)" = "transform_stack_mov_immediates" ] && $(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) SOURCE_PATH="$$TEST_FILE" BEACON_NAME=$(basename $(notdir $(TESTS_DIR)))_$${AVAILABLE_TEST_OS_BASENAME}_$${AVAILABLE_TEST_ARCH_BASENAME}_$${AVAILABLE_TEST_FILE_BASENAME%.*}_transform_stack_mov_immediates MM_DEFAULT=false MM_TEST_DEFAULT=false MM_TRANSFORM_STACK_MOV_IMMEDIATES=true MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=true --no-print-directory beacon-$$BEACON_OS-$$BEACON_ARCH-all; \
[ -z "$(TEST_METAMORPHICATION)" ] || [ "$(TEST_METAMORPHICATION)" = "transform_nullifications" ] && $(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) SOURCE_PATH="$$TEST_FILE" BEACON_NAME=$(basename $(notdir $(TESTS_DIR)))_$${AVAILABLE_TEST_OS_BASENAME}_$${AVAILABLE_TEST_ARCH_BASENAME}_$${AVAILABLE_TEST_FILE_BASENAME%.*}_transform_nullifications MM_DEFAULT=false MM_TEST_DEFAULT=false MM_TRANSFORM_NULLIFICATIONS=true MM_TEST_TRANSFORM_NULLIFICATIONS=true --no-print-directory beacon-$$BEACON_OS-$$BEACON_ARCH-all; \
[ -z "$(TEST_METAMORPHICATION)" ] || [ "$(TEST_METAMORPHICATION)" = "randomize_register_allocation" ] && $(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) SOURCE_PATH="$$TEST_FILE" BEACON_NAME=$(basename $(notdir $(TESTS_DIR)))_$${AVAILABLE_TEST_OS_BASENAME}_$${AVAILABLE_TEST_ARCH_BASENAME}_$${AVAILABLE_TEST_FILE_BASENAME%.*}_randomize_register_allocation MM_DEFAULT=false MM_TEST_DEFAULT=false MM_RANDOMIZE_REGISTER_ALLOCATION=true MM_TEST_RANDOMIZE_REGISTER_ALLOCATION=true --no-print-directory beacon-$$BEACON_OS-$$BEACON_ARCH-all; \
[ -z "$(TEST_METAMORPHICATION)" ] || [ "$(TEST_METAMORPHICATION)" = "randomize_frame_insertions" ] && $(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) SOURCE_PATH="$$TEST_FILE" BEACON_NAME=$(basename $(notdir $(TESTS_DIR)))_$${AVAILABLE_TEST_OS_BASENAME}_$${AVAILABLE_TEST_ARCH_BASENAME}_$${AVAILABLE_TEST_FILE_BASENAME%.*}_randomize_frame_insertions MM_DEFAULT=false MM_TEST_DEFAULT=false MM_RANDOMIZE_FRAME_INSERTIONS=true MM_TEST_RANDOMIZE_FRAME_INSERTIONS=true --no-print-directory beacon-$$BEACON_OS-$$BEACON_ARCH-all; \
[ -z "$(TEST_METAMORPHICATION)" ] || [ "$(TEST_METAMORPHICATION)" = "insert_semantic_noise" ] && $(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) SOURCE_PATH="$$TEST_FILE" BEACON_NAME=$(basename $(notdir $(TESTS_DIR)))_$${AVAILABLE_TEST_OS_BASENAME}_$${AVAILABLE_TEST_ARCH_BASENAME}_$${AVAILABLE_TEST_FILE_BASENAME%.*}_insert_semantic_noise MM_DEFAULT=false MM_TEST_DEFAULT=false MM_INSERT_SEMANTIC_NOISE=true MM_TEST_INSERT_SEMANTIC_NOISE=true --no-print-directory beacon-$$BEACON_OS-$$BEACON_ARCH-all; \
done \
done \
done
test-suite-test: check_environment
@set -e; \
for AVAILABLE_TEST_OS in $(TESTS_DIR)/*; do \
for AVAILABLE_TEST_ARCH in $$AVAILABLE_TEST_OS/*; do \
for TEST_FILE in $$AVAILABLE_TEST_ARCH/*; do \
[ -f "$$TEST_FILE" ] || continue; \
AVAILABLE_TEST_OS_BASENAME=$$(basename "$$AVAILABLE_TEST_OS"); \
AVAILABLE_TEST_ARCH_BASENAME=$$(basename "$$AVAILABLE_TEST_ARCH"); \
AVAILABLE_TEST_FILE_BASENAME=$$(basename "$$TEST_FILE"); \
[ -n "$(TEST_SOURCE_PATH)" ] && [ "$$(realpath "$$TEST_FILE")" != "$$(realpath $(TEST_SOURCE_PATH))" ] && continue; \
[ -n "$(TEST_OS)" ] && [ "$$AVAILABLE_TEST_OS_BASENAME" != "all" ] && [ "$$AVAILABLE_TEST_OS_BASENAME" != "$(TEST_OS)" ] && continue; \
[ -n "$(TEST_ARCH)" ] && [ "$$AVAILABLE_TEST_ARCH_BASENAME" != "all" ] && [ "$$AVAILABLE_TEST_ARCH_BASENAME" != "$(TEST_ARCH)" ] && continue; \
if [ -n "$(TEST_OS)" ]; then BEACON_OS="$(TEST_OS)"; else BEACON_OS="$${AVAILABLE_TEST_OS_BASENAME}"; fi; \
if [ -n "$(TEST_ARCH)" ]; then BEACON_ARCH="$(TEST_ARCH)"; else BEACON_ARCH="$${AVAILABLE_TEST_ARCH_BASENAME}"; fi; \
echo "[+] TestSuite testing \`$$AVAILABLE_TEST_OS_BASENAME-$$AVAILABLE_TEST_ARCH_BASENAME-$$AVAILABLE_TEST_FILE_BASENAME\` for \`$$BEACON_OS-$$BEACON_ARCH\`."; \
$(PYTHON_PATH) ./ditto/scripts/tests/test.py $${AVAILABLE_TEST_OS_BASENAME} $${AVAILABLE_TEST_ARCH_BASENAME} $${AVAILABLE_TEST_FILE_BASENAME%.*} $$TEST_FILE $$BEACON_OS $$BEACON_ARCH $$TEST_METAMORPHICATION; \
done; \
done; \
done; \
echo "[+] TestSuite finished successfully!";
test: test-suite-build test-suite-test
##########################################
## Environment check ##
##########################################
check_environment:
ifeq ($(IS_COMPILER_CONTAINER), false)
@echo "[+] It appears you are not running this command inside the \`Dittobytes Compiler Container\`."
@echo "[+] You can build it and run in in the root of the Dittobytes project directory."
@echo " $ docker buildx build -t dittobytes ."
@echo " $ docker run --rm -v ".:/tmp/workdir" -it dittobytes"
@read -p "[+] Do you want to continue anyway? (y/N) " CONTINUE && \
case "$$CONTINUE" in \
[yY][eE][sS]|[yY]) echo "[+] Continuing outside container..." ;; \
*) echo "[!] Aborting." && exit 1 ;; \
esac
$(eval IS_COMPILER_CONTAINER := true)
endif
##########################################
## Windows AMD64 ##
##########################################
WIN_AMD64_TARGET := x86_64-w64-mingw32
WIN_AMD64_DEFINES := -D__WINDOWS__ -D__AMD64__ -DEntryFunction=$(ENTRY_FUNCTION)
WIN_AMD64_BEACON_PATH := $(BUILD_DIR)/$(WIN_AMD64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))
WIN_AMD64_BEACON_CL1FLAGS := -target $(WIN_AMD64_TARGET) $(WIN_AMD64_DEFINES) -fuse-ld=lld -O0 -emit-llvm -S -g0 -fPIC -ffreestanding -nostdlib -nodefaultlibs -fno-stack-protector -fpass-plugin=./ditto/transpilers/intermediate/build/libIntermediateTranspiler-`arch`.so -Xclang -disable-O0-optnone -fPIC -fno-rtti -fno-exceptions -fno-delayed-template-parsing -fno-modules -fno-fast-math -fno-builtin -fno-elide-constructors -fno-access-control -fno-jump-tables -fno-omit-frame-pointer -fno-ident -fno-inline -fno-inline-functions -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
WIN_AMD64_BEACON_LLCFLAGS := -mtriple $(WIN_AMD64_TARGET) -march=x86-64 -O0 --relocation-model=pic $(if $(filter true,$(MM_RANDOMIZE_REGISTER_ALLOCATION)),--fast-randomize-register-allocation) $(if $(filter true,$(MM_RANDOMIZE_FRAME_INSERTIONS)),--randomize-frame-insertions-amd64 --randomize-frame-insertions-arm64)
WIN_AMD64_BEACON_CL2FLAGS := -target $(WIN_AMD64_TARGET) $(WIN_AMD64_DEFINES) -fuse-ld=lld -fPIC -ffreestanding -fno-stack-protector -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
$(WIN_AMD64_BEACON_PATH).ll: $(SOURCE_PATH) | $(BUILD_DIR)
@echo "[+] Compiling $(WIN_AMD64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))."
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) \
EXPAND_MEMCPY_CALLS=$(EXPAND_MEMCPY_CALLS) \
EXPAND_MEMSET_CALLS=$(EXPAND_MEMSET_CALLS) \
MOVE_GLOBALS_TO_STACK=$(MOVE_GLOBALS_TO_STACK) \
clang $(WIN_AMD64_BEACON_CL1FLAGS) $< -o $@
@$(PYTHON_PATH) ./ditto/scripts/make/modify-intermediate-metadata.py $@
$(WIN_AMD64_BEACON_PATH).meta0.mir: $(WIN_AMD64_BEACON_PATH).ll
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) llc $(WIN_AMD64_BEACON_LLCFLAGS) -stop-before=regallocfast -o $@ $<
$(WIN_AMD64_BEACON_PATH).meta1.mir: $(WIN_AMD64_BEACON_PATH).meta0.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) \
MACHINE_TRANSPILER_STEP=first \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(WIN_AMD64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(WIN_AMD64_BEACON_PATH).meta2.mir: $(WIN_AMD64_BEACON_PATH).meta1.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) llc $(WIN_AMD64_BEACON_LLCFLAGS) -start-before=regallocfast -stop-after=virtregrewriter -o $@ $<
$(WIN_AMD64_BEACON_PATH).meta3.mir: $(WIN_AMD64_BEACON_PATH).meta2.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) \
MACHINE_TRANSPILER_STEP=last \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(WIN_AMD64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(WIN_AMD64_BEACON_PATH).obj: $(WIN_AMD64_BEACON_PATH).meta3.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) llc $(WIN_AMD64_BEACON_LLCFLAGS) -filetype=obj -start-after=virtregrewriter -o $@ $<
@$(PYTHON_PATH) ./ditto/scripts/make/notify-user-about-bof.py $<
@PATH=$(LLVM_DIR_WIN):$(PATH) llvm-strip --strip-debug $@
$(WIN_AMD64_BEACON_PATH).lkd: $(WIN_AMD64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) clang $(WIN_AMD64_BEACON_CL2FLAGS) -e $(ENTRY_FUNCTION) -nostdlib -nodefaultlibs -o $@ $<
@PATH=$(LLVM_DIR_WIN):$(PATH) llvm-strip --strip-all $@
$(WIN_AMD64_BEACON_PATH).raw: $(WIN_AMD64_BEACON_PATH).lkd
@echo " - Intermediate compile of $@."
@$(PYTHON_PATH) ./ditto/scripts/make/extract-text-segment.py $< $@
$(WIN_AMD64_BEACON_PATH).exe: $(WIN_AMD64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) clang $(WIN_AMD64_BEACON_CL2FLAGS) -e $(ENTRY_FUNCTION) -nostdlib -nodefaultlibs -o $@ $<
@PATH=$(LLVM_DIR_WIN):$(PATH) llvm-strip --strip-all $@
$(EXE_WIN_AMD64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=__main --no-print-directory $(WIN_AMD64_BEACON_PATH).exe
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(WIN_AMD64_BEACON_PATH)*.lkd
@rm -f $(WIN_AMD64_BEACON_PATH)*.*mir
@rm -f $(WIN_AMD64_BEACON_PATH)*.ll
endif
@echo " - Done building EXE $@."
$(RAW_WIN_AMD64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=shellcode --no-print-directory $(WIN_AMD64_BEACON_PATH).raw
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(WIN_AMD64_BEACON_PATH)*.lkd
@rm -f $(WIN_AMD64_BEACON_PATH)*.*mir
@rm -f $(WIN_AMD64_BEACON_PATH)*.ll
endif
@echo " - Done building RAW $@."
$(BOF_WIN_AMD64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=go --no-print-directory $(WIN_AMD64_BEACON_PATH).obj
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(WIN_AMD64_BEACON_PATH)*.lkd
@rm -f $(WIN_AMD64_BEACON_PATH)*.*mir
@rm -f $(WIN_AMD64_BEACON_PATH)*.ll
endif
@echo " - Done building BOF $@."
##########################################
## Windows ARM64 ##
##########################################
WIN_ARM64_TARGET := aarch64-w64-mingw32
WIN_ARM64_DEFINES := -D__WINDOWS__ -D__ARM64__ -DEntryFunction=$(ENTRY_FUNCTION)
WIN_ARM64_BEACON_PATH := $(BUILD_DIR)/$(WIN_ARM64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))
WIN_ARM64_BEACON_CL1FLAGS := -target $(WIN_ARM64_TARGET) $(WIN_ARM64_DEFINES) -fuse-ld=lld -O0 -emit-llvm -S -g0 -fPIC -ffreestanding -nostdlib -nodefaultlibs -fno-stack-protector -fpass-plugin=./ditto/transpilers/intermediate/build/libIntermediateTranspiler-`arch`.so -Xclang -disable-O0-optnone -fPIC -fno-rtti -fno-exceptions -fno-delayed-template-parsing -fno-modules -fno-fast-math -fno-builtin -fno-elide-constructors -fno-access-control -fno-jump-tables -fno-omit-frame-pointer -fno-ident -fno-inline -fno-inline-functions -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
WIN_ARM64_BEACON_LLCFLAGS := -mtriple $(WIN_ARM64_TARGET) -march=aarch64 -O0 --relocation-model=pic $(if $(filter true,$(MM_RANDOMIZE_REGISTER_ALLOCATION)),--fast-randomize-register-allocation) $(if $(filter true,$(MM_RANDOMIZE_FRAME_INSERTIONS)),--randomize-frame-insertions-amd64 --randomize-frame-insertions-arm64)
WIN_ARM64_BEACON_CL2FLAGS := -target $(WIN_ARM64_TARGET) $(WIN_ARM64_DEFINES) -fuse-ld=lld -fPIC -ffreestanding -fno-stack-protector -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
$(WIN_ARM64_BEACON_PATH).ll: $(SOURCE_PATH) | $(BUILD_DIR)
@echo "[+] Compiling $(WIN_ARM64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))."
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) \
EXPAND_MEMCPY_CALLS=$(EXPAND_MEMCPY_CALLS) \
EXPAND_MEMSET_CALLS=$(EXPAND_MEMSET_CALLS) \
MOVE_GLOBALS_TO_STACK=$(MOVE_GLOBALS_TO_STACK) \
clang $(WIN_ARM64_BEACON_CL1FLAGS) $< -o $@
@$(PYTHON_PATH) ./ditto/scripts/make/modify-intermediate-metadata.py $@
$(WIN_ARM64_BEACON_PATH).meta0.mir: $(WIN_ARM64_BEACON_PATH).ll
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) llc $(WIN_ARM64_BEACON_LLCFLAGS) -stop-before=regallocfast -o $@ $<
$(WIN_ARM64_BEACON_PATH).meta1.mir: $(WIN_ARM64_BEACON_PATH).meta0.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) \
MACHINE_TRANSPILER_STEP=first \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(WIN_ARM64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(WIN_ARM64_BEACON_PATH).meta2.mir: $(WIN_ARM64_BEACON_PATH).meta1.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) llc $(WIN_ARM64_BEACON_LLCFLAGS) -start-before=regallocfast -stop-after=virtregrewriter -o $@ $<
$(WIN_ARM64_BEACON_PATH).meta3.mir: $(WIN_ARM64_BEACON_PATH).meta2.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) \
MACHINE_TRANSPILER_STEP=last \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(WIN_ARM64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(WIN_ARM64_BEACON_PATH).obj: $(WIN_ARM64_BEACON_PATH).meta3.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) llc $(WIN_ARM64_BEACON_LLCFLAGS) -filetype=obj -start-after=virtregrewriter -o $@ $<
@$(PYTHON_PATH) ./ditto/scripts/make/notify-user-about-bof.py $<
@PATH=$(LLVM_DIR_WIN):$(PATH) llvm-strip --strip-debug $@
$(WIN_ARM64_BEACON_PATH).lkd: $(WIN_ARM64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) clang $(WIN_ARM64_BEACON_CL2FLAGS) -e $(ENTRY_FUNCTION) -nostdlib -nodefaultlibs -o $@ $<
@PATH=$(LLVM_DIR_WIN):$(PATH) llvm-strip --strip-all $@
$(WIN_ARM64_BEACON_PATH).raw: $(WIN_ARM64_BEACON_PATH).lkd
@echo " - Intermediate compile of $@."
@$(PYTHON_PATH) ./ditto/scripts/make/extract-text-segment.py $< $@
$(WIN_ARM64_BEACON_PATH).exe: $(WIN_ARM64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_WIN):$(PATH) clang $(WIN_ARM64_BEACON_CL2FLAGS) -e $(ENTRY_FUNCTION) -nostdlib -nodefaultlibs -o $@ $<
@PATH=$(LLVM_DIR_WIN):$(PATH) llvm-strip --strip-all $@
$(EXE_WIN_ARM64_BEACON_NAME): $(WIN_ARM64_BEACON_PATH).exe
@$(MAKE) ENTRY_FUNCTION=__main --no-print-directory $(WIN_ARM64_BEACON_PATH).exe
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(WIN_ARM64_BEACON_PATH)*.lkd
@rm -f $(WIN_ARM64_BEACON_PATH)*.*mir
@rm -f $(WIN_ARM64_BEACON_PATH)*.ll
endif
@echo " - Done building EXE $@."
$(RAW_WIN_ARM64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=shellcode --no-print-directory $(WIN_ARM64_BEACON_PATH).raw
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(WIN_ARM64_BEACON_PATH)*.lkd
@rm -f $(WIN_ARM64_BEACON_PATH)*.*mir
@rm -f $(WIN_ARM64_BEACON_PATH)*.ll
endif
@echo " - Done building RAW $@."
$(BOF_WIN_ARM64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=go --no-print-directory $(WIN_ARM64_BEACON_PATH).obj
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(WIN_ARM64_BEACON_PATH)*.lkd
@rm -f $(WIN_ARM64_BEACON_PATH)*.*mir
@rm -f $(WIN_ARM64_BEACON_PATH)*.ll
endif
@echo " - Done building BOF $@."
##########################################
## Linux AMD64 ##
##########################################
LIN_AMD64_TARGET := x86_64-linux-gnu
LIN_AMD64_DEFINES := -D__LINUX__ -D__AMD64__ -DEntryFunction=$(ENTRY_FUNCTION)
LIN_AMD64_BEACON_PATH := $(BUILD_DIR)/$(LIN_AMD64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))
LIN_AMD64_BEACON_CL1FLAGS := -target $(LIN_AMD64_TARGET) $(LIN_AMD64_DEFINES) -O0 -emit-llvm -S -g0 -fPIC -ffreestanding -nostdlib -nodefaultlibs -fno-stack-protector -fpass-plugin=./ditto/transpilers/intermediate/build/libIntermediateTranspiler-`arch`.so -Xclang -disable-O0-optnone -fPIC -fno-rtti -fno-exceptions -fno-delayed-template-parsing -fno-modules -fno-fast-math -fno-builtin -fno-elide-constructors -fno-access-control -fno-jump-tables -fno-omit-frame-pointer -fno-ident -fno-inline -fno-inline-functions -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
LIN_AMD64_BEACON_LLCFLAGS := -mtriple $(LIN_AMD64_TARGET) -march=x86-64 -O0 --relocation-model=pic $(if $(filter true,$(MM_RANDOMIZE_REGISTER_ALLOCATION)),--fast-randomize-register-allocation) $(if $(filter true,$(MM_RANDOMIZE_FRAME_INSERTIONS)),--randomize-frame-insertions-amd64 --randomize-frame-insertions-arm64)
LIN_AMD64_BEACON_CL2FLAGS := -target $(LIN_AMD64_TARGET) $(LIN_AMD64_DEFINES) -fuse-ld=lld -fPIC -ffreestanding -fno-stack-protector -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
$(LIN_AMD64_BEACON_PATH).ll: $(SOURCE_PATH) | $(BUILD_DIR)
@echo "[+] Compiling $(LIN_AMD64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))."
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) \
EXPAND_MEMCPY_CALLS=$(EXPAND_MEMCPY_CALLS) \
EXPAND_MEMSET_CALLS=$(EXPAND_MEMSET_CALLS) \
MOVE_GLOBALS_TO_STACK=$(MOVE_GLOBALS_TO_STACK) \
clang $(LIN_AMD64_BEACON_CL1FLAGS) $< -o $@
@$(PYTHON_PATH) ./ditto/scripts/make/modify-intermediate-metadata.py $@
$(LIN_AMD64_BEACON_PATH).meta0.mir: $(LIN_AMD64_BEACON_PATH).ll
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) llc $(LIN_AMD64_BEACON_LLCFLAGS) -stop-before=regallocfast -o $@ $<
$(LIN_AMD64_BEACON_PATH).meta1.mir: $(LIN_AMD64_BEACON_PATH).meta0.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) \
MACHINE_TRANSPILER_STEP=first \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(LIN_AMD64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(LIN_AMD64_BEACON_PATH).meta2.mir: $(LIN_AMD64_BEACON_PATH).meta1.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) llc $(LIN_AMD64_BEACON_LLCFLAGS) -start-before=regallocfast -stop-after=virtregrewriter -o $@ $<
$(LIN_AMD64_BEACON_PATH).meta3.mir: $(LIN_AMD64_BEACON_PATH).meta2.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) \
MACHINE_TRANSPILER_STEP=last \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(LIN_AMD64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(LIN_AMD64_BEACON_PATH).obj: $(LIN_AMD64_BEACON_PATH).meta3.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) llc $(LIN_AMD64_BEACON_LLCFLAGS) -filetype=obj -start-after=virtregrewriter -o $@ $<
@$(PYTHON_PATH) ./ditto/scripts/make/notify-user-about-bof.py $<
@PATH=$(LLVM_DIR_LIN):$(PATH) llvm-strip --strip-debug $@
$(LIN_AMD64_BEACON_PATH).lkd: $(LIN_AMD64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) clang $(LIN_AMD64_BEACON_CL2FLAGS) -e $(ENTRY_FUNCTION) -nostdlib -nodefaultlibs -o $@ $<
@PATH=$(LLVM_DIR_LIN):$(PATH) llvm-strip --strip-all --keep-symbol=$(ENTRY_FUNCTION) $@
$(LIN_AMD64_BEACON_PATH).raw: $(LIN_AMD64_BEACON_PATH).lkd
@echo " - Intermediate compile of $@."
@$(PYTHON_PATH) ./ditto/scripts/make/extract-text-segment.py $< $@
$(LIN_AMD64_BEACON_PATH).exe: $(LIN_AMD64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) clang $(LIN_AMD64_BEACON_CL2FLAGS) -o $@ $<
@PATH=$(LLVM_DIR_LIN):$(PATH) llvm-strip --strip-all --keep-symbol=$(ENTRY_FUNCTION) $@
$(EXE_LIN_AMD64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=main --no-print-directory $(LIN_AMD64_BEACON_PATH).exe
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(LIN_AMD64_BEACON_PATH)*.lkd
@rm -f $(LIN_AMD64_BEACON_PATH)*.*mir
@rm -f $(LIN_AMD64_BEACON_PATH)*.ll
endif
@echo " - Done building EXE $@."
$(RAW_LIN_AMD64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=shellcode --no-print-directory $(LIN_AMD64_BEACON_PATH).raw
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(LIN_AMD64_BEACON_PATH)*.lkd
@rm -f $(LIN_AMD64_BEACON_PATH)*.*mir
@rm -f $(LIN_AMD64_BEACON_PATH)*.ll
endif
@echo " - Done building RAW $@."
$(BOF_LIN_AMD64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=go --no-print-directory $(LIN_AMD64_BEACON_PATH).obj
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(LIN_AMD64_BEACON_PATH)*.lkd
@rm -f $(LIN_AMD64_BEACON_PATH)*.*mir
@rm -f $(LIN_AMD64_BEACON_PATH)*.ll
endif
@echo " - Done building BOF $@."
##########################################
## Linux ARM64 ##
##########################################
LIN_ARM64_TARGET := aarch64-linux-gnu
LIN_ARM64_DEFINES := -D__LINUX__ -D__ARM64__ -DEntryFunction=$(ENTRY_FUNCTION)
LIN_ARM64_BEACON_PATH := $(BUILD_DIR)/$(LIN_ARM64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))
LIN_ARM64_BEACON_CL1FLAGS := -target $(LIN_ARM64_TARGET) $(LIN_ARM64_DEFINES) -O0 -emit-llvm -S -g0 -fPIC -ffreestanding -nostdlib -nodefaultlibs -fno-stack-protector -fpass-plugin=./ditto/transpilers/intermediate/build/libIntermediateTranspiler-`arch`.so -Xclang -disable-O0-optnone -fPIC -fno-rtti -fno-exceptions -fno-delayed-template-parsing -fno-modules -fno-fast-math -fno-builtin -fno-elide-constructors -fno-access-control -fno-jump-tables -fno-omit-frame-pointer -fno-ident -fno-inline -fno-inline-functions -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
LIN_ARM64_BEACON_LLCFLAGS := -mtriple $(LIN_ARM64_TARGET) -march=aarch64 -O0 --relocation-model=pic $(if $(filter true,$(MM_RANDOMIZE_REGISTER_ALLOCATION)),--fast-randomize-register-allocation) $(if $(filter true,$(MM_RANDOMIZE_FRAME_INSERTIONS)),--randomize-frame-insertions-amd64 --randomize-frame-insertions-arm64)
LIN_ARM64_BEACON_CL2FLAGS := -target $(LIN_ARM64_TARGET) $(LIN_ARM64_DEFINES) -fuse-ld=lld -fPIC -ffreestanding -fno-stack-protector -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
$(LIN_ARM64_BEACON_PATH).ll: $(SOURCE_PATH) | $(BUILD_DIR)
@echo "[+] Compiling $(LIN_ARM64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))."
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) \
EXPAND_MEMCPY_CALLS=$(EXPAND_MEMCPY_CALLS) \
EXPAND_MEMSET_CALLS=$(EXPAND_MEMSET_CALLS) \
MOVE_GLOBALS_TO_STACK=$(MOVE_GLOBALS_TO_STACK) \
clang $(LIN_ARM64_BEACON_CL1FLAGS) $< -o $@
@$(PYTHON_PATH) ./ditto/scripts/make/modify-intermediate-metadata.py $@
$(LIN_ARM64_BEACON_PATH).meta0.mir: $(LIN_ARM64_BEACON_PATH).ll
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) llc $(LIN_ARM64_BEACON_LLCFLAGS) -stop-before=regallocfast -o $@ $<
$(LIN_ARM64_BEACON_PATH).meta1.mir: $(LIN_ARM64_BEACON_PATH).meta0.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) \
MACHINE_TRANSPILER_STEP=first \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(LIN_ARM64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(LIN_ARM64_BEACON_PATH).meta2.mir: $(LIN_ARM64_BEACON_PATH).meta1.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) llc $(LIN_ARM64_BEACON_LLCFLAGS) -start-before=regallocfast -stop-after=virtregrewriter -o $@ $<
$(LIN_ARM64_BEACON_PATH).meta3.mir: $(LIN_ARM64_BEACON_PATH).meta2.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) \
MACHINE_TRANSPILER_STEP=last \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(LIN_ARM64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(LIN_ARM64_BEACON_PATH).obj: $(LIN_ARM64_BEACON_PATH).meta3.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) llc $(LIN_ARM64_BEACON_LLCFLAGS) -filetype=obj -start-after=virtregrewriter -o $@ $<
@$(PYTHON_PATH) ./ditto/scripts/make/notify-user-about-bof.py $<
@PATH=$(LLVM_DIR_LIN):$(PATH) llvm-strip --strip-debug $@
$(LIN_ARM64_BEACON_PATH).lkd: $(LIN_ARM64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) clang $(LIN_ARM64_BEACON_CL2FLAGS) -e $(ENTRY_FUNCTION) -nostdlib -nodefaultlibs -o $@ $<
@PATH=$(LLVM_DIR_LIN):$(PATH) llvm-strip --strip-all --keep-symbol=$(ENTRY_FUNCTION) $@
$(LIN_ARM64_BEACON_PATH).raw: $(LIN_ARM64_BEACON_PATH).lkd
@echo " - Intermediate compile of $@."
@$(PYTHON_PATH) ./ditto/scripts/make/extract-text-segment.py $< $@
$(LIN_ARM64_BEACON_PATH).exe: $(LIN_ARM64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_LIN):$(PATH) clang $(LIN_ARM64_BEACON_CL2FLAGS) -o $@ $<
@PATH=$(LLVM_DIR_LIN):$(PATH) llvm-strip --strip-all --keep-symbol=$(ENTRY_FUNCTION) $@
$(EXE_LIN_ARM64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=main --no-print-directory $(LIN_ARM64_BEACON_PATH).exe
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(LIN_ARM64_BEACON_PATH)*.lkd
@rm -f $(LIN_ARM64_BEACON_PATH)*.*mir
@rm -f $(LIN_ARM64_BEACON_PATH)*.ll
endif
@echo " - Done building EXE $@."
$(RAW_LIN_ARM64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=shellcode --no-print-directory $(LIN_ARM64_BEACON_PATH).raw
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(LIN_ARM64_BEACON_PATH)*.lkd
@rm -f $(LIN_ARM64_BEACON_PATH)*.*mir
@rm -f $(LIN_ARM64_BEACON_PATH)*.ll
endif
@echo " - Done building RAW $@."
$(BOF_LIN_ARM64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=go --no-print-directory $(LIN_ARM64_BEACON_PATH).obj
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(LIN_ARM64_BEACON_PATH)*.lkd
@rm -f $(LIN_ARM64_BEACON_PATH)*.*mir
@rm -f $(LIN_ARM64_BEACON_PATH)*.ll
endif
@echo " - Done building BOF $@."
##########################################
## MacOS AMD64 ##
##########################################
MAC_AMD64_TARGET := x86_64-apple-darwin
MAC_AMD64_DEFINES := -D__MACOS__ -D__AMD64__ -DEntryFunction=$(ENTRY_FUNCTION)
MAC_AMD64_BEACON_PATH := $(BUILD_DIR)/$(MAC_AMD64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))
MAC_AMD64_BEACON_CL1FLAGS := -target $(MAC_AMD64_TARGET) $(MAC_AMD64_DEFINES) -O0 -emit-llvm -S -g0 -fPIC -ffreestanding -nostdlib -nodefaultlibs -fno-stack-protector -isysroot/opt/macos-sdk/MacOSX15.4.sdk/ -I/opt/macos-sdk/MacOSX15.4.sdk/usr/include -fpass-plugin=./ditto/transpilers/intermediate/build/libIntermediateTranspiler-`arch`.so -Xclang -disable-O0-optnone -fPIC -fno-rtti -fno-exceptions -fno-delayed-template-parsing -fno-modules -fno-fast-math -fno-builtin -fno-elide-constructors -fno-access-control -fno-jump-tables -fno-omit-frame-pointer -fno-ident -fno-inline -fno-inline-functions -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
MAC_AMD64_BEACON_LLCFLAGS := -mtriple $(MAC_AMD64_TARGET) -march=x86-64 -O0 --relocation-model=pic $(if $(filter true,$(MM_RANDOMIZE_REGISTER_ALLOCATION)),--fast-randomize-register-allocation) $(if $(filter true,$(MM_RANDOMIZE_FRAME_INSERTIONS)),--randomize-frame-insertions-amd64 --randomize-frame-insertions-arm64)
MAC_AMD64_BEACON_CL2FLAGS := -target $(MAC_AMD64_TARGET) $(MAC_AMD64_DEFINES) -fuse-ld=lld -fPIC -ffreestanding -fno-stack-protector -mno-red-zone -isysroot/opt/macos-sdk/MacOSX15.4.sdk/ -L/opt/macos-sdk/MacOSX15.4.sdk/usr/lib -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
$(MAC_AMD64_BEACON_PATH).ll: $(SOURCE_PATH) | $(BUILD_DIR)
@echo "[+] Compiling $(MAC_AMD64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))."
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) \
EXPAND_MEMCPY_CALLS=$(EXPAND_MEMCPY_CALLS) \
EXPAND_MEMSET_CALLS=$(EXPAND_MEMSET_CALLS) \
MOVE_GLOBALS_TO_STACK=$(MOVE_GLOBALS_TO_STACK) \
clang $(MAC_AMD64_BEACON_CL1FLAGS) $< -o $@
@$(PYTHON_PATH) ./ditto/scripts/make/modify-intermediate-metadata.py $@
$(MAC_AMD64_BEACON_PATH).meta0.mir: $(MAC_AMD64_BEACON_PATH).ll
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) llc $(MAC_AMD64_BEACON_LLCFLAGS) -stop-before=regallocfast -o $@ $<
$(MAC_AMD64_BEACON_PATH).meta1.mir: $(MAC_AMD64_BEACON_PATH).meta0.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) \
MACHINE_TRANSPILER_STEP=first \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(MAC_AMD64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(MAC_AMD64_BEACON_PATH).meta2.mir: $(MAC_AMD64_BEACON_PATH).meta1.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) llc $(MAC_AMD64_BEACON_LLCFLAGS) -start-before=regallocfast -stop-after=virtregrewriter -o $@ $<
$(MAC_AMD64_BEACON_PATH).meta3.mir: $(MAC_AMD64_BEACON_PATH).meta2.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) \
MACHINE_TRANSPILER_STEP=last \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(MAC_AMD64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(MAC_AMD64_BEACON_PATH).obj: $(MAC_AMD64_BEACON_PATH).meta3.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) llc $(MAC_AMD64_BEACON_LLCFLAGS) -filetype=obj -start-after=virtregrewriter -o $@ $<
@$(PYTHON_PATH) ./ditto/scripts/make/notify-user-about-bof.py $<
@PATH=$(LLVM_DIR_MAC):$(PATH) llvm-strip --strip-debug $@
$(MAC_AMD64_BEACON_PATH).lkd: $(MAC_AMD64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) clang $(MAC_AMD64_BEACON_CL2FLAGS) -nostdlib -nodefaultlibs -o $@ $<
@PATH=$(LLVM_DIR_MAC):$(PATH) llvm-strip --strip-all $@
$(MAC_AMD64_BEACON_PATH).raw: $(MAC_AMD64_BEACON_PATH).lkd
@echo " - Intermediate compile of $@."
@$(PYTHON_PATH) ./ditto/scripts/make/extract-text-segment.py $< $@
$(MAC_AMD64_BEACON_PATH).exe: $(MAC_AMD64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@mkdir -p $(MAC_AMD64_BEACON_PATH)-exe-dir/
@PATH=$(LLVM_DIR_MAC):$(PATH) clang $(MAC_AMD64_BEACON_CL2FLAGS) -o $(MAC_AMD64_BEACON_PATH)-exe-dir/main $<
@PATH=$(LLVM_DIR_MAC):$(PATH) llvm-strip --strip-all $(MAC_AMD64_BEACON_PATH)-exe-dir/main
@mv $(MAC_AMD64_BEACON_PATH)-exe-dir/main $@
@rm -r $(MAC_AMD64_BEACON_PATH)-exe-dir/
$(EXE_MAC_AMD64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=main --no-print-directory $(MAC_AMD64_BEACON_PATH).exe
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(MAC_AMD64_BEACON_PATH)*.lkd
@rm -f $(MAC_AMD64_BEACON_PATH)*.*mir
@rm -f $(MAC_AMD64_BEACON_PATH)*.ll
endif
@echo " - Done building EXE $@."
$(RAW_MAC_AMD64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=main --no-print-directory $(MAC_AMD64_BEACON_PATH).raw
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(MAC_AMD64_BEACON_PATH)*.lkd
@rm -f $(MAC_AMD64_BEACON_PATH)*.*mir
@rm -f $(MAC_AMD64_BEACON_PATH)*.ll
endif
@echo " - Done building RAW $@."
$(BOF_MAC_AMD64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=go --no-print-directory $(MAC_AMD64_BEACON_PATH).obj
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(MAC_AMD64_BEACON_PATH)*.lkd
@rm -f $(MAC_AMD64_BEACON_PATH)*.*mir
@rm -f $(MAC_AMD64_BEACON_PATH)*.ll
endif
@echo " - Done building BOF $@."
##########################################
## MacOS ARM64 ##
##########################################
MAC_ARM64_TARGET := arm64-apple-darwin
MAC_ARM64_DEFINES := -D__MACOS__ -D__ARM64__ -DEntryFunction=$(ENTRY_FUNCTION)
MAC_ARM64_BEACON_PATH := $(BUILD_DIR)/$(MAC_ARM64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))
MAC_ARM64_BEACON_CL1FLAGS := -target $(MAC_ARM64_TARGET) $(MAC_ARM64_DEFINES) -O0 -emit-llvm -S -g0 -fPIC -ffreestanding -nostdlib -nodefaultlibs -fno-stack-protector -isysroot/opt/macos-sdk/MacOSX15.4.sdk/ -I/opt/macos-sdk/MacOSX15.4.sdk/usr/include -fpass-plugin=./ditto/transpilers/intermediate/build/libIntermediateTranspiler-`arch`.so -Xclang -disable-O0-optnone -fPIC -fno-rtti -fno-exceptions -fno-delayed-template-parsing -fno-modules -fno-fast-math -fno-builtin -fno-elide-constructors -fno-access-control -fno-jump-tables -fno-omit-frame-pointer -fno-ident -fno-inline -fno-inline-functions -mno-red-zone -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
MAC_ARM64_BEACON_LLCFLAGS := -mtriple $(MAC_ARM64_TARGET) -march=aarch64 -O0 --relocation-model=pic $(if $(filter true,$(MM_RANDOMIZE_REGISTER_ALLOCATION)),--fast-randomize-register-allocation) $(if $(filter true,$(MM_RANDOMIZE_FRAME_INSERTIONS)),--randomize-frame-insertions-amd64 --randomize-frame-insertions-arm64)
MAC_ARM64_BEACON_CL2FLAGS := -target $(MAC_ARM64_TARGET) $(MAC_ARM64_DEFINES) -fuse-ld=lld -fPIC -ffreestanding -fno-stack-protector -mno-red-zone -isysroot/opt/macos-sdk/MacOSX15.4.sdk/ -L/opt/macos-sdk/MacOSX15.4.sdk/usr/lib -fno-use-cxa-atexit -fno-threadsafe-statics -fvisibility=hidden -fvisibility-inlines-hidden
$(MAC_ARM64_BEACON_PATH).ll: $(SOURCE_PATH) | $(BUILD_DIR)
@echo "[+] Compiling $(MAC_ARM64_BEACON_NAME)$(if $(BEACON_NAME),-$(BEACON_NAME))."
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) \
EXPAND_MEMCPY_CALLS=$(EXPAND_MEMCPY_CALLS) \
EXPAND_MEMSET_CALLS=$(EXPAND_MEMSET_CALLS) \
MOVE_GLOBALS_TO_STACK=$(MOVE_GLOBALS_TO_STACK) \
clang $(MAC_ARM64_BEACON_CL1FLAGS) $< -o $@
@$(PYTHON_PATH) ./ditto/scripts/make/modify-intermediate-metadata.py $@
$(MAC_ARM64_BEACON_PATH).meta0.mir: $(MAC_ARM64_BEACON_PATH).ll
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) llc $(MAC_ARM64_BEACON_LLCFLAGS) -stop-before=regallocfast -o $@ $<
$(MAC_ARM64_BEACON_PATH).meta1.mir: $(MAC_ARM64_BEACON_PATH).meta0.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) \
MACHINE_TRANSPILER_STEP=first \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(MAC_ARM64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(MAC_ARM64_BEACON_PATH).meta2.mir: $(MAC_ARM64_BEACON_PATH).meta1.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) llc $(MAC_ARM64_BEACON_LLCFLAGS) -start-before=regallocfast -stop-after=virtregrewriter -o $@ $<
$(MAC_ARM64_BEACON_PATH).meta3.mir: $(MAC_ARM64_BEACON_PATH).meta2.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) \
MACHINE_TRANSPILER_STEP=last \
MM_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TRANSFORM_REG_MOV_IMMEDIATES) MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_REG_MOV_IMMEDIATES) \
MM_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TRANSFORM_STACK_MOV_IMMEDIATES) MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES=$(MM_TEST_TRANSFORM_STACK_MOV_IMMEDIATES) \
MM_TRANSFORM_NULLIFICATIONS=$(MM_TRANSFORM_NULLIFICATIONS) MM_TEST_TRANSFORM_NULLIFICATIONS=$(MM_TEST_TRANSFORM_NULLIFICATIONS) \
MM_INSERT_SEMANTIC_NOISE=$(MM_INSERT_SEMANTIC_NOISE) MM_TEST_INSERT_SEMANTIC_NOISE=$(MM_TEST_INSERT_SEMANTIC_NOISE) \
llc $(MAC_ARM64_BEACON_LLCFLAGS) -load ./ditto/transpilers/machine/build/libMachineTranspiler-`arch`.so --run-pass=MachineTranspiler -o $@ $<
$(MAC_ARM64_BEACON_PATH).obj: $(MAC_ARM64_BEACON_PATH).meta3.mir
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) llc $(MAC_ARM64_BEACON_LLCFLAGS) -filetype=obj -start-after=virtregrewriter -o $@ $<
@$(PYTHON_PATH) ./ditto/scripts/make/notify-user-about-bof.py $<
@PATH=$(LLVM_DIR_MAC):$(PATH) llvm-strip --strip-debug $@
$(MAC_ARM64_BEACON_PATH).lkd: $(MAC_ARM64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@PATH=$(LLVM_DIR_MAC):$(PATH) clang $(MAC_ARM64_BEACON_CL2FLAGS) -nostdlib -nodefaultlibs -o $@ $<
@PATH=$(LLVM_DIR_MAC):$(PATH) llvm-strip --strip-all $@
$(MAC_ARM64_BEACON_PATH).raw: $(MAC_ARM64_BEACON_PATH).lkd
@echo " - Intermediate compile of $@."
@$(PYTHON_PATH) ./ditto/scripts/make/extract-text-segment.py $< $@
$(MAC_ARM64_BEACON_PATH).exe: $(MAC_ARM64_BEACON_PATH).obj
@echo " - Intermediate compile of $@."
@mkdir -p $(MAC_ARM64_BEACON_PATH)-exe-dir/
@PATH=$(LLVM_DIR_MAC):$(PATH) clang $(MAC_ARM64_BEACON_CL2FLAGS) -o $(MAC_ARM64_BEACON_PATH)-exe-dir/main $<
@PATH=$(LLVM_DIR_MAC):$(PATH) llvm-strip --strip-all $(MAC_ARM64_BEACON_PATH)-exe-dir/main
@mv $(MAC_ARM64_BEACON_PATH)-exe-dir/main $@
@rm -r $(MAC_ARM64_BEACON_PATH)-exe-dir/
$(EXE_MAC_ARM64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=main --no-print-directory $(MAC_ARM64_BEACON_PATH).exe
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(MAC_ARM64_BEACON_PATH)*.lkd
@rm -f $(MAC_ARM64_BEACON_PATH)*.*mir
@rm -f $(MAC_ARM64_BEACON_PATH)*.ll
endif
@echo " - Done building EXE $@."
$(RAW_MAC_ARM64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=main --no-print-directory $(MAC_ARM64_BEACON_PATH).raw
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(MAC_ARM64_BEACON_PATH)*.lkd
@rm -f $(MAC_ARM64_BEACON_PATH)*.*mir
@rm -f $(MAC_ARM64_BEACON_PATH)*.ll
endif
@echo " - Done building RAW $@."
$(BOF_MAC_ARM64_BEACON_NAME):
@$(MAKE) ENTRY_FUNCTION=go --no-print-directory $(MAC_ARM64_BEACON_PATH).obj
ifeq ($(DEBUG), false)
@echo " - Intermediate cleanup of build files."
@rm -f $(MAC_ARM64_BEACON_PATH)*.lkd
@rm -f $(MAC_ARM64_BEACON_PATH)*.*mir
@rm -f $(MAC_ARM64_BEACON_PATH)*.ll
endif
@echo " - Done building BOF $@."
##########################################
## Utility targets ##
##########################################
$(BUILD_DIR):
@echo "[+] Creating build directory."
@mkdir -p $(BUILD_DIR)
dependencies:
@echo "[+] Installing Python dependencies."
@$(PYTHON_PATH) -m pip install --upgrade pip
@$(PYTHON_PATH) -m pip install -r ditto/scripts/requirements.txt --break-system-packages
clean:
@echo "[+] Removing compiled user beacons from build folder."
@rm -rf $(BUILD_DIR)/beacon-*
clean-beacons: clean
clean-ditto-loaders:
@echo "[+] Calling \`clean\` in loaders makefile."
@$(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) --no-print-directory -C ./ditto/loaders/ clean
clean-ditto-transpilers:
@echo "[+] Calling \`clean\` in intermediate transpiler makefile."
@$(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) --no-print-directory -C ./ditto/transpilers/intermediate/ clean
@echo "[+] Calling \`clean\` in machine transpiler makefile."
@$(MAKE) IS_COMPILER_CONTAINER=$(IS_COMPILER_CONTAINER) --no-print-directory -C ./ditto/transpilers/machine/ clean
clean-extensive: clean-ditto-transpilers clean-ditto-loaders clean-beacons
help:
@echo "[+] Building your code:"
@echo " - make beacon-[platform]-[arch]-[format] // (Re-)compile your code"
@echo " ↳ Available platforms: win,lin,mac"
@echo " ↳ Available architectures: amd64,arm64"
@echo " ↳ Available formats: exe,raw,bof"
@echo " - make beacon-win-amd64-bof // (Re-)compile your code to Windows AMD64 BOF/COFF"
@echo " - make beacon-mac-arm64-raw // (Re-)compile your code to MacOS ARM64 raw shellcode"
@echo " - make beacon-lin-all-raw // (Re-)compile your shellcode to raw shellcode for Linux and any architecture"
@echo " - make beacon-all-all-raw // (Re-)compile your shellcode to raw shellcode for any platform and architecture"
@echo " - make beacon-all-all-all // (Re-)compile your shellcode to executable, BOF/COFF and raw shellcode for any platform and architecture"
@echo "[+] Dittobytes internals"
@echo " - make ditto-loaders // (Re-)compile all pre-shipped Ditto shellcode loaders"
@echo " - make ditto-transpilers // (Re-)compile the pre-shipped Ditto LLVM transpilers/passes"
@echo "[+] Test suite:"
@echo " - make test-suite-build // (Re-)compile all feature tests"
@echo " - make test-suite-test // Run all feature tests (for the current architecture)"
@echo "[+] Cleanup:"
@echo " - make clean // Remove all your code builds ('beacon-*') from the build folder"
@echo " - make clean-ditto-loaders // Remove all loader builds ('loaders-*') from the build folder"
@echo " - make clean-ditto-transpilers // Remove all transpiler builds from the transpiler build folders"
@echo "[+] Help:"
@echo " - make help // Show this help message"
.PHONY: all check_environment dependencies clean \
$(EXE_WIN_AMD64_BEACON_NAME) $(RAW_WIN_AMD64_BEACON_NAME) $(BOF_WIN_AMD64_BEACON_NAME) $(WIN_AMD64_BEACON_PATH) $(WIN_AMD64_BEACON_PATH).exe $(WIN_AMD64_BEACON_PATH).obj $(WIN_AMD64_BEACON_PATH).raw $(WIN_AMD64_BEACON_PATH).lkd $(WIN_AMD64_BEACON_PATH).ll $(WIN_AMD64_BEACON_PATH).meta0.mir $(WIN_AMD64_BEACON_PATH).meta1.mir $(WIN_AMD64_BEACON_PATH).meta2.mir $(WIN_AMD64_BEACON_PATH).meta3.mir \
$(EXE_WIN_ARM64_BEACON_NAME) $(RAW_WIN_ARM64_BEACON_NAME) $(BOF_WIN_ARM64_BEACON_NAME) $(WIN_ARM64_BEACON_PATH) $(WIN_ARM64_BEACON_PATH).exe $(WIN_ARM64_BEACON_PATH).obj $(WIN_ARM64_BEACON_PATH).raw $(WIN_ARM64_BEACON_PATH).lkd $(WIN_ARM64_BEACON_PATH).ll $(WIN_ARM64_BEACON_PATH).meta0.mir $(WIN_ARM64_BEACON_PATH).meta1.mir $(WIN_ARM64_BEACON_PATH).meta2.mir $(WIN_ARM64_BEACON_PATH).meta3.mir \
$(EXE_LIN_AMD64_BEACON_NAME) $(RAW_LIN_AMD64_BEACON_NAME) $(BOF_LIN_AMD64_BEACON_NAME) $(LIN_AMD64_BEACON_PATH) $(LIN_AMD64_BEACON_PATH).exe $(LIN_AMD64_BEACON_PATH).obj $(LIN_AMD64_BEACON_PATH).raw $(LIN_AMD64_BEACON_PATH).lkd $(LIN_AMD64_BEACON_PATH).ll $(LIN_AMD64_BEACON_PATH).meta0.mir $(LIN_AMD64_BEACON_PATH).meta1.mir $(LIN_AMD64_BEACON_PATH).meta2.mir $(LIN_AMD64_BEACON_PATH).meta3.mir \
$(EXE_LIN_ARM64_BEACON_NAME) $(RAW_LIN_ARM64_BEACON_NAME) $(BOF_LIN_ARM64_BEACON_NAME) $(LIN_ARM64_BEACON_PATH) $(LIN_ARM64_BEACON_PATH).exe $(LIN_ARM64_BEACON_PATH).obj $(LIN_ARM64_BEACON_PATH).raw $(LIN_ARM64_BEACON_PATH).lkd $(LIN_ARM64_BEACON_PATH).ll $(LIN_ARM64_BEACON_PATH).meta0.mir $(LIN_ARM64_BEACON_PATH).meta1.mir $(LIN_ARM64_BEACON_PATH).meta2.mir $(LIN_ARM64_BEACON_PATH).meta3.mir \
$(EXE_MAC_AMD64_BEACON_NAME) $(RAW_MAC_AMD64_BEACON_NAME) $(BOF_MAC_AMD64_BEACON_NAME) $(MAC_AMD64_BEACON_PATH) $(MAC_AMD64_BEACON_PATH).exe $(MAC_AMD64_BEACON_PATH).obj $(MAC_AMD64_BEACON_PATH).raw $(MAC_AMD64_BEACON_PATH).lkd $(MAC_AMD64_BEACON_PATH).ll $(MAC_AMD64_BEACON_PATH).meta0.mir $(MAC_AMD64_BEACON_PATH).meta1.mir $(MAC_AMD64_BEACON_PATH).meta2.mir $(MAC_AMD64_BEACON_PATH).meta3.mir \
$(EXE_MAC_ARM64_BEACON_NAME) $(RAW_MAC_ARM64_BEACON_NAME) $(BOF_MAC_ARM64_BEACON_NAME) $(MAC_ARM64_BEACON_PATH) $(MAC_ARM64_BEACON_PATH).exe $(MAC_ARM64_BEACON_PATH).obj $(MAC_ARM64_BEACON_PATH).raw $(MAC_ARM64_BEACON_PATH).lkd $(MAC_ARM64_BEACON_PATH).ll $(MAC_ARM64_BEACON_PATH).meta0.mir $(MAC_ARM64_BEACON_PATH).meta1.mir $(MAC_ARM64_BEACON_PATH).meta2.mir $(MAC_ARM64_BEACON_PATH).meta3.mir \