·─T─┌O┐─T─┌A┐L···─Z┐┌0┐┌M┐┌B·i┌F─i┌C─┌A┐─T─i┌O┐┬N┬··························
   │ │ │ │ ├─┤│    / │ ││││├┴┐┬├─ ┬│  ├─┤ │ ┬│ ││└┤  Issue #1, January-2001
 ··│·└─┘·│·│·│└─··└──└─┘│·│└─┘││··│└──│·│·│·│└─┘│·│··························

 ············································································
                       ГЕНЕРАТОР МУСОРНЫХ ИНСТРУКЦИЙ             [etg200.zip]
 ············································································

     Представляю вам улучшенную версию движка для генератора мусора. Движок
 ETG  2.00  позволяет задавать специфические свойства генерируемого мусора:
 используемые команды, набор регистров-источников и регистров-приемников.

 Команды:
   MOV, MOVSX/ZX, XCHG, LEA, ADD/ADC/AND/OR/SUB/SBB/XOR/CMP, INC/DEC,NOT/NEG,
   TEST, IMUL, ROL/ROR/RCL/RCR/SHL/SAL/SHR/SAR, SHLD/SHRD, BSWAP, XADD, JMP,
   SEG(6), BSF/BSR, BT/BTC/BTR/BTS, REPZ/NZ

 Регистры:
   EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
   (8/16-битные регистры рассматриваются как части соответствующих 32-битных)

 Для генерации порции мусора движок вызывается так:

    include ETG.INC

    push    offset my_random ; рандомер, передается движку
    push    offset obuf      ; выходной буфер
    push    size obuf        ; максимальный размер выходного буфера
    push    10               ; число команд для генерации
    push    offset buf_size  ; указатель на дворд, принимающий длину буфера
    push    REG_EAX+REG_EBX  ; набор регистров-приемников [REG_xxx]
    push    REG_ECX+REG_EDX  ; набор регистров-источников [REG_xxx]
    push    ETG_ALL-ETG_JMPS ; набор возможных команд [ETG_xxx]
    push    user_param       ; юзерский параметр, передается в рандомер
    call    etg_engine
    add     esp, 4*9

     В результате работы движка буфер заполнен мусором требуемых свойств.

     В   приведенном   примере   --   это   любые  команды  кроме  ETG_JMP,
 модифицируемые  регистры  EAX и EBX, чтение -- только из ECX/EDX. Заметим,
 что такой буфер -- суть 64-битная хэш-функция от 64-битного аргумента.

     Как  видно, движку необходим внешний рандомер. Сделано так потому, что
 одним/двумя  движками  дело  не  ограничивается,  а  в  вирусе хотелось бы
 держать  только  один  рандомер. Ведь движки хочется компилять отдельно, и
 передавать вирусу уже в скомпилированном (DB n,n,n...) виде.

     Пример рандомера:

                push    100             ; range
                push    12345678h       ; user-param
                call    my_random
                add     esp, 8
                ; eax=0..99

; DWORD cdecl my_random(DWORD userparam, DWORD range)

my_random:
    ; [esp+4] = user_param
    ; [esp+8] = range
    mov     eax, randseed
    imul    eax, 214013
    add     eax, 2531011
    mov     randseed, eax
    mov     ecx, [esp+8]
    shr     eax, 16
    imul    eax, ecx
    shr     eax, 16
    retn

     Для  чего  конкретно  можно  использовать  ETG?  Для разбавления неких
 осмысленных  команд  (декриптора)  мусором.  Так  например  было сделано в
 движке EXPO.

 ············································································




Эпиляция в Вышгороде смотрите на сайте.