Skip to content

Wunder9l/vmk_spring2017

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

"# vmk_spring2017"

Задача по курсу "Методы исследования программного обеспечени":

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

Entry point (<значение точки входа>)

In section <индекс секции>, <название секции>

Offset in section <смещение относительно начала секции>, <смещение в процентах> %

Где смещение в процентах вычисляется относительно размера секции. Например, если секция имеет размер 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. Имя файла

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published