The LOLBAS project lists over 200 signed Microsoft binaries that can execute arbitrary code, download files, or bypass application whitelisting. Every AV vendor on the planet has signatures for them. If you run mshta.exe or regsvr32.exe in 2026, you are going to get caught. The interesting LOLBins are the ones you find yourself.
Why the Public List is Burned
The LOLBAS project is a public GitHub repo. Every entry gets added to detection rules within weeks. Defender, CrowdStrike, SentinelOne, and Carbon Black all monitor for known LOLBin usage patterns. The detection is not just on process name either. They flag the specific command-line arguments, parent-child process relationships, and file writes associated with each technique.
Notice the pattern. Everything on the public list is red. The only green line is the binary nobody has reported yet.
What Makes a Good LOLBin
Not every signed binary is useful. You need specific capabilities to turn a legitimate tool into an execution primitive. Here is what to look for.
How to Find Your Own
Stop relying on the public list. Here is how you discover new LOLBins that nobody has signatured yet.
| Method | What You Do | What You Find |
|---|---|---|
| DLL Import Scanning | Scan PE imports for LoadLibrary, CreateProcess, ShellExecute, WinExec | Binaries that load arbitrary DLLs or spawn processes |
| Config File Fuzzing | Find binaries that read XML, INI, or manifest files, then inject code into those configs | Execution through trusted config parsers |
| COM Object Abuse | Enumerate registered COM objects and test which ones instantiate with scriptable interfaces | Script execution through COM automation |
| Missing DLL Hunting | Use Process Monitor to find DLLs that fail to load from the binary's directory | DLL side-loading opportunities with zero detection |
The Missing DLL Technique in Practice
This is the most reliable method and the easiest to execute. Most signed binaries try to load optional DLLs at startup. When the DLL is not in the expected location, the load fails silently and the binary continues. But if you place a DLL with the right name in the right directory, the binary loads it without checking the signature.
The beauty of this approach is the process tree. Your code runs inside a signed, trusted process. The parent is explorer.exe or whatever launched the legitimate tool. There is no cmd.exe or powershell.exe in the chain. The EDR sees a trusted application loading what appears to be one of its own dependencies.
AppLocker vs WDAC: Know the Difference
Your LOLBin discovery matters most when application whitelisting is enforced. But the type of policy determines what works and what does not.
Against AppLocker, DLL side-loading almost always works because DLL rules are rarely enforced. Against WDAC, you need binaries that are already trusted by the policy or you need to find a way to load managed code through a trusted assembly.
The Lifecycle of a LOLBin
Every LOLBin follows the same lifecycle. Understanding this helps you think about where to focus your effort.
The window between discovery and detection is shrinking every year. In 2020 you could use a public LOLBin for months before it got flagged. In 2026, a tweet with a new technique gets signatured within days. If you want LOLBins that work, you have to find your own and keep them private. The moment you share it publicly, the clock starts.
The Takeaway
Stop using certutil to download files. Stop using mshta for execution. Every binary on the public LOLBAS list has a detection rule with your name on it. The operators who consistently get past modern defences are the ones who invest time into finding their own execution primitives.
Spin up Process Monitor. Filter for missing DLLs. Scan PE imports for dangerous functions. Test signed binaries from enterprise software installers. The next LOLBin that gets you past AppLocker on a hardened engagement is sitting in C:\Program Files right now, waiting to be found. You just have to be the one who looks.
Detection capabilities evolve constantly. Techniques described here reflect the state of public tooling at time of writing. Always validate against your target environment.