🛠️ A powerful tool for converting PE files (EXE/DLL) into position-independent shellcode.
- Support for converting PE files (EXE/DLL) to shellcode
- Compatible with both x86 and x64 architectures
- Command-line argument support
- Built-in LZNT1 compression algorithm for significant output file size reduction
- Optional obfuscation for enhanced stealth
pip install pefile lznt1
python clematis.py -f <PE_file> -o <output_file> [-g <true/false>] [-c <true/false>] [-p <parameters>]
desc | default | required | ||
---|---|---|---|---|
-f | --file | Path to the PE file to convert | true | |
-o | --output | Output filename | true | |
-g | --garble | Enable obfuscation | true | false |
-c | --compress | Enable compression | true | false |
-p | --parameter | Execution parameters to pass to the PE file | false |
# Show help information
python clematis.py -h
# Basic usage
python clematis.py -f target.exe -o output.bin
# Disable obfuscation and compression
python clematis.py -f target.exe -o output.bin -g false -c false
# Pass arguments to target program
python clematis.py -f target.exe -o output.bin -p arg1 arg2
python clematis.py -f target.exe -o output.bin -p "arg1 arg2"
- 🎯 Support for DOT NET
- 🗜️ Compression support
- 🎭 Obfuscation support
- 🔄 Parameter passing support
- 🚀 Full support for golang
- 💪 Generated shellcode is powerful and stable
- 🛡️ Unable to perform process injection (AV/EDR/XDR blocking)
- 🔄 Executing golang programs in current process may cause blocking
- 💾 Memory leaks may occur after golang program execution
- ⚠️ Threads created by golang cannot be released!
- ✨ Convert golang programs to shellcode
- 🎯 Direct execution in current process
- ♻️ Automatic memory release after execution
- 🚀 Completely avoid golang-related memory issues
- 🔄 Reclaim all threads created by golang
- Ensure sufficient permissions to read source PE files and write target files
- Compression is recommended when converting large files
- Obfuscation may add some performance overhead but provides better stealth
- Parts of an application (exe) built with mingw | gcc may fail to load, it may be caused by relocation? ( Not implemented )
- DOT NET illegal memory access ( Fixed )
- Advanced encryption options for better security
- GUI interface for easier operation
- Real-time conversion progress monitoring
- Processing of resources in PE
- Enhanced evasion capabilities, such as [ProxyDll, Syscall, ...]
-
2024-12-27
- Support for DOT NET (x64 | x86)
-
2024-12-28
-
Fixed potential DOT NET program crashes (May not occur)
-
Added handling for IMAGE_DIRECTORY_ENTRY_EXCEPTION ( x64 )
-
Updated APIs to use NTAPI
before now VirtualAlloc
NtAllocateVirtualMemory
VirtualProtect
NtProtectVirtualMemory
VirtualFree
NtFreeVirtualMemory
LoadLibrary
LdrLoadDll
GetProcAddress
LdrGetProcedureAddress
WaitForMultipleObjects
NtWaitForMultipleObjects
CreateEvent
NtCreateEvent
CloseHandle
NtClose
SignalObjectAndWait
NtSignalAndWaitForSingleObject
TerminateThread
NtTerminateThread
SuspendThread
NtSuspendThread
OpenThread
NtOpenThread
ResumeThread
NtResumeThread
GetContextThread
NtGetContextThread
SetContextThread
NtSetContextThread
...
-
-
2025-1-1
- Added thread safety for managing thread lists and memory lists
- Fix some functional issues
- Remove parameter processing in payload and change to patch
- Support for upx
- Add architecture check in the payload to check whether the architecture matches
- Some implementations have been changed to provide better compatibility
- We are not planning to release this update for free, we will put it in our paid circle.
- This project continues to be available and free, but may not be updated in the future, thank you!
Clematis converts PE files to shellcode through the following steps:
- Read and parse target PE file
- Process command line arguments (if any)
- Optional LZNT1 compression
- Optional obfuscation processing
- Generate final position-independent shellcode
flowchart TD
A[START] --> B[Read PE file]
B --> C[Parse PE structure]
C --> D{Is there a command line argument?}
D -- TRUE --> E[Process command line arguments]
D -- FALSE --> F{Enable compression?}
E --> F
F -- TRUE --> G[LZNT1 compression]
F -- FALSE --> H{Enable obfuscation?}
G --> H
H -- TRUE --> I[Execute obfuscation processing]
H -- FALSE --> J[Generate shellcode]
I --> J
J --> K[Output result]
K --> L[END]
Issues and Pull Requests are welcome!