·─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.
············································································
Эпиляция в Вышгороде смотрите на
сайте.