Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

вторая_чать_диплома

.pdf
Скачиваний:
8
Добавлен:
19.03.2016
Размер:
1.63 Mб
Скачать

Так, например, во время анализа некоторого исполняемого файла ему будет присвоена характеристика UsePrivilages, в том случае если для его работы ему требуются дополнительные системные привилегии. Стоит отметить, что больше половины существующего вредоносного программного обеспечения нуждается в получении системных привилегий для закрепления своего присутствия в системе и выполнения некоторых деструктивных операций. Технически задача, определения необходимости использования системных привилегий, решается посредством анализа таблицы импорта (или отложенного импорта). В случае если приложение импортирует - OpenProcessToken, LookupPrivilegeValue, AdjustTokenPrivileges из бибилиоткеи avdapi32.dll, анализатор ставит флаг

UsePrivilages у поля entries[UsePrivilages]. Пример подобной реализации можно найти в приложении. Так же любой файл будет помечен флагом

Downloader, который говорит о возможности загрузчик файлов из интернета и их запуска, в случае если буду выполнены условия импорта следующих функций – UrlDownloadToFile && ( ShellExecute || WinExec || CreateProcess || CreateProcessAsUser).

&& - операция логического И.

|| - операция логического ИЛИ.

К категории шпионского программного обеспечения можно отнести небольшие по размеру исполняемые файлы и динамические библиотеки,

использующие набор API функций – SetWindowHook, SetWindowHookEx,

циклические вызовы GetKeyState, GetAsyncKeyState, GetClipboardData.

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

которые занимаются слежением за нажатием клавиш клавиатуры. Так, к

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

61

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

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

Далеко не все решения принимаются только из состояния таблицы импорта. Так, например, файл будет охарактеризован как Infected, после анализа его PE заголовка и основной части файла. Подозрение в таком случае могут быть вызваны наличием исполняемых файлов в оверлее(overlay) анализируемого файла, наличием точки входа (entry point) в

программу, которая расположена в последней секции. Флагом Crypted будет помечен всякий исполняемый файл с нестандартными названиями секций

(upx1, upx2 и т.д.), наличием одной секции и отсутствием остальных,

вымышленными ссылками в таблице импорта. Так будет выглядеть очень подозрительным файл, помеченный как графический, с отсутствием связи с одной из графических библиотек – user32, gdi32. Или же с отсутствием секции ресурсов, в которой хранятся все графические данные (иконки,

курсоры, изображения) для пользовательского интерфейса.

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

примеру, windows или system32 является чем-то очень подозрительным. В

подобных каталогах должны храниться исключительно системные файлы,

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

62

безопасности т.к. вся ответственность в таком случае ложится на фирму,

сертификат которой использовался при подписи файла.

Решение принимается, согласно текущей конфигурации и политики эвристического анализатора, путѐм просмотра массива характеристик entries

структуры HEUR_FILE_DESCR.

S = 1N . [ ], i

1,

(1)

P =

 

 

 

(2)

 

 

 

 

 

N – общий размер массива характеристик.

S – количество характеристик.

P – вероятность, описывающая степень опасности, исследуемого файла.

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

случае автоматического принятия решения:

1)Пассивный, P (0,45; 1];

2)Активный, P 0,2; 0,45 ;

3)Агрессивный, P (0; 0,2].

63

Заключение

В рамках данной работы было разработано приложение по обнаружению и удалению скрытых вредоносных программ. В ходе работы были решены следующие задачи:

1.Сканирования критических участков операционной системы,

обнаружение подозрительной активности;

2.Безопасное удаление обнаруженных угроз;

3.Возможность отката системы к предыдущим состояниям;

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

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

64

Список использованных источников

1. Шевченко А. Эволюция руткитов / А.Шевченко –

