Reverse engineering shellcode
Skill meltedinhex/analyst-ai-pack/skills/reverse-engineering-shellcode
Analyzes position-independent shellcode: disassembling raw bytes at the right architecture, recognizing PEB-walk API resolution and egg hunters, and emulating execution to recover behavior and payloads. Activates for requests to analyze shellcode, disassemble raw position-independent code, or emulate a shellcode blob.From its SKILL.md
npx -y skills add meltedinhex/analyst-ai-pack --skill reverse-engineering-shellcodeAssembled 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.4 KB, 639 tokens by cl100k_base, as published. Nobody here has run it
Reverse Engineering Shellcode
When to Use
- You extracted a raw code blob (from a document, exploit, injected memory region, or beacon) with no PE/ELF headers.
- You need to determine the architecture, recover the API-resolution method, and understand what the shellcode does.
- You want to emulate the shellcode safely to recover staged payloads or C2.
Do not use a file-format parser on shellcode — there is no header. Treat it as a flat byte stream at a known base and disassemble/emulate.
Prerequisites
- Capstone (
pip install capstone) for disassembly; Unicorn (pip install unicorn) for emulation. - Knowledge of the likely architecture/bitness (x86 vs x64) and calling context.
Workflow
Step 1: Determine architecture and entry
Try disassembling as x86 and x64; the one that yields coherent instructions (and a sane prologue) is correct. Shellcode usually starts executing at offset 0.
python scripts/analyst.py disasm shellcode.bin --arch x64
Step 2: Recognize API resolution
Windows shellcode typically walks the PEB to find kernel32, then resolves exports by hash:
mov rax, gs:[60h] ; PEB (x64) / mov eax, fs:[30h] (x86)
... traverse Ldr -> InMemoryOrderModuleList
... hash export names, compare to embedded constants
Recovered hash constants feed the API-hash resolver (see the obfuscation skill).
Step 3: Identify the technique
Look for egg hunters (searching memory for a tag), socket setup (reverse/bind shell), or a
download-and-exec stager (WinINet/WinHTTP resolution then a URL).
Step 4: Emulate to recover behavior
Emulate with Unicorn, hooking memory and (optionally) faking API calls, to observe the control flow and extract strings/URLs the static view hides:
python scripts/analyst.py emulate shellcode.bin --arch x64 --base 0x140000000
Step 5: Extract IOCs and payload
Recover C2 URLs/hosts, embedded second stages, and the resolved API set for the report.
Validation
- The chosen architecture yields a coherent prologue and no garbage instruction stream.
- Recovered API hashes resolve to a sensible function set (LoadLibrary/GetProcAddress, network APIs).
- Emulation reaches the network/exec stage consistent with the static read.
Pitfalls
- Disassembling at the wrong bitness and chasing nonsense.
- Emulating without bounding execution, looping forever on unresolved calls.
- Ignoring self-modifying decoders — emulate through the decode stub to reach real code.
References
- See
references/api-reference.mdfor the disassembler and emulator wrapper. - Capstone and Unicorn (linked in frontmatter).
What ships with it: 3 files
4.8 KB alongside SKILL.md, 1 of them executable
references/
- api-reference.md1.2 KB
scripts/
- analyst.pyruns3.2 KB
- LICENSE340 B