SKILL: Endpoint Detection and Response
Metadata
Description
EDR evasion offensive checklist: hook unhooking (user/kernel), direct syscalls, PPID spoofing, process injection variants, AMSI bypass, ETW patching, memory encryption, and behavior-based evasion. Use when planning EDR bypass during red team engagements or researching AV/EDR evasion techniques.
Trigger Phrases
Use this skill when the conversation involves any of:
EDR evasion, EDR bypass, hook unhooking, direct syscalls, PPID spoofing, process injection, AMSI bypass, ETW patch, memory encryption, AV evasion, behavioral evasion, red team evasion
Instructions for Claude
When this skill is active:
- Load and apply the full methodology below as your operational checklist
- Follow steps in order unless the user specifies otherwise
- For each technique, consider applicability to the current target/context
- Track which checklist items have been completed
- Suggest next steps based on findings
Full Methodology
Endpoint Detection and Response
Fundamentals
AV vs EDR
Antivirus (preventive approach):
- Static Analysis: Matching known signatures in files
- Dynamic Analysis: Limited behavioral monitoring/sandboxing
- Effective against known threats, weaker against advanced attacks
EDR (proactive & investigative approach):
- Continuous endpoint monitoring
- Behavioral analysis at kernel level
- Anomaly detection and post-compromise visibility
- Prioritizes incident response and investigation
Windows Execution Flow
Windows program execution follows a hierarchical flow:
- Applications - User programs like firefox.exe
- DLLs - Libraries providing Windows functionality without direct low-level access
- Kernel32.dll - Core DLL for memory management, process/thread creation
- Ntdll.dll - Lowest user-mode DLL that exposes the NT API interface to the kernel
- Kernel - Core OS component with unrestricted hardware access
Example operation flow (creating a file):
- Application invokes
CreateFile function
- CreateFile forwards to
NtCreateFile
- Ntdll.dll triggers
NtCreateFile syscall
- Kernel creates the file and returns a handle
EDR Visibility
EDR Architecture & Components
EDR solutions consist of multiple components creating a complex attack surface:
Client-Side Components:
- User-space Applications - Main agent processes and UI components
- Kernel-space Drivers - Filter drivers, network drivers, software drivers
- Communication Interfaces - IOCTLs, FilterConnectionPorts, ALPC, Named Pipes
Component Communication Methods:
- Kernel-to-Kernel: Exported functions, IOCTLs
- User-to-Kernel: IOCTLs, FilterConnectionPorts (minifilter-specific), ALPC
- User-to-User: ALPC, Named Pipes, Files, Registry
Server-Side Components:
- Cloud services and management consoles
- On-premise servers (some vendors)
- Custom protocols for agent-to-cloud communication
EDR Visibility Methods
EDR solutions require extended visibility into system activities:
- Filesystem monitoring via mini-filter drivers
- Process/module loading via image load kernel callbacks
- Process/.NET modules/Registry/kernel object events via ETW Ti
- Network monitoring via NDIS and network filtering drivers
Static Analysis
- Extract information from binary
- Known malicious strings
- Threat actor IP or domains
- Malware binary hashes
Dynamic Analysis
- Execute binary in a sandbox environment and observe it
- Network connections
- Registry changes
- Memory access
- File creation/deletion
- AntiMalware Scan Interface
Behavioral Analysis
- Observe the binary as its executing, Hook into functions/syscalls
- User actions
- System calls
- Kernel callbacks
- Commands executed in the command line
- Which process is executing the code
- Event Tracing for Windows
Detection Methods
AV Signature Scanning
- Scans files using known signatures (YARA rules)
- Typically targets loaders and droppers
- Primarily static analysis of files on disk
AV Emulation
- Runs suspicious programs in a simulated environment
- Triggers on behaviors without executing real code
- Used to detect obfuscated malware
Usermode Hooks
- EDR hooks critical API calls in userspace (ntdll.dll)
- Monitors process creation, memory allocations, and network operations
- Allows for inspection before execution continues
Kernel Telemetry
- Monitors events directly from the kernel
- Captures file, registry, process, and network operations
- Difficult to bypass as it operates at a lower level
Memory Scanning
- Scans process memory for known signatures
- Triggers based on suspicious behavior
- Looks for shellcode, encryption, malicious strings
- Modern Context:
- Attackers also scan process memory for sensitive artifacts like authentication tokens. Co‑pilot/IDE integrations, chat assistants, and browser extensions frequently cache Bearer/JWT tokens in memory.
- Practical triage: search for
"Authorization: Bearer", "eyJ" (base64 JWT prefix), or provider‑specific headers; dump minimal pages to avoid tripping anti‑exfil rules.
OpSec Quickstart (lab)
- Pre‑run
- Network: block or sinkhole vendor EDR/XDR endpoints; disable cloud sample submission; tag lab hosts.
- Mitigations snapshot:
Get-ProcessMitigation -System; Get-CimInstance Win32_DeviceGuard (VBS/HVCI/KDP); Get-MpPreference (ASR/Cloud).
- Events baseline: enable and tail
Microsoft-Windows-CodeIntegrity/Operational, Security (4688/4689), Microsoft-Windows-Sense/Operational, Sysmon (if present).
- Injection hygiene
- Favor
MEM_IMAGE mappings (ghosting/herpaderping/overwriting) over MEM_PRIVATE RWX to avoid 24H2 hotpatch loader checks.
- Satisfy XFG/CET: jump via import thunks; ensure IBT
ENDBR64 at indirect targets; maintain plausible stacks for syscalls (replicate ntdll frames).
- Avoid noisy APIs: split
alloc/write/exec over time; prefer APC+NtContinue pivots; keep thread contexts consistent.
- Telemetry minimization
- Jitter long‑lived channels; prefer named‑pipe/HTTP3 over noisy HTTP1; throttle upload intervals.
- Use COM/runspace over PowerShell console to reduce script‑block logs; avoid AMSI‑flagged prologues.
- Cleanup
- Remove services, tasks, drivers; restore SDDL; revert registry policy flips (WDAC/CI/Defender) and re‑enable protections.
- Purge user caches (Recent Files, Jump Lists) and ETW providers enabled during tests.
Memory Regions
- Monitors suspicious memory allocation patterns
- Flags RWX (read-write-execute) regions
- Tracks regions that change from RW to RX
Callstack Analysis
- Examines the call stack of suspicious functions
- Verifies legitimate origin of critical operations
- Detects unusual function call chains
Hook Implementation
EDRs can't directly hook kernel memory due to PatchGuard, so they:
- Inject their DLL into newly spawned processes
- Position before malware can block/unmap it
- Adjust
_PEB, hook process's module IAT/Imports, and loaded libraries EAT/Exports
- Implement trampolines, hooks, and detours
ETW Monitoring
- EDR maintains ring-buffer with per-process activities produced by ETW Ti:
- Processes, command lines, parent-child relationships
- File/Registry/Process open/write operations
- Created threads, their call stacks, starting addresses
- Native functions called
- Created .NET AppDomains, loaded .NET assemblies, static class names, methods
Event Correlation
- High fidelity alert (such as LSASS open) triggers correlation of collected activities
- High memory/resources cost limits preservation of events to a time window
- ML/AI may compute risk scores and isolate TTP (Tactics, Techniques, and Procedures)
Shellcode Loaders
Shellcode loaders typically follow this pattern:
char *shellcode = "\xAA\xBB...";
char *dest = VirtualAlloc(NULL, 0x1234, 0x3000, PAGE_READWRITE);
memcpy(dest, shellcode, 0x1234)
VirtualProtect(dest, 0x1234, PAGE_EXECUTE_READ, &result)
(*(void(*)())(dest))(); // jump to dest: execute shellcode
Attacking EDR Infrastructure Directly
Driver Attack Surface Analysis
A systematic approach to analyzing EDR drivers from a low-privileged user perspective:
1. Driver Discovery
Static Analysis:
# List loaded drivers
driverquery /v
Get-WindowsDriver -Online -All
# Using WMI
Get-WmiObject Win32_PnPSignedDriver | Select-String "EDR_Vendor"
Dynamic Analysis:
# Using sc command
sc query type= driver state= all
# Process Monitor filtering
# Filter: Process and Thread Activity -> Show Image/DLL
2. Interface Enumeration
Device Driver Interfaces:
- Listed in WinObj under "GLOBAL??" as Symbolic Links
- Accessible via
\\.\DEVICE_NAME format
- Tools: WinObj (Sysinternals), DeviceTree (OSR - discontinued)
Mini-Filter Driver Interfaces:
- Listed in WinObj as "FilterConnectionPort" objects
- Communication via
FltCreateCommunicationPort API
- Example paths:
\CyvrFsfd, \SophosPortName
3. Access Permission Analysis
Device Driver ACL Checking:
// Using DeviceTree (preferred) or kernel debugger
// WinDbg example:
!object \Device\DeviceName
!sd <SecurityDescriptor_Address> 1
FilterConnectionPort ACL Checking:
# Using NtObjectManager (James Forshaw)
Get-FilterConnectionPort -Path "\FilterPortName"
# Error indicates access denied
# In WinDbg:
!object \FilterPortName
dx (((nt!_OBJECT_HEADER*)0xAddress)->SecurityDescriptor & ~0xa)
!sd <SecurityDescriptor_Address> 1
4. Interface Functionality Analysis
Device Driver Communication:
- Primary method: DeviceIoControl() → IRP_MJ_DEVICE_CONTROL
- IOCTL codes differentiate between functions
- May include process ID verification for authorization
FilterConnectionPort Communication:
- Uses callback functions: ConnectNotifyCallback, DisconnectNotifyCallback, MessageNotifyCallback
- Similar to IOCTL dispatch with different message types
5. Common EDR Driver Interfaces
Examples of accessible interfaces found in research:
Palo Alto Cortex XDR:
- Device Interfaces:
\\.\PaloEdrControlDevice (tedrdrv.sys) - ~20 IOCTL handlers with various functionality
\\.\CyvrMit (cyvrmtgn.sys) - Legacy Cyvera interface
\\.\PANWEdrPersistentDevice11343 (tedrpers-.sys) - Persistent device interface
- FilterConnectionPort: Various ports with different ACLs
- Research Findings:
- IOCTL 0x2260D8 returns 3088 bytes of statistics data (accessible to low-privileged users)
- IOCTL 0x2260D0 provides initialization status information
- Some interfaces accessible due to injected DLL architecture requiring broad permissions
Sophos Intercept X:
- FilterConnectionPort:
\SophosPortName
- Analysis Results: Accessible interfaces for legitimate process communication but limited attack surface
6. Why EDRs Have Open ACLs
EDRs often use an architecture where:
- Agent injects DLLs into processes (including low-privileged ones like
word.exe)
- Injected DLLs communicate directly with drivers via IOCTLs
- Drivers cannot restrict based solely on process privilege level
- Results in more permissive ACLs to accommodate legitimate injected processes
Evasion Techniques
Memory-Based Evasion
EDR-Freeze
A novel technique exploiting Windows Error Reporting (WER) to temporarily disable EDR/AV processes:
Mechanism
- Leverages
WerFault.exe and Windows Error Reporting infrastructure
- Suspends all threads in target EDR/AV processes indefinitely
- No kernel-mode access or driver exploitation required
- Operates entirely from user-mode context
Technical Implementation
- Trigger WER fault injection on target security process
- WER suspends all threads for crash dump generation
- Attacker maintains suspended state without completing crash handling
- Target process remains alive but non-functional
Advantages
- No elevation required in default WER configurations
- Avoids detection heuristics for process termination
- Temporary disabling without unloading kernel drivers
- Minimal forensic footprint compared to driver killing
Limitations
- Effectiveness varies by Windows version and WER configuration
- Some EDRs implement anti-suspension protections
- Temporary nature requires continuous re-application
- May generate WER event logs exposing the technique
[!TIP]
Blue team detection: Alert on PssSuspendProcess / PssSuspendThread API calls combined with OpenProcess targeting EDR process IDs, or monitor Event ID 1001 (Windows Error Reporting) with unusual source processes.
Memory Encryption
- Encrypts shellcode in memory when not in use
- Popular techniques:
- SWAPPALA / SLE(A)PING
- Thread Pool / Pool Party
- Gargoyle
- Ekko
- Cronos
- Foliage
Sleep Obfuscation
- ROP-Styles sleep obfuscations
- Ekko
- FOLIAGE
- these setup
_CONTEXT in advance so that EIP/RIP points to native API
- and then schedule APC with
NtContinue to jump to that requested API
Secure Enclaves (VBS)
- Virtualization-Based Security (VBS) enclaves provide an isolated user-mode TEE that even kernel-mode sensors cannot inspect under normal conditions.
- Deprecation/support scope (Microsoft):
- Windows 11 ≤ 23H2: VBS enclaves are deprecated; existing enclaves signed with the legacy EKU (OID
1.3.6.1.4.1.311.76.57.1.15) continue to run until re-signed. New enclave signing requires updated EKUs and is not supported on these versions.
- Windows 11 24H2+ and Windows Server 2025: VBS enclaves are supported with new EKUs.
- Security fix: CVE-2024-49076 (VBS Enclave EoP) — ensure December 2024+ updates are applied.
- Signing constraints: Only Microsoft-signed enclave DLLs or DLLs signed via Azure Trusted Signing load; test- or self-signed DLLs are rejected.
- Architecture summary:
- Enclave host app (VTL0) invokes enclave APIs; enclave DLL executes in isolated user mode (VTL1) with restricted API surface; Secure Kernel validates integrity.
- Offensive considerations (lab): viable for secure storage of secrets/implants during sleep and for hiding sensitive code paths; limited by restricted API surface and signing requirements.
- Practical notes:
- On unsupported SKUs/versions, enclave APIs may appear and return
STATUS_FEATURE_DEPRECATED.
- Prefer testing on Windows 11 24H2+/Server 2025 with proper signing.
Malware Virtualization
Malware virtualization provides advanced evasion against modern EDR:
- Embeds a custom virtual machine to execute bytecode instead of native code
- Makes static and dynamic analysis difficult through instruction obfuscation
- Prevents detection of instruction patterns and behavior prediction
Implementation advantages:
- Conceals malicious instructions from EDR monitoring
- Protects against code patching attempts
- Hinders behavioral analysis through custom execution model
Multi-VM approach further evades detection:
- Multiple VMs running concurrently disrupts heuristic pattern detection
- Each VM creates distinct event patterns, confusing EDR correlation
- "ETW noise" technique to blend with legitimate activity
Deployment strategies:
- Bytecode polling - periodically fetching new instructions from C2
- Using transpilers to convert compiled binaries to custom bytecode
- Applying polymorphic engine to mutate VM code itself
Successfully evaded detection for:
- Initial shellcode/bytecode execution (subsequent actions still monitored)
- Specific AV/EDR patching routines (may require updates per product)
- Initial C2 communication (ongoing traffic patterns may be detected)
- Specific AD queries (patterns of queries can still be flagged)
QEMU-Based Virtualization Evasion
Concept: Deploy portable QEMU VMs to execute malicious code within guest OS, avoiding host-based EDR detection
Technical Implementation:
- Portable QEMU deployment via ZIP archives containing VM binaries and configurations
- Tiny Core Linux as lightweight guest OS (minimal footprint ~50MB)
- VBS scripts for automated VM deployment and execution
- Custom hostname generation for VM identification and tracking
Configuration Examples:
# VBS deployment script
Set shell = CreateObject("WScript.Shell")
shell.Run "tc.exe -m 512 -hda tc.qcow2 -netdev user,id=net0 -device e1000,netdev=net0"
# QEMU configuration file (upd.conf)
-m 512
-hda tc.qcow2
-netdev user,id=net0
-device e1000,netdev=net0
Persistence Mechanisms:
bootlocal.sh modifications for startup execution
filetool.lst configuration for file persistence across reboots
- SSH service installation and configuration within guest VM
- Reverse SSH tunnels over port 443 for C2 communication
Advanced Techniques:
- Anti-forensic SSH configuration (
StrictHostKeyChecking=no, known hosts to /dev/null)
- SSL/NoSSL tool deployment for encrypted communications
- Randomized hostname generation to mask VM tracking
- Port 443 tunneling to blend with HTTPS traffic
Detection Evasion Benefits:
- Guest VM operations invisible to host-based EDR sensors
- VM network traffic appears as legitimate application activity
- File operations contained within guest filesystem
- Process execution isolated from host monitoring
Limitations & Considerations:
- Requires administrative privileges for some QEMU operations
- VM resource consumption may be detectable
- Network traffic patterns might still trigger detection
- Initial VM deployment artifacts remain on host filesystem
Hook Evasion
Unhooking
- malware overwrites EDR hooks before executing payload
- you can obtain original
ntdll.dll from disk and overwrite it inside your own process
- or you can start the malware process in suspended state and copy the clean
ntdll.dll from you own memory before executing
- Modern Context: While historically effective, relying solely on replacing
ntdll.dll or its hooked sections is less reliable. Modern EDRs often use kernel callbacks, ETW, and other telemetry sources that are not bypassed by user-mode unhooking alone. This technique is often used in conjunction with others.
[!CAUTION]
accessing ntdll.dll file can be flagged, API call to overwrite it also might be hooked by EDR
API Unhooking for AV Bypass
Most EDR/AVs like BitDefender hook Windows APIs by replacing first bytes with JMP instructions (opcode 0xE9)
Modern Context: Similar to general unhooking, patching specific API prologues can bypass simple user-mode hooks, but comprehensive EDR solutions have additional detection layers (kernel events, behavioral analysis) that may still detect the malicious activity following the unhook.
How to identify hooked APIs:
- Create a test program that calls potentially hooked APIs
- Examine first byte of API function using a debugger (like x64dbg)
- If first byte is
0xE9, the function is hooked
Common hooked APIs:
CreateRemoteThread/CreateRemoteThreadEx
VirtualAllocEx
WriteProcessMemory
OpenProcess
RtlCreateUserThread
Unhooking approach:
- Store original bytes of target APIs from clean system
- Identify hooked functions in memory
- Restore original bytes using
WriteProcessMemory on the current process
- Execute malicious code using now-unhooked APIs
Sample implementation:
// Find address of target API function
HANDLE kernelbase_handle = GetModuleHandle("kernel32");
LPVOID CreateRemoteThread_address = GetProcAddress(kernelbase_handle, "CreateRemoteThread");
// Check if function is hooked (first byte is 0xE9)
byte first_byte = (byte)*(char*)CreateRemoteThread_address;
if (first_byte == 0xe9) {
// Replace with original bytes
char original_bytes[] = "\x4C\x8B\xDC\x48\x83"; // Original prologue bytes
WriteProcessMemory(GetCurrentProcess(), CreateRemoteThread_address, original_bytes, 5, NULL);
}
This technique is effective but may require separate execution for the final payload since some AVs block executing immediately after unhooking. Modern EDRs might still correlate the unhooking activity with subsequent suspicious actions.
Unhooking Tools
- unhook BOF - module refreshing (less reliable now due to alternative EDR telemetry sources)
- Unhookme - dynamic unhooking
Direct System Calls
- malware circumvents hook in system DLL by directly system calling into kernel
- you can implement own syscall in assembly and bypass
ntdll.dll hooks
- or obtain
SSN(System Service Number) dynamically and call them(can be done via SysWhispers2)
- Direct syscalls bypass user-mode hooks in
ntdll.dll but do not inherently bypass kernel-level monitoring (e.g., via kernel callbacks or ETW). EDRs are increasingly monitoring for patterns indicative of direct syscall usage itself (e.g., unusual call stack origins for syscalls).
[!CAUTION]
having syscall assembly instructions can be flagged, also this only helps the loader to evade the EDR not the malware itself
- Major EDR vendorsnow flag non‑ntdll syscall sites; consider return‑address replication gadgets to re‑insert a plausible
ntdll frame before the transition.
[!CAUTION]
Some EDRs flag syscalls originating outside ntdll.dll. Maintaining plausible stacks/return frames may be required to avoid heuristics.
Direct Syscall Tools
Bypasses user-mode hooks but not kernel monitoring. Requires System Service Dispatch Table (SSDT) index:
Indirect System Calls
- malware uses code fragments in kernel DLL without calling the hooked functions in those DLL
- prepare the system call in assembly then find a syscall instruction in
ntdll.dll and jump to that location
- Modern Context: Similar to direct syscalls, this bypasses user-mode hooks but not necessarily kernel-level monitoring. Finding and jumping to existing
syscall instructions can be less suspicious than embedding raw syscall stubs, but the subsequent kernel activity is still visible.
[!TIP]
this is preferred,you can also boost evasion techniques by hiding inside a .dll
Kernel‑Mode EDR Killers (BYOVD)
- Bring‑Your‑Own‑Vulnerable‑Driver (BYOVD) attacks load legitimately signed but exploitable drivers—examples include rtcore64.sys, iqvw64e.sys, and terminator.sys—to execute privileged code inside the kernel.
- Typical payload actions
- Patch or unregister kernel‑mode notify callbacks (
PsSetCreateProcessNotifyRoutine, ObRegisterCallbacks) to blind user‑mode EDR components.
- Overwrite or unload WdFilter.sys and other sensor drivers, fully disabling Defender or third‑party agents.
- Public toolchains such as Terminator, kdmapper, and EDRSensorDisabler automate these steps.
- Case study: Lenovo
LnvMSRIO.sys (CVE‑2025‑8061). Exposes physical memory/MSR read‑write primitives to low‑privileged users; can overwrite MSR_LSTAR and pivot to Ring‑0 payload, then patch/unregister callbacks to blind EDR.
[!TIP]
The vulnerable‑driver blocklist (DriverSiPolicy.p7b) is enabled by default on Windows 11 22H2+ and refreshed every Patch Tuesday. Keep HVCI/KDP enabled so attacker drivers cannot patch protected code pages, and enable Hardware‑Enforced Stack Protection (CET/Shadow Stack) on Windows 11 24H2 to break call‑stack spoofing.
[!NOTE]
Because the blocklist is on by default and updated frequently, a BYOVD chain now often needs two vulnerable drivers: one to disable Secure Boot or flip CiOptions, and a second to perform the EDR‑killer actions before the next blocklist refresh.
User-Mode Application Whitelisting Bypass
Exploiting Vulnerable Trusted Applications
Windows Defender Application Control (WDAC) and similar application whitelisting solutions can be bypassed by leveraging vulnerabilities in trusted, signed applications. A notable technique involves exploiting N-day vulnerabilities in the V8 JavaScript engine within Electron-based applications.
- Concept (Bring Your Own Vulnerable Application - BYOVA):
- A trusted, signed Electron application (e.g., an older version of VSCode) with a known V8 vulnerability is used as a carrier.
- The application's
main.js (or equivalent) is replaced with a V8 exploit that executes a native shellcode payload.
- If the application is whitelisted, WDAC allows it to run, inadvertently executing the malicious shellcode.
- Advantages:
- Achieves native shellcode execution, overcoming limitations of pure JavaScript execution in some backdoored Electron app scenarios.
- Shellcode runs in a browser-like process context, where behaviors like Read-Write-Execute (RWX) memory regions (due to JIT compilers) are common and may appear less suspicious to EDRs.
- Exploit Development & Operationalization Challenges:
- V8 Version Targeting: Electron's V8 often lags behind Chrome's and includes backported security patches. Vulnerabilities must be chosen that were patched after the target application's Electron version was frozen. Electron's cherry-picked patches should be reviewed.
- Debugging: Building the specific V8 version (e.g., using
d8 debug shell with --allow-natives-syntax for %DebugPrint()) is crucial for understanding memory layouts and adapting exploits.
- Offset Inconsistencies: Hardcoded offsets in public exploits (often Linux-based) need adjustment for the target V8 version and OS (Windows). Function pointer offsets for overwriting can even vary between Windows versions.
- Solution for offset variation: Launch the exploit multiple times in child processes, each trying a different potential offset. The parent process monitors for success (e.g., mutex creation by payload).
- Sandbox Escape: Public V8 exploits might use sandbox escape techniques already patched (cherry-picked) in the target Electron V8 version, requiring new or modified escapes.
- JIT Compiler Interference (e.g., V8 TurboFan):
- Optimizations can consolidate repeated instruction sequences (e.g., multiple floating-point values), affecting shellcode smuggling. Workarounds include compact shellcode or varying instruction positions.
- Copying large shellcode payloads can be problematic. Workaround: multiple smaller copy loops or using a stager payload that fetches the main payload.
- Payload Obfuscation: Obfuscate the JavaScript exploit (e.g., in
main.js) to hinder analysis. Re-obfuscating per deployment can help avoid signature-based detection.
- Defense & Future Considerations:
- Electron's experimental integrity fuse feature, if enabled by developers, can verify the integrity of application files (including
main.js) at runtime, potentially thwarting this technique by exiting if tampering is detected.
- Older application versions without this fuse remain vulnerable.
Process Manipulation
Early Cascade Injection
- Novel process injection technique targeting user-mode process creation
- Combines elements of Early Bird APC with EDR-Preloading
- Avoids queuing cross-process APCs while maintaining minimal remote process interaction
- Works by:
- Targeting processes during the transition from kernel-mode to user-mode (
LdrInitializeThunk)
- Leveraging callback pointers (like
g_pfnSE_DllLoaded) during Windows process creation
- Executing malicious code before EDR detection measures can initialize
- Advantages:
- Operates before EDRs can initialize their hooks and detection measures
- Particularly effective against EDRs that hook
NtContinue or use delayed initialization
- Avoids ETW telemetry that traditional injection techniques trigger
- Minimal remote process interaction reduces detection footprint
- More stealthy than traditional techniques like DLL hijacking or direct syscalls
- Key insight: EDRs typically load their detection measures after the
LdrInitializeThunk function executes, providing a window of opportunity for code execution before security measures initialize
- watch for early
NtCreateThreadEx inside LdrInitializeThunk
Early Startup Bypass
Concept: Execute malware before the EDR's user-mode component fully initializes, creating a window of opportunity for undetected execution.
Implementation:
- Target the gap between kernel driver loading and user-mode agent initialization
- Execute payload during system startup before EDR hooks are established
- Leverage services that start before EDR components
Research Findings (Cortex XDR):
- Successfully executed Mimikatz with
lsadump::sam without detection during early startup
- EDR kernel drivers may be loaded but user-mode hooks not yet established
- Timing window varies depending on system performance and EDR implementation
Detection Evasion:
- Creates process activity before EDR monitoring is fully operational
- Avoids user-mode hooks that haven't been established yet
- Kernel-level monitoring may still detect activity depending on driver initialization order
Limitations:
- Requires precise timing and understanding of EDR startup sequence
- May not work against EDRs with early kernel-level monitoring
- Window of opportunity may be brief on fast systems
Waiting Thread Hijacking (WTH)
- A stealthier version of classic Thread Execution Hijacking
- Intercepts the flow of a waiting thread and misuses it for executing malicious code
- Avoids suspicious APIs like
SuspendThread/ResumeThread and SetThreadContext that trigger most alerts
- Required handle access:
- For target process:
PROCESS_VM_OPERATION, PROCESS_VM_READ, PROCESS_VM_WRITE
- For target thread:
THREAD_GET_CONTEXT
- Uses less monitored APIs:
NtQuerySystemInformation (with SystemProcessInformation)
GetThreadContext
ReadProcessMemory
VirtualAllocEx
WriteProcessMemory
VirtualProtectEx
- Implementation can be further obfuscated by splitting steps across multiple functions to evade behavioral signatures
- Primarily bypasses EDRs that focus on detecting specific API calls rather than behavioral patterns
- Effective against EDRs that are restrictive about remote execution methods but more lenient with allocations and writes
- Suitable for hiding the point at which implanted code was executed
PPID Spoofing
- Creates process with fake parent process ID
- Hides true process creation chain
- Makes process tree analysis misleading
Process Hiding
A technique to hide processes from EDR monitoring by manipulating the Interrupt Request Level (IRQL):
- Raise the IRQL of current CPU core
- Create and queue Deferred Procedure Calls (DPCs) to raise the IRQL of other cores
- Perform sensitive task (for example, hiding process)
- Signal DPCs in other cores to stop spinning and exit
- Lower IRQL of current core back to original
irql = RaiseIRQL();
dpcPtr = AcquireLock();
do_stuff();
ReleaseLock(dpcPtr);
LowerIRQL(irql);
This approach temporarily prevents EDR from monitoring the process during the critical operations by operating at an elevated privilege level.
[!NOTE]
HVCI-enabled 23H2 kernels may crash when raising IRQL this way. Safer alternative: kernel-driver patching of PsLookupProcessByProcessId.
UAC Bypass via Intel ShaderCache Directory
- Concept: Exploits weak permissions (
Authenticated Users: Full Control) on the Intel\ShaderCache directory (%LOCALAPPDATA%\LocalLow\Intel\ShaderCache) combined with the behavior of auto-elevated processes (like taskmgr.exe) writing to this location.
- Mechanism:
- Clear Directory: Requires aggressively terminating processes holding handles (
explorer.exe, sihost.exe, etc.) and deleting files within the ShaderCache directory. Permissions might need adjustment (icacls) to allow deletion. Launching taskmgr.exe briefly (with a timeout) helps identify recently written filenames and can trigger writes needed for the exploit.
- Junction Creation: Create a directory junction from
ShaderCache to \??\GLOBALROOT\RPC CONTROL.
- Symbolic Link: Determine a recently used filename within
ShaderCache (before clearing). Create an object directory symbolic link (CreateDosDevice) from Global\GLOBALROOT\RPC CONTROL\<recent_filename> to a target DLL path (e.g., \??\C:\Windows\System32\oci.dll).
- Trigger Write: Launch an auto-elevated process (e.g.,
taskmgr.exe) that writes to ShaderCache. The write operation follows the junction and then the symbolic link, resulting in the creation of a (dummy) target file (e.g., oci.dll) in a privileged location (System32).
- Overwrite & Execute: Overwrite the created dummy file with the actual malicious DLL. Launch a process (like
comexp.msc) that attempts to load the target DLL, thereby executing the malicious code with elevated privileges.
- EDR Relevance:
- Bypasses User Account Control (UAC), a primary defense layer.
- Relies on manipulating file system objects (junctions, symlinks) and process interactions that EDRs monitor.
- Involves potentially noisy actions like mass process termination and permission changes.
- The final payload execution often relies on DLL hijacking techniques.
[!TIP]
Symlink/junction UAC races are build‑dependent and brittle. Validate on the specific target build; many have partial or complete mitigations.
PPL (Protected Process Light) Bypass
Concept: Bypass Protected Process Light security by creating alternative service configurations that avoid PPL protections.
Palo Alto Cortex XDR PPL Bypass Technique:
# Create alternative service that launches cyserver.exe without PPL protection
sc create "fake_cyserver" binPath="C:\Program Files\Palo Alto Networks\Traps\cyserver.exe" start=auto
How it works:
- Creates a second service that launches the EDR's main process (cyserver.exe)
- Original PPL-protected service fails to start due to startup dependencies
- New service configuration is not protected by EDR drivers
- EDR process runs without PPL protection, expanding attack surface
Limitations:
- Service names beginning with "cyserver*" are blocked by some EDR implementations
- EDR functionality may remain intact despite PPL bypass
- Self-protection mechanisms may still be active at process level
- Vendor response varies - may not be considered a security vulnerability
Detection & Response:
- EDR thinks original service is stopped but agent continues running
- Attack surface increases as process no longer has PPL protections
- Reported to Palo Alto on 12.09.2023 with limited vendor response
Broader Implications:
- Demonstrates service configuration vulnerabilities in EDR implementations
- Shows potential for bypassing Windows security features through alternative execution paths
- Relevant for other EDRs that rely on PPL for self-protection
Using NtCreateUserProcess for Stealthy Process Creation
The native API NtCreateUserProcess(), located in ntdll.dll, is the lowest-level user-mode function for creating processes. Calling it directly can bypass EDR hooks placed on higher-level functions like CreateProcessW in kernel32.dll. This makes it a valuable technique for stealthier process creation.
Key Concepts:
- Bypass Mechanism: Avoids user-land hooks on more commonly monitored APIs like
CreateProcessW.
- Process Parameters: Requires careful setup of structures like
RTL_USER_PROCESS_PARAMETERS (often via RtlCreateProcessParametersEx), PS_CREATE_INFO, and PS_ATTRIBUTE_LIST.
RTL_USER_PROCESS_PARAMETERS: Defines process startup information, including image path, command line, environment variables, etc. The ImagePathName must be in NT path format (e.g., \??\C:\Windows\System32\executable.exe).
PS_ATTRIBUTE_LIST: Can specify attributes like the image name.
- Flags:
ProcessFlags and ThreadFlags allow fine-grained control over process and thread creation (e.g., creating suspended). Sources like Process Hacker's headers (ntpsapi.h) can provide valid flag definitions. For minimal use, these can sometimes be NULL.
- Implementation Details: Involves initializing several structures and using functions from
ntdll.dll such as RtlInitUnicodeString, RtlCreateProcessParametersEx, and RtlAllocateHeap. The article also mentions that the ProcessParameters argument for NtCreateUserProcess was found to be mandatory, and RtlCreateProcessParametersEx is used with the RTL_USER_PROCESS_PARAMETERS_NORMALIZED flag. The PS_CREATE_INFO structure needs its Size and State (e.g., PsCreateInitialState) members initialized. The PS_ATTRIBUTE_LIST is populated to include the image name.
Example High-Level Steps:
- Define the path to the executable using
UNICODE_STRING and initialize it with RtlInitUnicodeString (e.g., L"\??\C:\Windows\System32\calc.exe").
- Create and populate
RTL_USER_PROCESS_PARAMETERS using RtlCreateProcessParametersEx, providing the image path and normalizing parameters.
- Initialize a
PS_CREATE_INFO structure.
- Allocate and initialize a
PS_ATTRIBUTE_LIST, setting the PS_ATTRIBUTE_IMAGE_NAME attribute with the image path.
- Call
NtCreateUserProcess with the prepared handles, access masks, and structures.
- Perform cleanup, for instance, by calling
RtlFreeHeap and RtlDestroyProcessParameters.
This technique allows for creating a new process with more direct control, potentially evading EDRs that primarily hook kernel32.dll API calls. However, EDRs with kernel telemetry or hooks deeper within ntdll.dll (or monitoring syscalls directly) might still detect the NtCreateUserProcess call or the subsequent behavior of the spawned process.
Advanced Process Execution Alternatives
- TangledWinExec - alternative process execution techniques
- rad9800 - indirectly loading DLL through a work item
Acquiring Process Handles
- Without using suspicious
OpenProcess:
- Find
explorer.exe window handle using EnumWindows
- Convert to process handle with
GetProcessHandleFromHwnd
- Leverage
PROCESS_DUP_HANDLE to duplicate into a pseudo handle for Full Access
Callstack Manipulation
Return Address Overwrite
- overwrite function's return address with 0
- that terminates call stack's unwinding algorithm
- examination based on
DbgHelp!StackWalk64 fails
- implement custom API resolver similar to
GetProcAddress
- before calling out to suspicious functions, overwrite
RetAddr :=0
- when system API returns, restore own
RetAddr
Callstack Spoofing
- Manipulates the call stack to appear legitimate
- Makes it harder to detect malicious code execution
- Tools and techniques:
- ThreadStackSpoofer
- CallStackSpoofer
- AceL
…(truncated)
1---2name: offensive-edr-evasion3description: EDR evasion offensive checklist: hook unhooking (user/kernel), direct syscalls, PPID spoofing, process injection variants, AMSI bypass, ETW patching, memory encryption, and behavior-based evasion. Use when planning EDR bypass during red team engagements or researching AV/EDR evasion techniques. Use only for authorized security research, training, or assessment.4license: MIT5---6# SKILL: Endpoint Detection and Response78## Metadata9- **Skill Name**: edr-evasion10- **Folder**: offensive-edr-evasion11- **Source**: https://github.com/SnailSploit/offensive-checklist/blob/main/edr.md1213## Description14EDR evasion offensive checklist: hook unhooking (user/kernel), direct syscalls, PPID spoofing, process injection variants, AMSI bypass, ETW patching, memory encryption, and behavior-based evasion. Use when planning EDR bypass during red team engagements or researching AV/EDR evasion techniques.1516## Trigger Phrases17Use this skill when the conversation involves any of:18`EDR evasion, EDR bypass, hook unhooking, direct syscalls, PPID spoofing, process injection, AMSI bypass, ETW patch, memory encryption, AV evasion, behavioral evasion, red team evasion`1920## Instructions for Claude2122When this skill is active:231. Load and apply the full methodology below as your operational checklist242. Follow steps in order unless the user specifies otherwise253. For each technique, consider applicability to the current target/context264. Track which checklist items have been completed275. Suggest next steps based on findings2829---3031## Full Methodology3233# Endpoint Detection and Response3435## Fundamentals3637### AV vs EDR3839**Antivirus (preventive approach)**:4041- Static Analysis: Matching known signatures in files42- Dynamic Analysis: Limited behavioral monitoring/sandboxing43- Effective against known threats, weaker against advanced attacks4445**EDR (proactive & investigative approach)**:4647- Continuous endpoint monitoring48- Behavioral analysis at kernel level49- Anomaly detection and post-compromise visibility50- Prioritizes incident response and investigation5152### Windows Execution Flow5354Windows program execution follows a hierarchical flow:55561. **Applications** - User programs like firefox.exe572. **DLLs** - Libraries providing Windows functionality without direct low-level access583. **Kernel32.dll** - Core DLL for memory management, process/thread creation594. **Ntdll.dll** - Lowest user-mode DLL that exposes the NT API interface to the kernel605. **Kernel** - Core OS component with unrestricted hardware access6162Example operation flow (creating a file):63641. Application invokes `CreateFile` function652. CreateFile forwards to `NtCreateFile`663. Ntdll.dll triggers `NtCreateFile` syscall674. Kernel creates the file and returns a handle6869## EDR Visibility7071### EDR Architecture & Components7273EDR solutions consist of multiple components creating a complex attack surface:7475**Client-Side Components:**7677- **User-space Applications** - Main agent processes and UI components78- **Kernel-space Drivers** - Filter drivers, network drivers, software drivers79- **Communication Interfaces** - IOCTLs, FilterConnectionPorts, ALPC, Named Pipes8081**Component Communication Methods:**8283- **Kernel-to-Kernel**: Exported functions, IOCTLs84- **User-to-Kernel**: IOCTLs, FilterConnectionPorts (minifilter-specific), ALPC85- **User-to-User**: ALPC, Named Pipes, Files, Registry8687**Server-Side Components:**8889- Cloud services and management consoles90- On-premise servers (some vendors)91- Custom protocols for agent-to-cloud communication9293### EDR Visibility Methods9495EDR solutions require extended visibility into system activities:9697- Filesystem monitoring via mini-filter drivers98- Process/module loading via image load kernel callbacks99- Process/.NET modules/Registry/kernel object events via ETW Ti100- Network monitoring via NDIS and network filtering drivers101102### Static Analysis103104- Extract information from binary105 - Known malicious strings106 - Threat actor IP or domains107 - Malware binary hashes108109### Dynamic Analysis110111- Execute binary in a sandbox environment and observe it112 - Network connections113 - Registry changes114 - Memory access115 - File creation/deletion116- AntiMalware Scan Interface117118### Behavioral Analysis119120- Observe the binary as its executing, Hook into functions/syscalls121 - User actions122 - System calls123 - Kernel callbacks124 - Commands executed in the command line125 - Which process is executing the code126 - Event Tracing for Windows127128## Detection Methods129130### AV Signature Scanning131132- Scans files using known signatures (YARA rules)133- Typically targets loaders and droppers134- Primarily static analysis of files on disk135136### AV Emulation137138- Runs suspicious programs in a simulated environment139- Triggers on behaviors without executing real code140- Used to detect obfuscated malware141142### Usermode Hooks143144- EDR hooks critical API calls in userspace (ntdll.dll)145- Monitors process creation, memory allocations, and network operations146- Allows for inspection before execution continues147148### Kernel Telemetry149150- Monitors events directly from the kernel151- Captures file, registry, process, and network operations152- Difficult to bypass as it operates at a lower level153154### Memory Scanning155156- Scans process memory for known signatures157- Triggers based on suspicious behavior158- Looks for shellcode, encryption, malicious strings159- **Modern Context:**160 - Attackers also scan process memory for sensitive artifacts like authentication tokens. Co‑pilot/IDE integrations, chat assistants, and browser extensions frequently cache Bearer/JWT tokens in memory.161 - Practical triage: search for `"Authorization: Bearer"`, `"eyJ"` (base64 JWT prefix), or provider‑specific headers; dump minimal pages to avoid tripping anti‑exfil rules.162163## OpSec Quickstart (lab)164165- Pre‑run166 - Network: block or sinkhole vendor EDR/XDR endpoints; disable cloud sample submission; tag lab hosts.167 - Mitigations snapshot: `Get-ProcessMitigation -System`; `Get-CimInstance Win32_DeviceGuard` (VBS/HVCI/KDP); `Get-MpPreference` (ASR/Cloud).168 - Events baseline: enable and tail `Microsoft-Windows-CodeIntegrity/Operational`, `Security (4688/4689)`, `Microsoft-Windows-Sense/Operational`, Sysmon (if present).169- Injection hygiene170 - Favor `MEM_IMAGE` mappings (ghosting/herpaderping/overwriting) over `MEM_PRIVATE` RWX to avoid 24H2 hotpatch loader checks.171 - Satisfy XFG/CET: jump via import thunks; ensure IBT `ENDBR64` at indirect targets; maintain plausible stacks for syscalls (replicate `ntdll` frames).172 - Avoid noisy APIs: split `alloc/write/exec` over time; prefer APC+`NtContinue` pivots; keep thread contexts consistent.173- Telemetry minimization174 - Jitter long‑lived channels; prefer named‑pipe/HTTP3 over noisy HTTP1; throttle upload intervals.175 - Use COM/runspace over PowerShell console to reduce script‑block logs; avoid AMSI‑flagged prologues.176- Cleanup177 - Remove services, tasks, drivers; restore SDDL; revert registry policy flips (WDAC/CI/Defender) and re‑enable protections.178 - Purge user caches (Recent Files, Jump Lists) and ETW providers enabled during tests.179180### Memory Regions181182- Monitors suspicious memory allocation patterns183- Flags RWX (read-write-execute) regions184- Tracks regions that change from RW to RX185186### Callstack Analysis187188- Examines the call stack of suspicious functions189- Verifies legitimate origin of critical operations190- Detects unusual function call chains191192### Hook Implementation193194EDRs can't directly hook kernel memory due to PatchGuard, so they:1951961. Inject their DLL into newly spawned processes1972. Position before malware can block/unmap it1983. Adjust `_PEB`, hook process's module `IAT`/Imports, and loaded libraries `EAT`/Exports1994. Implement trampolines, hooks, and detours200201### ETW Monitoring202203- EDR maintains ring-buffer with per-process activities produced by ETW Ti:204 - Processes, command lines, parent-child relationships205 - File/Registry/Process open/write operations206 - Created threads, their call stacks, starting addresses207 - Native functions called208 - Created .NET AppDomains, loaded .NET assemblies, static class names, methods209210#### Event Correlation211212- High fidelity alert (such as LSASS open) triggers correlation of collected activities213- High memory/resources cost limits preservation of events to a time window214- ML/AI may compute risk scores and isolate TTP (Tactics, Techniques, and Procedures)215216#### Shellcode Loaders217218Shellcode loaders typically follow this pattern:219220```c221char *shellcode = "\xAA\xBB...";222char *dest = VirtualAlloc(NULL, 0x1234, 0x3000, PAGE_READWRITE);223memcpy(dest, shellcode, 0x1234)224VirtualProtect(dest, 0x1234, PAGE_EXECUTE_READ, &result)225(*(void(*)())(dest))(); // jump to dest: execute shellcode226```227228## Attacking EDR Infrastructure Directly229230### Driver Attack Surface Analysis231232A systematic approach to analyzing EDR drivers from a low-privileged user perspective:233234#### 1. Driver Discovery235236**Static Analysis:**237238```powershell239# List loaded drivers240driverquery /v241Get-WindowsDriver -Online -All242243# Using WMI244Get-WmiObject Win32_PnPSignedDriver | Select-String "EDR_Vendor"245```246247**Dynamic Analysis:**248249```powershell250# Using sc command251sc query type= driver state= all252253# Process Monitor filtering254# Filter: Process and Thread Activity -> Show Image/DLL255```256257#### 2. Interface Enumeration258259**Device Driver Interfaces:**260261- Listed in WinObj under "GLOBAL??" as Symbolic Links262- Accessible via `\\.\DEVICE_NAME` format263- Tools: WinObj (Sysinternals), DeviceTree (OSR - discontinued)264265**Mini-Filter Driver Interfaces:**266267- Listed in WinObj as "FilterConnectionPort" objects268- Communication via `FltCreateCommunicationPort` API269- Example paths: `\CyvrFsfd`, `\SophosPortName`270271#### 3. Access Permission Analysis272273**Device Driver ACL Checking:**274275```cpp276// Using DeviceTree (preferred) or kernel debugger277// WinDbg example:278!object \Device\DeviceName279!sd <SecurityDescriptor_Address> 1280```281282**FilterConnectionPort ACL Checking:**283284```powershell285# Using NtObjectManager (James Forshaw)286Get-FilterConnectionPort -Path "\FilterPortName"287# Error indicates access denied288289# In WinDbg:290!object \FilterPortName291dx (((nt!_OBJECT_HEADER*)0xAddress)->SecurityDescriptor & ~0xa)292!sd <SecurityDescriptor_Address> 1293```294295#### 4. Interface Functionality Analysis296297**Device Driver Communication:**298299- Primary method: DeviceIoControl() → IRP_MJ_DEVICE_CONTROL300- IOCTL codes differentiate between functions301- May include process ID verification for authorization302303**FilterConnectionPort Communication:**304305- Uses callback functions: ConnectNotifyCallback, DisconnectNotifyCallback, MessageNotifyCallback306- Similar to IOCTL dispatch with different message types307308#### 5. Common EDR Driver Interfaces309310**Examples of accessible interfaces found in research:**311312**Palo Alto Cortex XDR:**313314- **Device Interfaces**:315 - `\\.\PaloEdrControlDevice` (tedrdrv.sys) - ~20 IOCTL handlers with various functionality316 - `\\.\CyvrMit` (cyvrmtgn.sys) - Legacy Cyvera interface317 - `\\.\PANWEdrPersistentDevice11343` (tedrpers-<version>.sys) - Persistent device interface318- **FilterConnectionPort**: Various ports with different ACLs319- **Research Findings**:320 - IOCTL 0x2260D8 returns 3088 bytes of statistics data (accessible to low-privileged users)321 - IOCTL 0x2260D0 provides initialization status information322 - Some interfaces accessible due to injected DLL architecture requiring broad permissions323324**Sophos Intercept X:**325326- **FilterConnectionPort**: `\SophosPortName`327- **Analysis Results**: Accessible interfaces for legitimate process communication but limited attack surface328329#### 6. Why EDRs Have Open ACLs330331EDRs often use an architecture where:332333- Agent injects DLLs into processes (including low-privileged ones like `word.exe`)334- Injected DLLs communicate directly with drivers via IOCTLs335- Drivers cannot restrict based solely on process privilege level336- Results in more permissive ACLs to accommodate legitimate injected processes337338## Evasion Techniques339340### Memory-Based Evasion341342#### EDR-Freeze343344A novel technique exploiting Windows Error Reporting (WER) to temporarily disable EDR/AV processes:345346##### Mechanism347348- Leverages `WerFault.exe` and Windows Error Reporting infrastructure349- Suspends all threads in target EDR/AV processes indefinitely350- No kernel-mode access or driver exploitation required351- Operates entirely from user-mode context352353##### Technical Implementation354355- Trigger WER fault injection on target security process356- WER suspends all threads for crash dump generation357- Attacker maintains suspended state without completing crash handling358- Target process remains alive but non-functional359360##### Advantages361362- No elevation required in default WER configurations363- Avoids detection heuristics for process termination364- Temporary disabling without unloading kernel drivers365- Minimal forensic footprint compared to driver killing366367##### Limitations368369- Effectiveness varies by Windows version and WER configuration370- Some EDRs implement anti-suspension protections371- Temporary nature requires continuous re-application372- May generate WER event logs exposing the technique373374> [!TIP]375> Blue team detection: Alert on `PssSuspendProcess` / `PssSuspendThread` API calls combined with `OpenProcess` targeting EDR process IDs, or monitor Event ID 1001 (Windows Error Reporting) with unusual source processes.376377#### Memory Encryption378379- Encrypts shellcode in memory when not in use380- Popular techniques:381 - SWAPPALA / SLE(A)PING382 - Thread Pool / Pool Party383 - Gargoyle384 - Ekko385 - Cronos386 - Foliage387388#### Sleep Obfuscation389390- ROP-Styles sleep obfuscations391 - [Ekko](https://github.com/Cracked5pider/Ekko)392 - [FOLIAGE](https://github.com/y11en/FOLIAGE)393 - these setup `_CONTEXT` in advance so that `EIP/RIP` points to native API394 - and then schedule APC with `NtContinue` to jump to that requested API395396#### Secure Enclaves (VBS)397398- Virtualization-Based Security (VBS) enclaves provide an isolated user-mode TEE that even kernel-mode sensors cannot inspect under normal conditions.399- Deprecation/support scope (Microsoft):400 - Windows 11 ≤ 23H2: VBS enclaves are deprecated; existing enclaves signed with the legacy EKU (OID `1.3.6.1.4.1.311.76.57.1.15`) continue to run until re-signed. New enclave signing requires updated EKUs and is not supported on these versions.401 - Windows 11 24H2+ and Windows Server 2025: VBS enclaves are supported with new EKUs.402- Security fix: CVE-2024-49076 (VBS Enclave EoP) — ensure December 2024+ updates are applied.403- Signing constraints: Only Microsoft-signed enclave DLLs or DLLs signed via Azure Trusted Signing load; test- or self-signed DLLs are rejected.404- Architecture summary:405 - Enclave host app (VTL0) invokes enclave APIs; enclave DLL executes in isolated user mode (VTL1) with restricted API surface; Secure Kernel validates integrity.406- Offensive considerations (lab): viable for secure storage of secrets/implants during sleep and for hiding sensitive code paths; limited by restricted API surface and signing requirements.407- Practical notes:408 - On unsupported SKUs/versions, enclave APIs may appear and return `STATUS_FEATURE_DEPRECATED`.409 - Prefer testing on Windows 11 24H2+/Server 2025 with proper signing.410411#### Malware Virtualization412413- Malware virtualization provides advanced evasion against modern EDR:414 - Embeds a custom virtual machine to execute bytecode instead of native code415 - Makes static and dynamic analysis difficult through instruction obfuscation416 - Prevents detection of instruction patterns and behavior prediction417418- Implementation advantages:419 - Conceals malicious instructions from EDR monitoring420 - Protects against code patching attempts421 - Hinders behavioral analysis through custom execution model422423- Multi-VM approach further evades detection:424 - Multiple VMs running concurrently disrupts heuristic pattern detection425 - Each VM creates distinct event patterns, confusing EDR correlation426 - "ETW noise" technique to blend with legitimate activity427428- Deployment strategies:429 - Bytecode polling - periodically fetching new instructions from C2430 - Using transpilers to convert compiled binaries to custom bytecode431 - Applying polymorphic engine to mutate VM code itself432433- Successfully evaded detection for:434 - Initial shellcode/bytecode execution (subsequent actions still monitored)435 - Specific AV/EDR patching routines (may require updates per product)436 - Initial C2 communication (ongoing traffic patterns may be detected)437 - Specific AD queries (patterns of queries can still be flagged)438439### QEMU-Based Virtualization Evasion440441- **Concept**: Deploy portable QEMU VMs to execute malicious code within guest OS, avoiding host-based EDR detection442- **Technical Implementation**:443 - Portable QEMU deployment via ZIP archives containing VM binaries and configurations444 - Tiny Core Linux as lightweight guest OS (minimal footprint ~50MB)445 - VBS scripts for automated VM deployment and execution446 - Custom hostname generation for VM identification and tracking447448- **Configuration Examples**:449450 ```vbs451 # VBS deployment script452 Set shell = CreateObject("WScript.Shell")453 shell.Run "tc.exe -m 512 -hda tc.qcow2 -netdev user,id=net0 -device e1000,netdev=net0"454 ```455456 ```conf457 # QEMU configuration file (upd.conf)458 -m 512459 -hda tc.qcow2460 -netdev user,id=net0461 -device e1000,netdev=net0462 ```463464- **Persistence Mechanisms**:465 - `bootlocal.sh` modifications for startup execution466 - `filetool.lst` configuration for file persistence across reboots467 - SSH service installation and configuration within guest VM468 - Reverse SSH tunnels over port 443 for C2 communication469470- **Advanced Techniques**:471 - Anti-forensic SSH configuration (`StrictHostKeyChecking=no`, known hosts to `/dev/null`)472 - SSL/NoSSL tool deployment for encrypted communications473 - Randomized hostname generation to mask VM tracking474 - Port 443 tunneling to blend with HTTPS traffic475476- **Detection Evasion Benefits**:477 - Guest VM operations invisible to host-based EDR sensors478 - VM network traffic appears as legitimate application activity479 - File operations contained within guest filesystem480 - Process execution isolated from host monitoring481482- **Limitations & Considerations**:483 - Requires administrative privileges for some QEMU operations484 - VM resource consumption may be detectable485 - Network traffic patterns might still trigger detection486 - Initial VM deployment artifacts remain on host filesystem487488### Hook Evasion489490#### Unhooking491492- malware overwrites EDR hooks before executing payload493- you can obtain original `ntdll.dll` from disk and overwrite it inside your own process494- or you can start the malware process in suspended state and copy the clean `ntdll.dll` from you own memory before executing495 - **Modern Context:** While historically effective, relying solely on replacing `ntdll.dll` or its hooked sections is less reliable. Modern EDRs often use kernel callbacks, ETW, and other telemetry sources that are not bypassed by user-mode unhooking alone. This technique is often used in conjunction with others.496 > [!CAUTION]497 > accessing `ntdll.dll` file can be flagged, API call to overwrite it also might be hooked by EDR498499##### API Unhooking for AV Bypass500501- Most EDR/AVs like BitDefender hook Windows APIs by replacing first bytes with `JMP` instructions (opcode `0xE9`)502- **Modern Context:** Similar to general unhooking, patching specific API prologues can bypass simple user-mode hooks, but comprehensive EDR solutions have additional detection layers (kernel events, behavioral analysis) that may still detect the malicious activity following the unhook.503- How to identify hooked APIs:504 - Create a test program that calls potentially hooked APIs505 - Examine first byte of API function using a debugger (like x64dbg)506 - If first byte is `0xE9`, the function is hooked507- Common hooked APIs:508 - `CreateRemoteThread`/`CreateRemoteThreadEx`509 - `VirtualAllocEx`510 - `WriteProcessMemory`511 - `OpenProcess`512 - `RtlCreateUserThread`513- Unhooking approach:514 1. Store original bytes of target APIs from clean system515 2. Identify hooked functions in memory516 3. Restore original bytes using `WriteProcessMemory` on the current process517 4. Execute malicious code using now-unhooked APIs518- Sample implementation:519520 ```c521 // Find address of target API function522 HANDLE kernelbase_handle = GetModuleHandle("kernel32");523 LPVOID CreateRemoteThread_address = GetProcAddress(kernelbase_handle, "CreateRemoteThread");524525 // Check if function is hooked (first byte is 0xE9)526 byte first_byte = (byte)*(char*)CreateRemoteThread_address;527 if (first_byte == 0xe9) {528 // Replace with original bytes529 char original_bytes[] = "\x4C\x8B\xDC\x48\x83"; // Original prologue bytes530 WriteProcessMemory(GetCurrentProcess(), CreateRemoteThread_address, original_bytes, 5, NULL);531 }532 ```533534- This technique is effective but may require separate execution for the final payload since some AVs block executing immediately after unhooking. **Modern EDRs might still correlate the unhooking activity with subsequent suspicious actions.**535536#### Unhooking Tools537538- [unhook BOF](https://github.com/rsmudge/unhook-bof) - module refreshing (less reliable now **due to alternative EDR telemetry sources**)539- [Unhookme](https://github.com/mgeeky/UnhookMe) - dynamic unhooking540541#### Direct System Calls542543- malware circumvents hook in system DLL by directly system calling into kernel544- you can implement own syscall in assembly and bypass `ntdll.dll` hooks545- or obtain `SSN`(System Service Number) dynamically and call them(can be done via [SysWhispers2](https://github.com/jthuraisamy/SysWhispers2))546 - Direct syscalls bypass user-mode hooks in `ntdll.dll` but do not inherently bypass kernel-level monitoring (e.g., via kernel callbacks or ETW). EDRs are increasingly monitoring for patterns indicative of direct syscall usage itself (e.g., unusual call stack origins for syscalls).547 > [!CAUTION]548 > having syscall assembly instructions can be flagged, also this only helps the loader to evade the EDR not the malware itself549 - Major EDR vendorsnow flag **non‑ntdll syscall sites**; consider **return‑address replication gadgets** to re‑insert a plausible `ntdll` frame before the transition.550551> [!CAUTION]552> Some EDRs flag syscalls originating outside `ntdll.dll`. Maintaining plausible stacks/return frames may be required to avoid heuristics.553554##### Direct Syscall Tools555556Bypasses user-mode hooks but not kernel monitoring. Requires System Service Dispatch Table (SSDT) index:557558- [FreshyCalls](https://github.com/crummie5/FreshyCalls) - sorting system call addresses559- [SysWhispers2](https://github.com/jthuraisamy/SysWhispers2) - modernized syscall resolution560- [SysWhispers3](https://github.com/klezVirus/SysWhispers3) - adds x86/Wow64 support561- [Runtime Function Table](https://www.mdsec.co.uk/2022/04/resolving-system-service-numbers-using-the-exception-directory/) - reliable SSN computation562563#### Indirect System Calls564565- malware uses code fragments in kernel DLL without calling the hooked functions in those DLL566- prepare the system call in assembly then find a syscall instruction in `ntdll.dll` and jump to that location567 - **Modern Context:** Similar to direct syscalls, this bypasses user-mode hooks but not necessarily kernel-level monitoring. Finding and jumping to existing `syscall` instructions can be less suspicious than embedding raw syscall stubs, but the subsequent kernel activity is still visible.568 > [!TIP]569 > this is preferred,you can also boost evasion techniques by hiding inside a `.dll`570571#### Kernel‑Mode EDR Killers (BYOVD)572573- **Bring‑Your‑Own‑Vulnerable‑Driver (BYOVD)** attacks load legitimately signed but exploitable drivers—examples include **rtcore64.sys**, **iqvw64e.sys**, and **terminator.sys**—to execute privileged code inside the kernel.574- Typical payload actions575 - Patch or unregister kernel‑mode notify callbacks (`PsSetCreateProcessNotifyRoutine`, `ObRegisterCallbacks`) to blind user‑mode EDR components.576 - Overwrite or unload _WdFilter.sys_ and other sensor drivers, fully disabling Defender or third‑party agents.577- Public toolchains such as **Terminator**, **kdmapper**, and **EDRSensorDisabler** automate these steps.578- Case study: Lenovo `LnvMSRIO.sys` (CVE‑2025‑8061). Exposes physical memory/MSR read‑write primitives to low‑privileged users; can overwrite MSR_LSTAR and pivot to Ring‑0 payload, then patch/unregister callbacks to blind EDR.579580> [!TIP]581> The vulnerable‑driver blocklist (`DriverSiPolicy.p7b`) is **enabled by default** on Windows 11 22H2+ and refreshed every Patch Tuesday. Keep HVCI/KDP enabled so attacker drivers cannot patch protected code pages, and enable Hardware‑Enforced Stack Protection (CET/Shadow Stack) on Windows 11 24H2 to break call‑stack spoofing.582583> [!NOTE]584> Because the blocklist is on by default and updated frequently, a BYOVD chain now often needs **two** vulnerable drivers: one to disable Secure Boot or flip `CiOptions`, and a second to perform the EDR‑killer actions before the next blocklist refresh.585586### User-Mode Application Whitelisting Bypass587588#### Exploiting Vulnerable Trusted Applications589590Windows Defender Application Control (WDAC) and similar application whitelisting solutions can be bypassed by leveraging vulnerabilities in trusted, signed applications. A notable technique involves exploiting N-day vulnerabilities in the V8 JavaScript engine within Electron-based applications.591592- **Concept (Bring Your Own Vulnerable Application - BYOVA)**:593 - A trusted, signed Electron application (e.g., an older version of VSCode) with a known V8 vulnerability is used as a carrier.594 - The application's `main.js` (or equivalent) is replaced with a V8 exploit that executes a native shellcode payload.595 - If the application is whitelisted, WDAC allows it to run, inadvertently executing the malicious shellcode.596- **Advantages**:597 - Achieves native shellcode execution, overcoming limitations of pure JavaScript execution in some backdoored Electron app scenarios.598 - Shellcode runs in a browser-like process context, where behaviors like Read-Write-Execute (RWX) memory regions (due to JIT compilers) are common and may appear less suspicious to EDRs.599- **Exploit Development & Operationalization Challenges**:600 - **V8 Version Targeting**: Electron's V8 often lags behind Chrome's and includes backported security patches. Vulnerabilities must be chosen that were patched _after_ the target application's Electron version was frozen. Electron's cherry-picked patches should be reviewed.601 - **Debugging**: Building the specific V8 version (e.g., using `d8` debug shell with `--allow-natives-syntax` for `%DebugPrint()`) is crucial for understanding memory layouts and adapting exploits.602 - **Offset Inconsistencies**: Hardcoded offsets in public exploits (often Linux-based) need adjustment for the target V8 version and OS (Windows). Function pointer offsets for overwriting can even vary between Windows versions.603 - _Solution for offset variation_: Launch the exploit multiple times in child processes, each trying a different potential offset. The parent process monitors for success (e.g., mutex creation by payload).604 - **Sandbox Escape**: Public V8 exploits might use sandbox escape techniques already patched (cherry-picked) in the target Electron V8 version, requiring new or modified escapes.605 - **JIT Compiler Interference (e.g., V8 TurboFan)**:606 - Optimizations can consolidate repeated instruction sequences (e.g., multiple floating-point values), affecting shellcode smuggling. Workarounds include compact shellcode or varying instruction positions.607 - Copying large shellcode payloads can be problematic. Workaround: multiple smaller copy loops or using a stager payload that fetches the main payload.608 - **Payload Obfuscation**: Obfuscate the JavaScript exploit (e.g., in `main.js`) to hinder analysis. Re-obfuscating per deployment can help avoid signature-based detection.609- **Defense & Future Considerations**:610 - Electron's experimental integrity fuse feature, if enabled by developers, can verify the integrity of application files (including `main.js`) at runtime, potentially thwarting this technique by exiting if tampering is detected.611 - Older application versions without this fuse remain vulnerable.612613### Process Manipulation614615#### Early Cascade Injection616617- Novel process injection technique targeting user-mode process creation618- Combines elements of Early Bird APC with EDR-Preloading619- Avoids queuing cross-process APCs while maintaining minimal remote process interaction620- Works by:621 - Targeting processes during the transition from kernel-mode to user-mode (`LdrInitializeThunk`)622 - Leveraging callback pointers (like `g_pfnSE_DllLoaded`) during Windows process creation623 - Executing malicious code before EDR detection measures can initialize624- Advantages:625 - Operates before EDRs can initialize their hooks and detection measures626 - Particularly effective against EDRs that hook `NtContinue` or use delayed initialization627 - Avoids ETW telemetry that traditional injection techniques trigger628 - Minimal remote process interaction reduces detection footprint629 - More stealthy than traditional techniques like DLL hijacking or direct syscalls630- Key insight: EDRs typically load their detection measures after the `LdrInitializeThunk` function executes, providing a window of opportunity for code execution before security measures initialize631- watch for early `NtCreateThreadEx` inside `LdrInitializeThunk`632633#### Early Startup Bypass634635**Concept**: Execute malware before the EDR's user-mode component fully initializes, creating a window of opportunity for undetected execution.636637**Implementation**:638639- Target the gap between kernel driver loading and user-mode agent initialization640- Execute payload during system startup before EDR hooks are established641- Leverage services that start before EDR components642643**Research Findings (Cortex XDR)**:644645- Successfully executed Mimikatz with `lsadump::sam` without detection during early startup646- EDR kernel drivers may be loaded but user-mode hooks not yet established647- Timing window varies depending on system performance and EDR implementation648649**Detection Evasion**:650651- Creates process activity before EDR monitoring is fully operational652- Avoids user-mode hooks that haven't been established yet653- Kernel-level monitoring may still detect activity depending on driver initialization order654655**Limitations**:656657- Requires precise timing and understanding of EDR startup sequence658- May not work against EDRs with early kernel-level monitoring659- Window of opportunity may be brief on fast systems660661#### Waiting Thread Hijacking (WTH)662663- A stealthier version of classic Thread Execution Hijacking664- Intercepts the flow of a waiting thread and misuses it for executing malicious code665- Avoids suspicious APIs like `SuspendThread`/`ResumeThread` and `SetThreadContext` that trigger most alerts666- Required handle access:667 - For target process: `PROCESS_VM_OPERATION`, `PROCESS_VM_READ`, `PROCESS_VM_WRITE`668 - For target thread: `THREAD_GET_CONTEXT`669- Uses less monitored APIs:670 - `NtQuerySystemInformation` (with `SystemProcessInformation`)671 - `GetThreadContext`672 - `ReadProcessMemory`673 - `VirtualAllocEx`674 - `WriteProcessMemory`675 - `VirtualProtectEx`676- Implementation can be further obfuscated by splitting steps across multiple functions to evade behavioral signatures677- Primarily bypasses EDRs that focus on detecting specific API calls rather than behavioral patterns678- Effective against EDRs that are restrictive about remote execution methods but more lenient with allocations and writes679- Suitable for hiding the point at which implanted code was executed680681#### PPID Spoofing682683- Creates process with fake parent process ID684- Hides true process creation chain685- Makes process tree analysis misleading686687#### Process Hiding688689A technique to hide processes from EDR monitoring by manipulating the Interrupt Request Level (IRQL):690691- Raise the IRQL of current CPU core692- Create and queue Deferred Procedure Calls (DPCs) to raise the IRQL of other cores693- Perform sensitive task (for example, hiding process)694- Signal DPCs in other cores to stop spinning and exit695- Lower IRQL of current core back to original696697```c698irql = RaiseIRQL();699dpcPtr = AcquireLock();700do_stuff();701ReleaseLock(dpcPtr);702LowerIRQL(irql);703```704705This approach temporarily prevents EDR from monitoring the process during the critical operations by operating at an elevated privilege level.706707> [!NOTE]708> HVCI-enabled 23H2 kernels may crash when raising IRQL this way. Safer alternative: kernel-driver patching of `PsLookupProcessByProcessId`.709710#### UAC Bypass via Intel ShaderCache Directory711712- Concept: Exploits weak permissions (`Authenticated Users: Full Control`) on the `Intel\ShaderCache` directory (`%LOCALAPPDATA%\LocalLow\Intel\ShaderCache`) combined with the behavior of auto-elevated processes (like `taskmgr.exe`) writing to this location.713- Mechanism:714 1. Clear Directory: Requires aggressively terminating processes holding handles (`explorer.exe`, `sihost.exe`, etc.) and deleting files within the `ShaderCache` directory. Permissions might need adjustment (`icacls`) to allow deletion. Launching `taskmgr.exe` briefly (with a timeout) helps identify recently written filenames and can trigger writes needed for the exploit.715 2. Junction Creation: Create a directory junction from `ShaderCache` to `\??\GLOBALROOT\RPC CONTROL`.716 3. Symbolic Link: Determine a recently used filename within `ShaderCache` (before clearing). Create an object directory symbolic link (`CreateDosDevice`) from `Global\GLOBALROOT\RPC CONTROL\<recent_filename>` to a target DLL path (e.g., `\??\C:\Windows\System32\oci.dll`).717 4. Trigger Write: Launch an auto-elevated process (e.g., `taskmgr.exe`) that writes to `ShaderCache`. The write operation follows the junction and then the symbolic link, resulting in the creation of a (dummy) target file (e.g., `oci.dll`) in a privileged location (`System32`).718 5. Overwrite & Execute: Overwrite the created dummy file with the actual malicious DLL. Launch a process (like `comexp.msc`) that attempts to load the target DLL, thereby executing the malicious code with elevated privileges.719- EDR Relevance:720 - Bypasses User Account Control (UAC), a primary defense layer.721 - Relies on manipulating file system objects (junctions, symlinks) and process interactions that EDRs monitor.722 - Involves potentially noisy actions like mass process termination and permission changes.723 - The final payload execution often relies on DLL hijacking techniques.724725> [!TIP]726> Symlink/junction UAC races are build‑dependent and brittle. Validate on the specific target build; many have partial or complete mitigations.727728#### PPL (Protected Process Light) Bypass729730**Concept**: Bypass Protected Process Light security by creating alternative service configurations that avoid PPL protections.731732**Palo Alto Cortex XDR PPL Bypass Technique**:733734```powershell735# Create alternative service that launches cyserver.exe without PPL protection736sc create "fake_cyserver" binPath="C:\Program Files\Palo Alto Networks\Traps\cyserver.exe" start=auto737```738739**How it works**:740741- Creates a second service that launches the EDR's main process (cyserver.exe)742- Original PPL-protected service fails to start due to startup dependencies743- New service configuration is not protected by EDR drivers744- EDR process runs without PPL protection, expanding attack surface745746**Limitations**:747748- Service names beginning with "cyserver\*" are blocked by some EDR implementations749- EDR functionality may remain intact despite PPL bypass750- Self-protection mechanisms may still be active at process level751- Vendor response varies - may not be considered a security vulnerability752753**Detection & Response**:754755- EDR thinks original service is stopped but agent continues running756- Attack surface increases as process no longer has PPL protections757- Reported to Palo Alto on 12.09.2023 with limited vendor response758759**Broader Implications**:760761- Demonstrates service configuration vulnerabilities in EDR implementations762- Shows potential for bypassing Windows security features through alternative execution paths763- Relevant for other EDRs that rely on PPL for self-protection764765#### Using `NtCreateUserProcess` for Stealthy Process Creation766767The native API `NtCreateUserProcess()`, located in `ntdll.dll`, is the lowest-level user-mode function for creating processes. Calling it directly can bypass EDR hooks placed on higher-level functions like `CreateProcessW` in `kernel32.dll`. This makes it a valuable technique for stealthier process creation.768769**Key Concepts:**770771- **Bypass Mechanism**: Avoids user-land hooks on more commonly monitored APIs like `CreateProcessW`.772- **Process Parameters**: Requires careful setup of structures like `RTL_USER_PROCESS_PARAMETERS` (often via `RtlCreateProcessParametersEx`), `PS_CREATE_INFO`, and `PS_ATTRIBUTE_LIST`.773 - `RTL_USER_PROCESS_PARAMETERS`: Defines process startup information, including image path, command line, environment variables, etc. The `ImagePathName` must be in NT path format (e.g., `\??\C:\Windows\System32\executable.exe`).774 - `PS_ATTRIBUTE_LIST`: Can specify attributes like the image name.775- **Flags**: `ProcessFlags` and `ThreadFlags` allow fine-grained control over process and thread creation (e.g., creating suspended). Sources like Process Hacker's headers (`ntpsapi.h`) can provide valid flag definitions. For minimal use, these can sometimes be `NULL`.776- **Implementation Details**: Involves initializing several structures and using functions from `ntdll.dll` such as `RtlInitUnicodeString`, `RtlCreateProcessParametersEx`, and `RtlAllocateHeap`. The article also mentions that the `ProcessParameters` argument for `NtCreateUserProcess` was found to be mandatory, and `RtlCreateProcessParametersEx` is used with the `RTL_USER_PROCESS_PARAMETERS_NORMALIZED` flag. The `PS_CREATE_INFO` structure needs its `Size` and `State` (e.g., `PsCreateInitialState`) members initialized. The `PS_ATTRIBUTE_LIST` is populated to include the image name.777778**Example High-Level Steps:**7797801. Define the path to the executable using `UNICODE_STRING` and initialize it with `RtlInitUnicodeString` (e.g., `L"\??\C:\Windows\System32\calc.exe"`).7812. Create and populate `RTL_USER_PROCESS_PARAMETERS` using `RtlCreateProcessParametersEx`, providing the image path and normalizing parameters.7823. Initialize a `PS_CREATE_INFO` structure.7834. Allocate and initialize a `PS_ATTRIBUTE_LIST`, setting the `PS_ATTRIBUTE_IMAGE_NAME` attribute with the image path.7845. Call `NtCreateUserProcess` with the prepared handles, access masks, and structures.7856. Perform cleanup, for instance, by calling `RtlFreeHeap` and `RtlDestroyProcessParameters`.786787This technique allows for creating a new process with more direct control, potentially evading EDRs that primarily hook `kernel32.dll` API calls. However, EDRs with kernel telemetry or hooks deeper within `ntdll.dll` (or monitoring syscalls directly) might still detect the `NtCreateUserProcess` call or the subsequent behavior of the spawned process.788789#### Advanced Process Execution Alternatives790791- [TangledWinExec](https://github.com/daem0nc0re/TangledWinExec) - alternative process execution techniques792- [rad9800](https://github.com/rad9800/misc/blob/main/bypasses/WorkItemLoadLibrary.c) - indirectly loading DLL through a work item793794#### Acquiring Process Handles795796- Without using suspicious `OpenProcess`:797 - Find `explorer.exe` window handle using `EnumWindows`798 - Convert to process handle with `GetProcessHandleFromHwnd`799 - Leverage `PROCESS_DUP_HANDLE` to duplicate into a pseudo handle for [Full Access](https://jsecurity101.medium.com/bypassing-access-mask-auditing-strategies-480fb641c158)800801### Callstack Manipulation802803#### Return Address Overwrite804805- overwrite function's return address with 0806 - that terminates call stack's unwinding algorithm807 - examination based on `DbgHelp!StackWalk64` fails808- implement custom API resolver similar to `GetProcAddress`809 - before calling out to suspicious functions, overwrite `RetAddr :=0`810 - when system API returns, restore own `RetAddr`811812#### Callstack Spoofing813814- Manipulates the call stack to appear legitimate815- Makes it harder to detect malicious code execution816- Tools and techniques:817 - ThreadStackSpoofer818 - CallStackSpoofer819 - AceL820821…(truncated)