"# vmk_spring2017"
Задача по курсу "Методы исследования программного обеспечени":
Необходимо выполнить разбор файла и написать в какой секции располагается точка входа. Вывод должен быть в следующем формате
Где смещение в процентах вычисляется относительно размера секции. Например, если секция имеет размер 1000, а точка входа располагается по смещению 400 в ней, то необходимо вывести 40 %.
Все используемые структуры можно посмотреть в заголовочном файле WinNT.h (он уже подключен, так как указан в Windows.h). Например вам могут потребоваться следующие структуры: IMAGE_DOS_HEADER заголовок, который используется в системе DOS (сейчас вам в нем потребуется только поле e_lfanew (что оно означает?) IMAGE_NT_HEADERS заголовок нового формата исполняемого файла (PE), используемого в Windows NT IMAGE_FILE_HEADER один из двух заголовков, из которых состоит IMAGE_NT_HEADER, содержит NumberOfSections IMAGE_OPTIONAL_HEADER второй заголовок IMAGE_NT_HEADER, содержит важные для нас поля ImageBase и AddressOfEntryPoint IMAGE_SECTION_HEADER заголовок секции, в нем содержится название, размер и расположение секции
Не забывайте проверять такие поля как сигнатуры файлов (ведь надо убедиться, что разбираем собственно исполняемый файл)
Необходимо изменить точку входа в программу (AddressOfEntryPoint). Поддерживаются только 32-разрядные файлы (или можете написать свой код точки входа для 64-разрядных) Варианты размещения новой точки входа - в каверне имеющихся секций, в расширеннной области секций или в новой секции. Подробнее: Каверна секции - это разница между SizeOfRawData и VirtualSize. Так как секция хранится на диске с выравниванием FileAlignment (обычно по размеру сектора, 0x200 байт), а в VirtualSize указан точный размер секции в памяти, то получается, что на диске хранится лишних ( SizeOfRawData - VirtualSize ) байт. Их можно использовать. Расширенная область секции - так как в памяти секции выравниваются по значению SectionAlignment (обычно по размеру страницы, 0x1000), то следующая секция начинается с нового SectionAlignment. Например, если SectionAlignment равен 0x1000, а секция занимает всего 0x680 байт, то в памяти будет находится еще 0x980 нулевых байт. То есть секцию можно расширить (как в памяти, так и на диске) и записать в нее данные. Новая секция - вы можете создать новую секцию (если места для еще одного заголовка секции достаточно) Легче всего добавить последнюю секцию. Необходимо помнить о всех сопутствующих добавлению новой секции изменениях: заголовок секции, атрибуты секции, поле NumberOfSections в IMAGE_FILE_HEADER и т.д. После выбора места для размещения необходимо получить код для записи в файл. Для этого можно воспользоваться функцией GetEntryPointCodeSmall. Она возвращает структуру ENTRY_POINT_CODE, ее описание находится в заголовочном файле. Необходимо проверить, что код был успешно сгенерирован. После чего записать новую точку входа в выбранное место. После этого вызвать функцию WriteFileFromBuffer. Имя файла