вторая_чать_диплома
.pdfТак, например, во время анализа некоторого исполняемого файла ему будет присвоена характеристика 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