Файл: Изучение методов детектирования ВПО, методов противодействия детектированию ВПО и создание программы для анализа эффективности антивирусов, применяющих те или иные подходы к обнаружению угроз.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 30.06.2023

Просмотров: 81

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

return -1;

}

try

{

std::cout << "Creating unpacker source file..." << std::endl;

//Пытаемся открыть файл как 32-битный PE-файл

pe32 image(file, false, false);

//Получаем список секций распаковщика

pe_base::section_list& unpacker_sections = image.get_image_sections();

//Убедимся, что она одна (так как в нем нет импортов, релокаций)

if(unpacker_sections.size() != 1)

{

std::cout << "Incorrect unpacker" << std::endl;

return -1;

}

//Получаем ссылку на данные этой секции

std::string& unpacker_section_data = unpacker_sections.at(0).get_raw_data();

//Удаляем нулевые байты в конце этой секции,

//которые компилятор добавил для выравнивания

pe_base::strip_nullbytes(unpacker_section_data);

//Открываем выходной файл для записи h-файла

//Его имя хранится в argv[2]

std::ofstream output_source(argv[2], std::ios::out | std::ios::trunc);

//Начинаем формировать исходный код

output_source << std::hex << "#pragma once" << std::endl << "unsigned char unpacker_data[] = {";

//Текущая длина считанных данных

unsigned long len = 0;

//Общая длина данных секции

std::string::size_type total_len = unpacker_section_data.length();

//Для каждого байта данных...

for(std::string::const_iterator it = unpacker_section_data.begin(); it != unpacker_section_data.end(); ++it, ++len)

{

//Добавляем необходимые переносы, чтобы

//получившийся код был читаемым

if((len % 16) == 0)

output_source << std::endl;

//Записываем значение байта

output_source

<< "0x" << std::setw(2) << std::setfill('0')

<< static_cast<unsigned long>(static_cast<unsigned char>(*it));

//И, если необходимо, запятую

if(len != total_len - 1)

output_source << ", ";

}

//Конец кода

output_source << " };" << std::endl;

}

catch(const pe_exception& e)

{

//Если по какой-то причине открыть его не удалось

//Выведем текст ошибки и выйдем

std::cout << e.what() << std::endl;

return -1;

}

return 0;

}

Structs.h

#pragma once

#include <Windows.h>

#pragma pack(push, 1)

//Структура, хранящая информацию об упакованной секции

struct packed_section

{

char name[8]; //Имя секции

DWORD virtual_size; //Виртуальный размер

DWORD virtual_address; //Виртуальный адрес (RVA)

DWORD size_of_raw_data; //Размер "сырых" данных

DWORD pointer_to_raw_data; //Файловое смещение сырых данных

DWORD characteristics; //Характеристики секции

};

//Структура, хранящая информацию об упакованном файле

struct packed_file_info

{

BYTE number_of_sections; //Количество секций в оригинальном файле

DWORD size_of_packed_data; //Размер упакованных данных

DWORD size_of_unpacked_data; //Размер оригинальных данных

DWORD total_virtual_size_of_sections; //Полный виртуальный размер всех секций оригинального файла

DWORD original_import_directory_rva; //Относительный адрес оригинальной таблицы импорта

DWORD original_import_directory_size; //Размер оригинальной таблицы импорта

DWORD original_entry_point; //Оригинальная точка входа