3.6 KiB
name, description, domain, subdomain, tags, version, author, license, mitre_attack, d3fend, references
| name | description | domain | subdomain | tags | version | author | license | mitre_attack | d3fend | references | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| performing-static-pe-analysis | Extracts structure and indicators from a Windows PE file without executing it: headers, sections, imports/exports, resources, entropy, and embedded strings to infer capability and packing. Activates for requests to statically analyze a PE, EXE, or DLL, or inspect imports and headers. | cybersecurity | malware-analysis |
|
1.0.0 | analyst-ai-pack | Apache-2.0 |
|
|
|
Performing Static PE Analysis
When to Use
- You have a Windows executable or DLL and need to infer its capabilities before (or instead of) detonation.
- You want to assess packing, suspicious imports, timestamps, and embedded resources.
- You are gathering features for YARA authoring or detection.
Do not use import tables alone to conclude behavior — packed samples hide imports until runtime. If imports are sparse and entropy is high, move to unpacking.
Prerequisites
pefile(pip install pefile) and optionallycapa/PEStudio for deeper capability ID.- The sample in neutralized form inside the lab.
Safety & Handling
- Static only: parse the file, never run it. Keep the neutralized extension.
Workflow
Step 1: Parse headers and metadata
python scripts/analyst.py analyze sample.bin
Note the compile timestamp (often forged), subsystem (GUI/console), machine type (x86/x64), and whether it is a DLL.
Step 2: Review sections and entropy
Per-section entropy reveals packing. A tiny .text plus a huge high-entropy section, or
non-standard section names (UPX0, .themida), indicate a packer:
.text entropy 6.4 (normal code)
UPX1 entropy 7.95 (packed)
Step 3: Classify imports
Group imported APIs into behavioral buckets:
Injection : VirtualAllocEx, WriteProcessMemory, CreateRemoteThread [T1055]
Network : InternetOpen, HttpSendRequest, WinHttpConnect [T1071]
Crypto : CryptEncrypt, CryptAcquireContext [T1486]
Persistence: RegSetValueEx, CreateService [T1547/T1543]
A sample importing only LoadLibrary/GetProcAddress is resolving APIs dynamically — a
packing/evasion tell.
Step 4: Inspect resources and strings
Look for embedded PEs in resources (droppers), config blobs, and notable strings (URLs, mutex names, paths).
Step 5: Check signing
Verify the Authenticode signature: unsigned, self-signed, or revoked certificates are suspicious for software claiming to be legitimate.
Validation
- Section entropy and import counts agree (packed → few imports + high entropy).
- Suspicious import buckets correspond to plausible behavior.
- Embedded PE detection is confirmed by an
MZ/PEheader inside a resource.
Pitfalls
- Trusting the compile timestamp as a real build date — it is trivially forged.
- Concluding "benign" because imports look ordinary; the import table may be a stub for a packed payload.
- Ignoring TLS callbacks, which can run code before the entry point.
References
- See
references/api-reference.mdfor the analyzer and import classification map. - Microsoft PE Format spec and pefile (linked in frontmatter).