I started a threat hunting lab, and the first question stopped me cold.
The hypothesis sounded straightforward: confirm signed-binary proxy execution and extract durable pivots. The actual question asked me to identify which LOLBin and payload name confirmed the behavior.
I stared at the screen and realized I had no idea what I was looking for. None. I could have run a few broad queries, scrolled through logs until something looked weird, and hoped I stumbled into the answer. Instead, I took a step back and dissected the question piece by piece.
This is how that approach turned a confusing lab into a lesson I will not forget.
01 / HYPOTHESIS
Dissect the question before touching the logs
At first, that felt like one complicated question. It was really three smaller questions:
- What makes a Windows binary signed?
- What does it mean for a process to load a DLL?
- Why does the DLL's location matter?
Once I separated those ideas, I could build a mental model of the behavior instead of guessing at filenames.
02 / TRUST CONTEXT
What “signed Windows binary” actually tells me
The first phrase that tripped me up was “signed Windows binary.” I had a hunch that it had something to do with trust, but hunches do not hold up in an investigation.
A digital signature helps establish who published a file and whether it has changed since it was signed. Native utilities such as rundll32.exe and regsvr32.exe are normally Microsoft-signed and located in protected Windows directories.
That signature does not prove the process activity is benign. It tells me about the binary's provenance, not the intent behind the command. An attacker can abuse a legitimate utility to execute malicious content, allowing the activity to blend in with normal Windows operations or pass controls that trust signed binaries. MITRE ATT&CK tracks that behavior as System Binary Proxy Execution.
03 / MECHANISM
What it means to load a DLL
The next part of the question was “loading a DLL,” and this was new territory for me. I had to slow down and understand the mechanics.
When Windows loads a DLL, it maps the module into the loading process's virtual address space. The DLL does not become its own process. Its code runs inside the process that loaded it and under that process's existing security context.
A DLL can expose functions for other programs to call. These are export functions. I started thinking of the DLL as a toolbox, with each exported function representing a specific tool inside it.
With rundll32.exe, the command line commonly identifies both the DLL and the export to execute:
rundll32.exe evil.dll,DllRegisterServerThe comma separates the DLL path from the exported function name. In this example, DllRegisterServer is the function rundll32.exe attempts to call. The name alone does not make the function malicious, but an attacker-controlled DLL can place malicious behavior inside that export.
If you want a deeper explanation of the loading mechanics, I covered them in From Normal DLL Loading to DLL Hijacking.
04 / PATH CONTEXT
Why the user-writable path matters
A user-writable path is a location where the relevant user can create or modify files. Common examples include that user's %TEMP%, %APPDATA%, Downloads, and Desktop directories. Other locations may be writable depending on their access controls, so the directory name alone is not enough.
Signed utilities and legitimate applications can load DLLs from many locations. A user-writable path is therefore not automatic proof of compromise. It matters because an attacker operating as that user can place a payload there without already having administrative access.
The useful question is not simply, “Is this path weird?” It is, “Could this user write the DLL here, does this process normally load it, and what happened immediately before and after the load?”
Now I had the behavior I was hunting: a legitimate signed utility loading attacker-controlled code from a location the user could modify.
05 / EVIDENCE
The discovery in the logs
I went into the logs expecting to find rundll32.exe. It is the textbook example, and it was the first process my mental model reached for.
Except rundll32.exe was nowhere to be found.
I almost convinced myself I was looking at the wrong data. Then I saw this:
regsvr32.exe /s d8a0be66250ade6ed78497c75be6dba6.dllThere it was. Another signed utility. Another LOLBin.
regsvr32.exe is designed to register DLL components. Unlike the rundll32.exe example, the command line does not need to name DllRegisterServer. During normal registration, regsvr32.exe loads the DLL and calls that exported function internally. The /s option runs it without displaying messages.
The bare filename on the command line did not prove where the DLL lived. I needed the process context, module-load telemetry, and full payload path to connect it to the user-writable directory described by the lab.
The parent process was cmd.exe. That is not malicious by itself either, but the full chain mattered: a command shell launched regsvr32.exe in silent mode, the process loaded a hash-named DLL from a user-writable location, and the activity matched the hunt hypothesis.
06 / TAKEAWAY
Hunt behaviors, then pivot with artifacts
I almost focused on d8a0be66250ade6ed78497c75be6dba6.dll because the filename looked suspicious. That value is still useful as an investigation pivot, but it is not durable detection logic. An attacker can rename the payload tomorrow.
The behavior survives the rename: a signed utility executes a DLL from a location the user can modify, under an unusual parent and command-line context, followed by activity that does not fit the environment's baseline.
This is how I want to approach future hunts. Not by brute-forcing queries or pattern-matching filenames, but by understanding the hypothesis, breaking it into smaller questions, and researching what I do not know until I can explain the mechanism.
When I understand how the attack works, the logs stop looking like an endless wall of events. They become evidence.
07 / SOURCES