From 33f5ed9ef58f26c6b3b52cf605dd4311d658a60d Mon Sep 17 00:00:00 2001 From: salmonik Date: Fri, 6 Nov 2026 16:09:55 +0100 Subject: Fix audit findings: crash safety, correctness, rendering, performance Crash/UB: - gate every hook behind an init-stage flag until config/surface/input are ready - publish module maps as immutable atomic snapshots instead of reallocating shared vectors under unlocked readers - validate the %ebp walk in the RandomSeed/RandomFloat hooks against the stack - bounds-check every RecvTable/RecvProp/string dereference with module_range() - preserve the Itanium vtable header when cloning (client, CInput, model render, studio render) - reject negative usercmd sequence numbers; guard config_load against a null section target; cap the bone parent walk; check mprotect; drop PROT_EXEC on the GOT patch; absorb server.so .bss tail Correctness: - filter dormant entities across ESP, aimbot, triggerbot, melee, items and projectiles (slot self-tested against the local player) - reset the server-health latch per map and only latch on valid model indices - bone cache sized for the 128-target scan; set valid=false on every failure; head_position keeps searching past an invalid bone - vischeck steps past glass by probing until clear, and ignores entities owned by the target (held weapons, bone followers) - aimbot: maxs no longer disables it, AABB-aware FOV prefilter, lock hysteresis, lead point re-checked for FOV and visibility - spread: seed hook arms on the no-spread toggle alone; engine toggle only controls the RandomFloat zeroing - resolve m_hOwnerEntity/m_hOwner; NPC lead velocity from the server entity - vector_angles pitch range, point_ground normal test, underwater jump+duck no longer skips combat, semi-auto press/release edge for synthetic fire - item/projectile markers and blast rings refresh origin per frame while discovery stays at 10 Hz; trajectory uses the real m_DmgRadius and honours the blast-radius toggle Rendering/GUI: - one overlay draw per engine frame (FRAME_RENDER_START boundary), fixing alpha stacking and the speed-graph flicker - clipped lines/outlines and ellipsised text instead of drawing past the content pane or shifting over neighbours - dropdown dismissal consumes the click; hover ignores hidden controls - chams: reset AlphaModulate, reference shared materials once, restore prop tint colour; fonts created once per handle - projection uses Source's 4:3 aspect scaling and roll; screen size refreshed each frame; FOV circle gated on the aim toggles, not the bind Performance: - TTL caches for NPC relation, friendly/neutral and damage class - model names memoised per model index - entity pointer -> index cache for the triggerbot (was a 4096-slot walk/tick) Build: - real Makefile with -MMD dependency tracking, debug/release objects and an always-relink rule; build.sh kept as a thin wrapper --- Makefile | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Makefile (limited to 'Makefile') diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..12a6f92 --- /dev/null +++ b/Makefile @@ -0,0 +1,60 @@ +# libhl2hake.so — 32-bit Source Engine plugin. +# +# make release build (build/release, -O2) +# make debug build/debug with -O0 -g (symbolise crash addresses) +# make clean +# +# Needs a 32-bit multilib toolchain (g++-multilib on Debian/Ubuntu). + +CXX ?= g++ +OUT := libhl2hake.so +SRC := $(wildcard src/*.cpp) +ODIR ?= build/release +OPT ?= -O2 + +CXXFLAGS := -m32 -std=c++17 -Wall -Wextra -Werror -fPIC \ + -fvisibility=hidden -fno-omit-frame-pointer -pthread \ + -MMD -MP $(OPT) +LDFLAGS := -m32 -shared -pthread -Wl,--no-undefined +LDLIBS := -ldl + +OBJ := $(patsubst src/%.cpp,$(ODIR)/%.o,$(SRC)) +DEP := $(OBJ:.o=.d) + +all: check $(OUT) + @file $(OUT) + @test -f assets/LiberationSans-Regular.ttf || \ + echo "warning: assets/ is missing next to the .so; the overlay falls back to system fonts" >&2 + +# Objects, dependency files and headers are handled by make itself; this only +# keeps the debug build in its own directory. +debug: + @$(MAKE) --no-print-directory ODIR=build/debug OPT="-O0 -g" + +# Always relink. Both configs write the same output file, so without this a +# plain `make` after `make debug` would keep the debug binary (the .so is newer +# than the release objects). Linking is sub-second. +.PHONY: FORCE +FORCE: + +$(OUT): $(OBJ) FORCE + $(CXX) $(LDFLAGS) -o $@ $(OBJ) $(LDLIBS) + +$(ODIR)/%.o: src/%.cpp | $(ODIR) + $(CXX) $(CXXFLAGS) -c $< -o $@ + +$(ODIR): + @mkdir -p $@ + +# Fail once with a usable message instead of a wall of compiler errors. +.PHONY: check +check: + @printf 'int main(){return 0;}\n' | \ + $(CXX) -m32 -x c++ - -o /dev/null 2>/dev/null || \ + { echo "error: $(CXX) cannot build 32-bit binaries; install g++-multilib" >&2; exit 1; } + +.PHONY: all debug clean +clean: + rm -rf build $(OUT) + +-include $(DEP) -- cgit v1.2.3