(http://www.securelist.com/ru/analysis/204007620/Evolyutsiya_rutkitov) 2. Кушнер Д. The real story of Stuxnet / Д. Кушнер –

(http://www.spectrum.ieee.org/telecom/security/the-real-story-of-stuxnet)

3. Хоглунд Г. Руткиты: внедрение в ядро Windows / Г. Хоглунд,

Д.Батлер - СПб.: Питер, 2007. -284 с.

4. Зайцев О.В. Rootkits, SpyWare AdWare, Keyloggers & BackDoors.

Обнаружение и защита / О.В. Зайцев – СПб.: БХВ-Петербург, 2006. -304 с.

5. Касперский Е.В. Компьютерное zловредство / Е.В. Касперский – СПб.: Питер, 2007. -208 с.

6. Рихтер Д. Windows для профессионалов. Создание эффективных

Win32-пpилoжeний с учетом специфики 64-разрядной версии Windows /

Д.Рихтер - СПб.: Питер, 2001. -752 с.

7. Касперски К. Записки исследователя компьютерных вирусов /

К.Касперски – СПб.: Питер, 2006. -526 с.

8. Руссинович М. Внутреннее устройство Microsoft Windows /

М.Руссинович, Д.Соломон – СПб.: Питер, 2013. -800 с.

9.Шрайбер С. Недокументированные возможности Windows 2000 / C.Шрайбер – СПб.: Питер, 2002. -544 с.

10.Питрек М. Формат PE файлов / М.Питрек - (http://www.rsdn.ru/article/baseserv/pe_coff.xml)

11.Шлее М. Qt 4.5. Профессиональное программирование на C++ /

М.Шлее – СПб.: БХВ-Петербург, 2012. -896 с.

12. Нарвахо Р. Таблицы импорта PE файлов / Р.Нарвахо- (http://win32assembly.programminghorizon.com/pe-tut6.html)

65

Приложение 1. Отчѐт работы AVZ

1. Поиск RootKit и программ, перехватывающих функции API

1.1 Поиск перехватчиков API, работающих в UserMode

Анализ kernel32.dll, таблица экспорта найдена в секции .text

Детектирована модификация IAT: LoadLibraryA - 100013E0<>7C801D7B

Адрес в IAT восстановлен: LoadLibraryA

Детектирована модификация IAT: GetProcAddress - 10001390<>7C80AE40

Адрес в IAT восстановлен: GetProcAddress

1.2 Поиск перехватчиков API, работающих в KernelMode

Драйвер успешно загружен

SDT найдена (RVA=0833A0)

Ядро ntoskrnl.exe обнаружено в памяти по адресу 804D7000

SDT = 8055A3A0, KiST = 804E2620 (284)

Функция NtQuerySystemInformation (AD) перехвачена (8057F473-

>F77CB000), перехватчик c:\rtkspy.sys

>>> Функция воcстановлена успешно!

>>> Код перехватчика нейтрализован

1.3Проверка IDT и SYSENTER CmpCallCallBacks = 0013AE52

Disable callback - уже нейтирализованы Проверка IDT и SYSENTER завершена

1.4Поиск маскировки процессов и драйверов

Проверка не производится, так как не установлен драйвер мониторинга

AVZPM

1.5 Проверка обработчиков IRP

Драйвер успешно загружен

2. Проверка памяти Количество найденных процессов: 20, загруженных модулей: 241

Анализатор - изучается процесс 1012 C:\rootkit.exe 3. Сканирование дисков

66

4. Проверка Winsock Layered Service Provider (SPI/LSP)

Настройки LSP проверены. Ошибок не обнаружено

5. Поиск перехватчиков событий клавиатуры/мыши/окон (Keylogger,

троянские DLL)

c:\syshklobj.dll --> Подозрение на Keylogger или троянскую DLL c:\syshklobj.dll >>> Поведенческий анализ

Типичное для кейлоггеров поведение не зарегистрировано

6.Поиск открытых портов TCP/UDP, используемых вредоносными программами

На данном ПК открыто 3 TCP портов и 9 UDP портов Проверка завершена, подозрительные порты не обнаружены

7.Эвристичеcкая проверка системы

Проверка завершена

8. Поиск потенциальных уязвимостей

>>Службы: разрешена потенциально опасная служба TermService (Службы терминалов)

>>Службы: разрешена потенциально опасная служба SSDPSRV (Служба обнаружения SSDP)

>>Службы: разрешена потенциально опасная служба Schedule

(Планировщик заданий)

>>Службы: разрешена потенциально опасная служба RDSessMgr (Диспетчер сеанса справки для удаленного рабочего стола)

> Службы: обратите внимание - набор применяемых на ПК служб зависит от области применения ПК (домашний, ПК в ЛВС компании ...)!

>>Безопасность: разрешен автозапуск программ с CDROM

>>Безопасность: разрешен административный доступ к локальным дискам

(C$, D$ ...)

>>Безопасность: к ПК разрешен доступ анонимного пользователя

>>Безопасность: Разрешена отправка приглашений удаленному помощнику

67

Приложение 2. Листинг шаблонной функции GetDataBlock

template<class T_container, class T_received> bool GetDataBlock(__in DWORD requestCode, __out T_container & container)

{

bool request_result = false; CL0_REQUEST request; request.bodysize = 0;

CL0_REQUEST response = sendRequest(requestCode,

&request, &request, sizeof(CL0_REQUEST));

if((response.error == CL0_SUCCESS) && (response.result == 0)) return true;

else if (response.error != CL0_BUFFER_TOO_SMALL) return false;

DWORD respSize = sizeof(CL0_REQUEST) + response.result; PVOID pCl0Response = Memory::getmem(respSize); request.bodysize = response.result;

response = sendRequest(requestCode, &request, pCl0Response, respSize);

request_result = (response.error == CL0_SUCCESS);

if(request_result){

T_received* pEntry = (T_received*) ((PCHAR)pCl0Response + sizeof(CL0_REQUEST));

ulong count = response.result / sizeof(T_received); for(int i=0; i<count; ++i, ++pEntry)

container.push_back(*pEntry);

}

Memory::freemem(pCl0Response); return request_result;

}

68

Приложение 3. Листинг методов обнаружения скрытых модулей

PVOID System::MmImageBase(__in DWORD pid, __in const PVOID p)

{

PVOID pBaseRegion = 0, pImageBase = NULL; HANDLE proc = INVALID_HANDLE_VALUE; MEMORY_BASIC_INFORMATION meminf;

proc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

if(proc != INVALID_HANDLE_VALUE){

while(VirtualQueryEx(proc, pBaseRegion, &meminf,sizeof(meminf))){ if(meminf.Type == MEM_IMAGE){

if(meminf.BaseAddress <= p && (PBYTE)p <=

((PBYTE)meminf.BaseAddress+meminf.RegionSize)){ pImageBase = meminf.AllocationBase; break;

}

}

pBaseRegion =((PBYTE)pBaseRegion + meminf.RegionSize);

}

CloseHandle(proc);

}

return pImageBase;

}

PVOID System::MmGetModuleName(__in DWORD pid, __in PVOID pAddr, __out char* pBuf, __in DWORD dwBuf_size)

{

PVOID pLoadTo = MmImageBase(pid, pAddr);

if(pLoadTo){

HANDLE proc = INVALID_HANDLE_VALUE;

proc = OpenProcess(PROCESS_ALL_ACCESS, false, pid); if(proc != INVALID_HANDLE_VALUE){

if(!GetMappedFileNameA(proc, pLoadTo, pBuf, dwBuf_size)) pLoadTo = NULL;

CloseHandle(proc);

}

}

return pLoadTo;

}

69

Приложение 4. Пример реализации эвристического анализатора

BOOL LookupImpFn(__in const PeFile* peFile, __in const char* szLib, __in const char* szFnName)

{

ulong m_length = 0;

PIMPORT_LIB plib = peFile->GetImport(&m_length); int libName_length = CBase::kstrlen(szLib);

int fnName_length = CBase::kstrlen(szFnName);

// Enumerate imported libs

for(ulong i = 0; i<m_length; i++, plib++){ if(plib->szLib && (strnicmp(plib->szLib,

szLib, libName_length) == 0)){ for(PIMPORT_FN pfn = plib->functions;

pfn != NULL; pfn = pfn->next){ if(!pfn->Ordinal && pfn->ApiName){

if(_strnicmp(pfn->ApiName, szFnName, fnName_length) == 0){

return TRUE;

}

}

}

}

}

return FALSE;

}

u_short LookupDownloading(const PeFile* peFile)

{

u_short downloading = 0, execfunc = 0, creating = 0;

downloading = LookupImpFn(peFile, URLMON_DLL, Txt_UrlDownloadToFile); execfunc = LookupImpFn(peFile, SHELL_DLL, Txt_ShellExecute) ||

LookupImpFn(peFile, KERNEL_DLL, Txt_WinExec) || LookupImpFn(peFile, KERNEL_DLL, Txt_CreateProcess) || LookupImpFn(peFile, ADVAPI_DLL, Txt_CreateProcessAsUser);

return downloading && execfunc;

}

u_short LookupUsingPrivilages(const PeFile* peFile)

{

u_short sys_privilages = LookupImpFn(peFile,

ADVAPI_DLL, Txt_AdjustTokenPrivileges) && LookupImpFn(peFile, ADVAPI_DLL, Txt_OpenProcessToken) && LookupImpFn(peFile, ADVAPI_DLL, Txt_LookupPrivilegeValue);

return sys_privilages;

}

Void HeurGetDescription(__out PHEUR_FILE_DESCR pDescr, const PeFile* peFile)

{

pDescr->entries[Infected] = LookupInfected(peFile); pDescr->entries[Downloader] = LookupDownloading(peFile); pDescr->entries[UsePrivilages] = LookupUsingPrivilages(peFile); // ...

pDescr->entries[NoDigitalSign] = LookupDgtSign(peFile);

}

70