Unpacking upx and common packers
Skill meltedinhex/analyst-ai-pack/skills/unpacking-upx-and-common-packers
Identifies and unpacks packed binaries: detecting packers from section names and entropy, automatically unpacking UPX, and manually unpacking custom packers by finding the OEP and dumping. Activates for requests to unpack a packed sample, detect a packer, or recover the original binary from UPX or a custom packer.From its SKILL.md
npx -y skills add meltedinhex/analyst-ai-pack --skill unpacking-upx-and-common-packersAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 21 stars21 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
3.1 KB, 615 tokens by cl100k_base, as published. Nobody here has run it
Unpacking UPX and Common Packers
When to Use
- A sample shows high entropy, few imports, or packer section names, and you need the original code for static analysis or RE.
- You want to unpack UPX automatically or manually unpack a custom/modified packer.
- You are preparing a sample for Ghidra/IDA (decompiling packed code is pointless).
Do not use generic unpackers as a guarantee — modified UPX and custom packers defeat
upx -d. Fall back to debugger-based manual unpacking.
Prerequisites
- Packer detection (Detect It Easy, or the bundled section/entropy heuristics).
upxfor standard UPX; x64dbg + Scylla for manual unpacking (see the x64dbg skill).- Isolated lab.
Workflow
Step 1: Detect the packer
python scripts/analyst.py detect sample.bin
Signals: section names (UPX0/UPX1, .aspack, .themida), high section entropy, a tiny
import table, and a small .text with a large high-entropy section.
Step 2: Try automated UPX unpacking
If standard UPX:
upx -d -o sample_unpacked.bin sample.bin
If upx -d fails on a UPX-like sample, the header was likely tampered (e.g. UPX! magic or
version bytes altered) — repair the marker or unpack manually.
Step 3: Manual unpacking for custom packers
In x64dbg: break on VirtualAlloc/VirtualProtect, run until the unpacked region is written
and made executable, find the tail jump to the original entry point (OEP), and dump there.
Step 4: Dump and rebuild imports
Use Scylla to dump the process and reconstruct the Import Address Table (IAT) so the dumped PE loads in a disassembler.
Step 5: Verify the unpacked result
Confirm the dump is a clean PE with a populated import table and readable strings/code.
Validation
- The unpacked file has restored imports and meaningful strings absent from the packed sample.
- Entropy of the unpacked
.textdrops to normal code levels. - The disassembler resolves API calls (IAT rebuilt correctly).
Pitfalls
- Running
upx -don tampered UPX and concluding it is not UPX; check for renamed/edited markers. - Dumping before reaching the OEP, capturing still-encrypted code.
- Forgetting IAT reconstruction, leaving the dump unusable in Ghidra/IDA.
References
- See
references/api-reference.mdfor the packer detector. - UPX and Detect It Easy (linked in frontmatter).
What ships with it: 3 files
4.6 KB alongside SKILL.md, 1 of them executable
references/
- api-reference.md1.2 KB
scripts/
- analyst.pyruns3.0 KB
- LICENSE340 B