Convenience helpers for working with the Unicorn emulator
Project description
ucutils - Unicorn Emulator Utilities
ucutils provides helper utilities and abstractions for working with the Unicorn CPU emulator. It simplifies memory management, register access, and architecture-specific operations while supporting both x86 and x64 architectures. The library also includes Windows-specific utilities for emulating Windows structures and behaviors.
For more comprehensive Windows emulation including API hooking and system call emulation, consider using the Speakeasy project. ucutils focuses on providing low-level CPU emulation utilities rather than full system emulation.
Create the extended emulator instance:
emu = ucutils.emu.Emulator(unicorn.UC_ARCH_X86, unicorn.UC_MODE_64)
Map and access memory (typical Unicorn API):
emu.mem_map(0x0, 0x1000)
code = b"\x48\xC7\xC0\x01\x00\x00\x00" # mov rax, 0x1
emu.mem_write(0x0, code)
emu.emu_start(0x0, len(code))
Easily access registers:
assert emu.rax == 0x1
And, easily allocate and access memory:
addr = emu.mem.alloc(0x1000)
emu.mem_write(addr, b"AAAA")
assert emu.mem[addr:addr+4] == b"AAAA"
Stack operations:
emu.push(0xAA)
assert emu.pop() == 0xAA
Emulation stepping:
emu.mem_map(0x0, 0x1000)
code = b"\x48\xC7\xC0\x01\x00\x00\x00\x48\xC7\xC3\x02\x00\x00\x00" # mov rax,0x1; mov rbx,0x2
emu.mem_write(0x0, code)
emu.stepi() # Execute first instruction
assert emu.pc == 0x7
assert emu.rax == 0x1
Checkpointing:
assert emu.rax == 0x0
assert emu.rbx == 0x0
with ucutils.checkpoint.checkpoint(emu):
emu.rax = 0x1
emu.rbx = 0x2
emu.stepi()
# changes will be reverted after the block,
# including memory contents and registry context.
assert emu.rax == 0x0
assert emu.rbx == 0x0
Install TEB and PEB for Windows process emulation (useful for tracing shellcode), and then load a PE file:
ucutils.plat.win64.map_teb(emu)
pe = pefile.PE(data=b"MZ...")
ucutils.plat.win.load_dll(emu, {"filename": "payload.dll", "pe": pe})
# exports are added to emu.symbols
assert "payload.dll!ServiceMain" in emu.symbols
# LDR_ENTRY is registered in emulated memory,
# which is useful for (shellcode) payloads that manually resolve imports.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ucutils-0.3.2.tar.gz.
File metadata
- Download URL: ucutils-0.3.2.tar.gz
- Upload date:
- Size: 31.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ef4a8bb75b730ffb32060d4f7ef2be55dfa1b8123bf81e6126f0d643f823728
|
|
| MD5 |
6c7670ec3aef30fa14ac9db0b3abcf7c
|
|
| BLAKE2b-256 |
3243ea665e27515bd18ce2aab230823baa2e6dfbb2a19bbd60fa146f58963c57
|
File details
Details for the file ucutils-0.3.2-py3-none-any.whl.
File metadata
- Download URL: ucutils-0.3.2-py3-none-any.whl
- Upload date:
- Size: 27.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.1 CPython/3.11.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d77b765d77f262da49eb176b538629d1fdfd351cac5fd75e6652a8a33d8b6c9
|
|
| MD5 |
e16e25df68644d428cecf459995f8519
|
|
| BLAKE2b-256 |
45a2f515a3c2e281a6058bb3583131422eff32cb7d3db3b71e65577271898703
|