rev-unicorn-debug
p4nda0s/reverse-skills
Debug and emulate code fragments using the Unicorn engine with environment simulation.
What is rev-unicorn-debug?
A reverse-engineering skill for emulating specific functions or code fragments in isolation using the Unicorn CPU emulator. Use it to trace binary execution, decrypt algorithms, or bypass environment dependencies (JNI, syscalls, libc) without running the full program.
- Emulate isolated code fragments and functions using Unicorn's CPU emulation engine
- Hook and simulate external dependencies (libc, JNI, syscalls, C++ runtime) through callback mechanisms
- Trace binary execution at block or instruction level with minimal overhead
- Auto-map missing memory pages and recover from unmapped access errors
- Support multiple architectures (ARM64, ARM32, x86-64, x86-32, MIPS32) with architecture-specific register and calling-convention handling
How to install rev-unicorn-debug
npx skills add https://github.com/p4nda0s/reverse-skills --skill rev-unicorn-debug- Unicorn emulation engine (unicorn Python bindings)
- Python 3.6+
- Binary file or raw code bytes to emulate
- Understanding of target architecture (ARM, x86, MIPS) and calling conventions
How to use rev-unicorn-debug
- 1.Load the target binary or code fragment as raw bytes into Unicorn memory
- 2.Identify external dependencies (libc calls, JNI, syscalls) in the target function
- 3.Register hook callbacks for each dependency using UC_HOOK_CODE or UC_HOOK_INTR
- 4.Set up initial register state (SP, arguments, return address) according to the target architecture
- 5.Run emulation and use callback output to diagnose crashes or missing mappings
- 6.Iteratively add memory mappings or fix hooks until the target function completes successfully
Use cases
- Decrypt or decode data by emulating the algorithm in isolation without full binary execution
- Analyze and debug a specific function's behavior by tracing its register and memory state
- Reverse-engineer obfuscated code by stepping through execution with hooks on key operations
- Test binary code fragments across different architectures without setting up full runtime environments
- Bypass environment constraints (missing JNI implementations, unavailable syscalls) during analysis
- Reverse engineers and malware analysts
- Security researchers performing binary analysis
- Developers debugging architecture-specific code in isolation
- CTF competitors analyzing compiled binaries
rev-unicorn-debug FAQ
Load as raw bytes first and map directly into Unicorn memory. Only parse headers minimally if raw loading fails due to code referencing specific segment addresses.
Hook the function's address using UC_HOOK_CODE callbacks and implement the simulation logic in Python (e.g., a bump allocator for malloc, or a fake JNIEnv function table in memory).
Use the callback output to identify the faulting address and type (fetch/read/write), then map the missing page or add a hook for the unhandled function call.
Prefer UC_HOOK_BLOCK for block-level tracing over UC_HOOK_CODE for instruction-level tracing. Only enable instruction tracing on small targeted ranges to minimize overhead.
Refer to the architecture quick reference in the skill documentation: ARM64 uses X0-X7 for arguments and X0 for return; x86-64 uses RDI, RSI, RDX, RCX, R8, R9; ARM32 uses R0-R3; x86-32 and MIPS32 pass arguments on the stack or via registers as per their ABI.
Full instructions (SKILL.md)
Source of truth, from p4nda0s/reverse-skills.
name: rev-unicorn-debug description: Debug and emulate specific code fragments or functions using the Unicorn engine. Activate when the user wants to emulate a function with Unicorn, trace binary execution without running the full program, decrypt or decode data by emulating the algorithm, or bypass environment dependencies (JNI, syscalls, libc) during emulation.
rev-unicorn-debug - Unicorn Emulation Debugger
Debug and emulate specific code fragments or functions using the Unicorn engine. Analyze context dependencies (JNI, syscalls, library functions) and simulate them through hook mechanisms to complete the user's debugging goal.
Core Principles
- Load file raw first — do NOT parse ELF/PE/Mach-O headers. Read the file as raw bytes and map directly into Unicorn memory. We only need to emulate specific functions, not the entire binary. If raw loading fails (code references segments at specific addresses), then parse minimally — only map the segments needed.
- Identify context dependencies — analyze the target code for external calls (JNI, syscalls, libc, imports) and hook them to provide simulated responses.
- Use callbacks extensively — leverage Unicorn's hook system for debugging, tracing, error recovery, and environment simulation.
- Iterative fix — when emulation crashes, use the callback info to diagnose and fix (map missing memory, hook unhandled calls, fix register state).
- Minimal trace output — prefer block-level tracing over instruction-level. Only enable instruction trace on small targeted ranges. Use counters and summaries instead of per-step logging.
Environment Simulation Strategy
Before emulating, read the target function and identify what it calls. Hook external dependencies by address and simulate in Python:
| Category | Examples | Simulation Strategy |
|---|---|---|
| libc | malloc, free, memcpy, strlen, printf | Hook address, implement logic in Python (bump allocator for malloc) |
| JNI | GetStringUTFChars, FindClass, GetMethodID | Build fake JNIEnv function table in UC memory, write RET stubs at each entry, hook stub addresses |
| Syscalls | read, write, mmap, ioctl | Hook UC_HOOK_INTR, dispatch by syscall number |
| C++ runtime | operator new, __cxa_throw | Hook and simulate |
| Library calls | pthread_mutex_lock, dlopen | Hook and return success/stub |
Hook pattern: Register a UC_HOOK_CODE callback. When PC hits a known import address, execute the Python simulation, then set PC = LR to skip the original function.
Callback Types to Use
| Callback | Purpose |
|---|---|
UC_HOOK_CODE | Intercept import calls by address; instruction-level trace (use sparingly, narrow range only) |
UC_HOOK_BLOCK | Block-level trace (preferred over instruction trace) |
UC_HOOK_MEM_UNMAPPED | Auto-map missing pages to recover from unmapped access errors |
UC_HOOK_MEM_READ | UC_HOOK_MEM_WRITE | Trace memory access on targeted data ranges only |
UC_HOOK_INTR | Intercept SVC/INT for syscall simulation |
Iterative Debugging Workflow
When emulation fails, follow this loop:
- Run — start emulation, let it crash
- Read callback output — which address faulted? What type (read/write/fetch)?
- Diagnose:
- Unmapped memory fetch → missing code page, map it
- Unmapped memory read/write → missing data section or uninitialized pointer, map or hook
- Hitting an import stub → identify the function, add a simulation hook
- Infinite loop → add a code hook with execution counter, stop after threshold
- Fix — add the hook / map the memory / adjust registers
- Re-run — repeat until the target function completes
Architecture Quick Reference
| Arch | Uc Const | Mode | SP | LR | Args | Return | Syscall |
|---|---|---|---|---|---|---|---|
| ARM64 | UC_ARCH_ARM64 | UC_MODE_LITTLE_ENDIAN | SP | X30 | X0-X7 | X0 | X8 + SVC #0 |
| ARM32 | UC_ARCH_ARM | UC_MODE_THUMB / UC_MODE_ARM | SP | LR | R0-R3 | R0 | R7 + SVC #0 |
| x86-64 | UC_ARCH_X86 | UC_MODE_64 | RSP | (stack) | RDI,RSI,RDX,RCX,R8,R9 | RAX | RAX + syscall |
| x86-32 | UC_ARCH_X86 | UC_MODE_32 | ESP | (stack) | (stack) | EAX | EAX + int 0x80 |
| MIPS32 | UC_ARCH_MIPS | UC_MODE_MIPS32 + UC_MODE_BIG_ENDIAN | $sp | $ra | $a0-$a3 | $v0 | $v0 + syscall |
Related skills
More from p4nda0s/reverse-skills and the wider catalog.

rev-dex-dumper
Dump DEX files from running Android apps for reverse engineering and deobfuscation.

rev-frida
Generate Frida hook scripts for dynamic analysis, runtime tracing, and method interception on Android and native targets.

rev-idapython
IDAPython and IDALib script reference for reverse engineering and binary analysis.

rev-struct
Reconstruct data structures by analyzing memory access patterns across functions

prd-creator
Transform software ideas into comprehensive PRDs and actionable implementation task lists.

documenting-decisions
Mark critical decisions in agent-generated code to focus human review on what matters.