Файл: Изучение методов детектирования ВПО, методов противодействия детектированию ВПО и создание программы для анализа эффективности антивирусов, применяющих те или иные подходы к обнаружению угроз.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; //Оригинальная точка входа