Challenge 24: ntdll.dll Unhooking
Objective
Demonstrate that the MostShittyEDR has no runtime hook integrity verification. Load a fresh copy of ntdll.dll and overwrite the hooked .text section — the EDR won’t notice.
Scanner Behavior
Rule 7 checks the PE import table once at process creation time:
proc ruleHookedApiImports(info: ProcessInfo, profile: HookProfile): seq[Detection] =
let imports = readPeImports(info.imagePath)
# one-shot check, no continuous monitoring
There is no runtime verification that hooks are still in place. The EDR never:
- Re-reads ntdll.dll’s
.textsection - Monitors
NtProtectVirtualMemorycalls against ntdll pages - Checks for
MapViewOfFileof system DLLs - Validates syscall stub integrity
Rules
- The EDR must be running with a hook profile loaded
- Your program must demonstrate unhooking ntdll.dll by restoring its
.textsection from disk - The unhooking itself must go undetected
MostShittyEDR